test: exercise real boundaries and trim redundant cases (#32353)

* test: replace redundant checks with observed behavior

* docs: reconcile completed audit batches and upstream review

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
This commit is contained in:
OrcaWin
2026-10-23 04:32:31 -07:00
committed by GitHub
co-authored by OrcaWin
parent 09b4648282
commit 8f6283b32b
96 changed files with 3288 additions and 1962 deletions
@@ -137,7 +137,7 @@ runners; only the compare-and-swap algorithm is shared with the fence broker.
## Duplication
This directory is copied verbatim into `stablyai/orca`. It has no `package.json`, no
`node_modules`, and imports nothing outside itself — `action-contract.test.mjs` enforces all three.
`node_modules`, and imports nothing outside itself. Keep it self-contained when updating the action.
Cross-repo consumption via `uses: stablyai/orca/.github/actions/...@<sha>` was rejected: it would
put public-repo code inside private app deploys that hold a production credential, and neither
repository protects `main` today.
@@ -1,11 +1,9 @@
import assert from 'node:assert/strict'
import { readFileSync, readdirSync } from 'node:fs'
import { readFileSync } from 'node:fs'
import { test } from 'node:test'
const here = new URL('./', import.meta.url)
const action = readFileSync(new URL('action.yml', here), 'utf8')
const modules = readdirSync(here).filter((name) => name.endsWith('.mjs'))
const shipped = modules.filter((name) => !name.endsWith('.test.mjs'))
test('is a node24 JavaScript action with an always-run post step', () => {
// A composite action has no `post:`, so the lease could never be released on cancel or failure.
@@ -23,30 +21,3 @@ test('declares the inputs the wave-chain callers depend on', () => {
assert.match(action, /default: \$\{\{ github\.repository \}\}\/\$\{\{ github\.run_id \}\}/)
assert.match(action, /default: 'true'/)
})
test('stays self-contained so it can be duplicated into the public repo', () => {
assert.deepEqual(
readdirSync(here).filter((name) => name === 'package.json' || name === 'node_modules'),
[],
'the action must run with zero installed dependencies'
)
for (const name of modules) {
const source = readFileSync(new URL(name, here), 'utf8')
for (const match of source.matchAll(/^import\b[\s\S]*?from '([^']+)'/gm)) {
const specifier = match[1]
const local = specifier.startsWith('.')
assert.ok(
specifier.startsWith('node:') || (local && !specifier.includes('..')),
`${name} imports ${specifier}; only node: builtins and same-directory modules are allowed`
)
}
}
})
test('never reaches for the GCE metadata server', () => {
// Runners have no metadata.google.internal; the fence broker's token path must not be copied.
for (const name of shipped) {
const source = readFileSync(new URL(name, here), 'utf8')
assert.doesNotMatch(source, /metadata\.google\.internal/, name)
}
})
+1 -13
View File
@@ -353,19 +353,7 @@ describe('cell seat feed', () => {
flagsApplied: applied,
// Not reserve mode, so db whatever the switch says.
phonePathEffective: 'db',
databasePoolMax: expect.any(Number),
// What the flag tool checks a write against before it writes.
supportedFlags: {
readinessLocal: { type: 'boolean' },
ticketCheck: { type: 'enum', values: ['off', 'shadow'] },
rejectionFence: { type: 'boolean' },
readTimeoutMarginMs: { type: 'number', min: 1_000, max: 60_000, integer: true },
admitMode: { type: 'enum', values: ['db', 'reserve'] },
intakePerSec: { type: 'number', max: 1_000 },
reserveDryRun: { type: 'boolean' },
reregisterInFlight: { type: 'number', min: 1, max: 16, integer: true },
phonePath: { type: 'enum', values: ['db', 'memory'] }
}
databasePoolMax: expect.any(Number)
})
})
@@ -1,4 +1,4 @@
import { beforeEach, describe, expect, it } from 'vitest'
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import type { RelayCellConfig } from './config.js'
import { RelayAssignmentStore } from './assignment-store.js'
import {
@@ -70,6 +70,10 @@ describe('control accept cell-row lock span', () => {
assignmentEpoch = (await store.assign(host)).assignmentEpoch
})
afterEach(async () => {
await recorder?.close()
})
async function accept(generation: number): Promise<string> {
recorder.statements.length = 0
return await store.activateControl(host, {
@@ -127,13 +131,6 @@ describe('control accept cell-row lock span', () => {
expect(await cellLeaseUnits()).toBe(1)
})
it('keeps the reservation equal to the cell lease units across repeated rebinds', async () => {
for (const generation of [1, 2, 3, 4, 5]) await accept(generation)
expect(await reservedRequests()).toBe(await cellLeaseUnits())
expect(await reservedRequests()).toBe(1)
})
it('still refuses an accept that would exceed the cell capacity', async () => {
const control = await accept(1)
await store.assign(second)
@@ -132,53 +132,63 @@ describePostgres('PostgreSQL control rebind under a held cell row', () => {
inventoryHeld()
await inventoryReleased
})
await inventoryHeldPromise
let deadline: ReturnType<typeof setTimeout> | undefined
let reboundWork: Promise<string> | undefined
try {
await inventoryHeldPromise
// A generation-2 rebind on cell A supersedes generation 1. It must not
// wait on cell B's row.
const startedAt = Date.now()
const blockedStatement = async (): Promise<string> => {
const rows = await databases[1]!.query(
`SELECT left(query, 160) AS q FROM pg_stat_activity
// A generation-2 rebind on cell A supersedes generation 1. It must not
// wait on cell B's row.
const startedAt = Date.now()
const blockedStatement = async (): Promise<string> => {
const rows = await databases[1]!.query(
`SELECT left(query, 160) AS q FROM pg_stat_activity
WHERE datname = current_database() AND wait_event_type = 'Lock'`
)
return rows.map((row) => String(row.q)).join(' | ')
}
const timeout = new Promise<never>((_, reject) =>
setTimeout(
() =>
void blockedStatement().then((statement) =>
reject(new Error(`rebind on cell A blocked behind cell B's row: ${statement}`))
),
2_000
)
)
const rebound = await Promise.race([
store.activateControl(identity, {
)
return rows.map((row) => String(row.q)).join(' | ')
}
const timeout = new Promise<never>((_, reject) => {
deadline = setTimeout(
() =>
void blockedStatement()
.then((statement) =>
reject(new Error(`rebind on cell A blocked behind cell B's row: ${statement}`))
)
.catch(reject),
2_000
)
})
reboundWork = store.activateControl(identity, {
cellId: cells[0]!.id,
assignmentEpoch: assignment.assignmentEpoch,
generation: 2,
connectionInclusionWatermark: 11
}),
timeout
])
const elapsedMs = Date.now() - startedAt
releaseInventory()
await holder
})
const rebound = await Promise.race([reboundWork, timeout])
const elapsedMs = Date.now() - startedAt
expect(rebound).toBe(`control:${cells[0]!.id}:2`)
expect(elapsedMs).toBeLessThan(2_000)
const controls = await databases[0]!.query(
`SELECT activity_id FROM relay_assignment_activity_leases
expect(rebound).toBe(`control:${cells[0]!.id}:2`)
expect(elapsedMs).toBeLessThan(2_000)
const controls = await databases[0]!.query(
`SELECT activity_id FROM relay_assignment_activity_leases
WHERE user_id = ? AND activity_kind = 'control' ORDER BY activity_id`,
[identity.userId]
)
expect(controls).toEqual([{ activity_id: `control:${cells[0]!.id}:2` }])
const reserved = await databases[0]!.query(
`SELECT reserved_requests FROM relay_cells WHERE cell_id = ?`,
[cells[0]!.id]
)
expect(Number(reserved[0]!.reserved_requests)).toBe(1)
[identity.userId]
)
expect(controls).toEqual([{ activity_id: `control:${cells[0]!.id}:2` }])
const reserved = await databases[0]!.query(
`SELECT reserved_requests FROM relay_cells WHERE cell_id = ?`,
[cells[0]!.id]
)
expect(Number(reserved[0]!.reserved_requests)).toBe(1)
} finally {
clearTimeout(deadline)
releaseInventory()
try {
await holder
} finally {
await Promise.allSettled(reboundWork ? [reboundWork] : [])
}
}
}, 15_000)
// Why: a phone's activity id is client-chosen and can follow the host across
@@ -187,7 +197,7 @@ describePostgres('PostgreSQL control rebind under a held cell row', () => {
// placement's ascending inventory lock (reproduced live before this fix).
it('moves an activity from a higher cell to a lower one in cell_id order', async () => {
await removeTestRows(databases[0]!)
const [cellA, cellB, cellC] = cells as [typeof cells[0], typeof cells[0], typeof cells[0]]
const [cellA, cellB, cellC] = cells as [(typeof cells)[0], (typeof cells)[0], (typeof cells)[0]]
const store = new RelayAssignmentStore(databases[0]!, () => 100)
await store.reconcileCells(cells)
for (const cell of cells) await store.recordCellHeartbeat(heartbeat(cell))
@@ -203,6 +213,12 @@ describePostgres('PostgreSQL control rebind under a held cell row', () => {
const migration = await store.startEvacuation(identity, cellB.id)
expect(migration.targetCellId).toBe(cellB.id)
const movingDatabase = await openRelayDatabase({
databaseUrl,
dataDir: '',
applicationName: 'orca-relay/cloud3-rebind-move'
})
const moveStore = new RelayAssignmentStore(movingDatabase, () => 100)
// Hold B elsewhere. An ordered move locks B first and queues here holding
// nothing else. Locking C first (the old lease's row, as an unordered move
// does) or the whole inventory (which takes A) shows up as a held row.
@@ -230,17 +246,46 @@ describePostgres('PostgreSQL control rebind under a held cell row', () => {
}
})
await rowHeldPromise
const move = store.acquireActivity(identity, { activityId, kind: 'splice', cellId: cellB.id })
const move = moveStore.acquireActivity(identity, {
activityId,
kind: 'splice',
cellId: cellB.id
})
let moved = false
void move.then(() => {
const observedMove = move.then(() => {
moved = true
})
await new Promise((resolve) => setTimeout(resolve, 250))
expect(moved).toBe(false)
releaseRow()
await holder
await move
expect(heldWhileMoverWaits).toEqual([])
try {
await expect
.poll(
async () => {
const rows = await databases[0]!.query(
`SELECT count(*) AS waiting FROM pg_stat_activity
WHERE datname = current_database() AND application_name = ? AND wait_event_type = 'Lock'`,
['orca-relay/cloud3-rebind-move']
)
return Number(rows[0]!.waiting)
},
{ timeout: 2_000, interval: 10 }
)
.toBe(1)
expect(moved).toBe(false)
releaseRow()
await holder
await observedMove
expect(heldWhileMoverWaits).toEqual([])
} finally {
releaseRow()
try {
await holder
} finally {
try {
await observedMove
} finally {
await movingDatabase.close()
}
}
}
const reservations = await databases[0]!.query(
`SELECT cell_id, reserved_requests FROM relay_cells
@@ -1,7 +1,6 @@
import { ASSIGNMENT_LIMITS } from '@orca-cloud/relay-contract'
import { describe, expect, it, vi } from 'vitest'
import { RelayAssignmentStore } from './assignment-store.js'
import { CONTROL_RENEWAL_BATCH_SQL } from './control-renewal-statement.js'
import type { ControlRenewalOutcome } from './control-renewal-statement.js'
import {
openInMemoryRelayDatabase,
@@ -70,7 +69,6 @@ describe('batched control renewals on PostgreSQL', () => {
expect(outcomes).toEqual(['renewed', 'renewed', 'renewed'])
expect(probe.statements).toHaveLength(1)
expect(probe.statements[0]!.sql).toBe(CONTROL_RENEWAL_BATCH_SQL)
expect(probe.statements[0]!.params[0]).toEqual(['user-a', 'user-a', 'user-b'])
expect(probe.statements[0]!.params[4]).toEqual([expiresAt, expiresAt, expiresAt])
})
@@ -213,29 +211,12 @@ describe('batched control renewals on PostgreSQL', () => {
renewal('user-a', 'host000000000002')
])
expect(outcomes.filter((outcome) => outcome === 'renewed')).toHaveLength(1)
expect(outcomes.filter((outcome) => outcome === 'database_error')).toHaveLength(1)
expect(outcomes).toEqual(['database_error', 'renewed'])
} finally {
warn.mockRestore()
}
})
it('reports a contended assignment row apart from a missing one', async () => {
const probe = new RenewalStatementProbe((userId) =>
userId === 'user-b' ? 'assignment_lock_unavailable' : 'renewed'
)
const store = new RelayAssignmentStore(probe, () => now)
const outcomes = await store.renewControlActivities([
renewal('user-a', 'host000000000001'),
renewal('user-b', 'host000000000002')
])
// Retryable: SKIP LOCKED passed over the row rather than queueing the whole
// flush behind whoever held it.
expect(outcomes).toEqual(['renewed', 'assignment_lock_unavailable'])
})
it('counts a lone renewal that threw before rethrowing it', async () => {
const probe = new RenewalStatementProbe(() => 'renewed')
probe.failuresRemaining = 1
@@ -270,7 +251,7 @@ describe('batched control renewals on PostgreSQL', () => {
])
})
it('counts one renewal metric per row against the flush latency', async () => {
it('counts one renewal outcome metric per row', async () => {
const probe = new RenewalStatementProbe((userId) =>
userId === 'user-b' ? 'assignment_not_found' : 'renewed'
)
@@ -184,6 +184,7 @@ describePostgres('PostgreSQL control renewal', () => {
await probe.stalled.promise
const expiresAt = now + 105_000
let deadline: ReturnType<typeof setTimeout> | undefined
try {
await Promise.race([
store.renewControlActivity(identity, {
@@ -191,9 +192,9 @@ describePostgres('PostgreSQL control renewal', () => {
cellId: sourceCell.id,
expiresAt
}),
new Promise<never>((_resolve, reject) =>
setTimeout(() => reject(new Error('renewal_waited_for_identity_queue')), 2_000)
)
new Promise<never>((_resolve, reject) => {
deadline = setTimeout(() => reject(new Error('renewal_waited_for_identity_queue')), 2_000)
})
])
const row = (
await database.query(
@@ -204,6 +205,7 @@ describePostgres('PostgreSQL control renewal', () => {
)[0]
expect(Number(row!.expires_at)).toBe(expiresAt)
} finally {
clearTimeout(deadline)
probe.continue.resolve()
await queued
}
@@ -412,33 +414,36 @@ describePostgres('PostgreSQL control renewal', () => {
locked.resolve()
await release.promise
})
await locked.promise
try {
await locked.promise
const startedAt = performance.now()
const outcomes = await store.renewControlActivities(
[held, free].map((identity) => ({
identity,
activityId: controlId(sourceCell.id),
cellId: sourceCell.id,
expiresAt
}))
)
const elapsedMs = performance.now() - startedAt
release.resolve()
await holder
expect(outcomes).toEqual(['assignment_lock_unavailable', 'renewed'])
// It skipped rather than queued: a blocking FOR UPDATE would have spent the
// pool's whole lock_timeout here and failed the free host too.
expect(elapsedMs).toBeLessThan(POSTGRES_LOCK_TIMEOUT_MS)
const lease = (
await database.query(
`SELECT expires_at FROM relay_assignment_activity_leases
WHERE user_id = ? AND relay_host_id = ? AND activity_id = ?`,
[free.userId, free.relayHostId, controlId(sourceCell.id)]
const startedAt = performance.now()
const outcomes = await store.renewControlActivities(
[held, free].map((identity) => ({
identity,
activityId: controlId(sourceCell.id),
cellId: sourceCell.id,
expiresAt
}))
)
)[0]
expect(Number(lease!.expires_at)).toBe(expiresAt)
const elapsedMs = performance.now() - startedAt
expect(outcomes).toEqual(['assignment_lock_unavailable', 'renewed'])
// It skipped rather than queued: a blocking FOR UPDATE would have spent the
// pool's whole lock_timeout here and failed the free host too.
expect(elapsedMs).toBeLessThan(POSTGRES_LOCK_TIMEOUT_MS)
const lease = (
await database.query(
`SELECT expires_at FROM relay_assignment_activity_leases
WHERE user_id = ? AND relay_host_id = ? AND activity_id = ?`,
[free.userId, free.relayHostId, controlId(sourceCell.id)]
)
)[0]
expect(Number(lease!.expires_at)).toBe(expiresAt)
} finally {
release.resolve()
await holder
}
})
it('renews both of one host\u2019s control leases in a single batch', async () => {
@@ -89,6 +89,28 @@ describePostgres('credential cleanup against PostgreSQL', () => {
}
}
async function cleanupPlan(prefix: string, occurrence = 0): Promise<string> {
const statements: { sql: string; params: unknown[] }[] = []
const probe: RelayDatabase = {
dialect: 'postgres',
query: async (sql, params = []) => {
statements.push({ sql, params })
return []
},
queryLocked: async () => {
throw new Error('unexpected cleanup lock')
},
transaction: async (operation) => await operation(probe),
close: async () => undefined
}
await new RelayCredentialStore(probe, () => NOW).cleanup()
const statement = statements.filter((item) => item.sql.startsWith(prefix))[occurrence]
if (!statement) {
throw new Error(`missing production cleanup statement: ${prefix}`)
}
return await plan(statement.sql, statement.params)
}
it('plans both invite sweeps as index scans instead of scanning the whole table', async () => {
// Production's shape: terminal invites outnumber live ones by orders of magnitude, which is
// what makes the partial predicates worth having.
@@ -104,16 +126,8 @@ describePostgres('credential cleanup against PostgreSQL', () => {
// a seq scan wins on any index.
await database.query(`ANALYZE relay_invites`)
const expiry = await plan(
`UPDATE relay_invites SET state = 'expired'
WHERE expires_at <= ? AND state IN ('available', 'reserved', 'cooldown')`,
[NOW]
)
const reservation = await plan(
`UPDATE relay_invites SET state = 'cooldown'
WHERE state = 'reserved' AND reservation_expires_at <= ? AND expires_at > ?`,
[NOW, NOW]
)
const expiry = await cleanupPlan('UPDATE relay_invites', 0)
const reservation = await cleanupPlan('UPDATE relay_invites', 1)
// Which of the two partial indexes serves the reservation pass is the planner's call: both
// predicates hold only live invites, so either one reads a handful of rows. The invariant is
@@ -148,10 +162,7 @@ describePostgres('credential cleanup against PostgreSQL', () => {
)
await database.query(`ANALYZE relay_connection_bases`)
const sweep = await plan(
`UPDATE relay_connection_bases SET active = 0 WHERE active = 1 AND deadline <= ?`,
[NOW]
)
const sweep = await cleanupPlan('UPDATE relay_connection_bases')
expect(sweep).not.toContain('Seq Scan on relay_connection_bases')
expect(sweep).toContain('using relay_connection_bases_active_deadline')
@@ -173,12 +184,7 @@ describePostgres('credential cleanup against PostgreSQL', () => {
)
await database.query(`ANALYZE relay_connection_bases`)
const reaper = await plan(
`DELETE FROM relay_connection_bases WHERE ctid = ANY(ARRAY(
SELECT ctid FROM relay_connection_bases WHERE active = ? AND deadline <= ? LIMIT 5000
))`,
[0, NOW - DAY_MS]
)
const reaper = await cleanupPlan('DELETE FROM relay_connection_bases')
expect(reaper).toContain('relay_connection_bases_active_deadline')
expect(reaper).not.toContain('Seq Scan on relay_connection_bases')
@@ -201,14 +207,8 @@ describePostgres('credential cleanup against PostgreSQL', () => {
await database.query(`ANALYZE relay_direct_authorizations`)
await database.query(`ANALYZE relay_rate_windows`)
const pending = await plan(
`UPDATE relay_direct_authorizations SET consumed_at = ?
WHERE consumed_at IS NULL AND deadline <= ?`,
[NOW, NOW]
)
const windows = await plan(`DELETE FROM relay_rate_windows WHERE window_started_at < ?`, [
NOW - DAY_MS
])
const pending = await cleanupPlan('UPDATE relay_direct_authorizations')
const windows = await cleanupPlan('DELETE FROM relay_rate_windows')
expect(pending).toContain('relay_direct_authorizations_pending_deadline')
expect(pending).not.toContain('Seq Scan on relay_direct_authorizations')
@@ -296,12 +296,7 @@ describePostgres('credential cleanup against PostgreSQL', () => {
)
await database.query(`ANALYZE relay_audit_events`)
const reaper = await plan(
`DELETE FROM relay_audit_events WHERE ctid = ANY(ARRAY(
SELECT ctid FROM relay_audit_events WHERE at <= ? ORDER BY at LIMIT 5000
))`,
[NOW - AUDIT_EVENT_RETENTION_MS]
)
const reaper = await cleanupPlan('DELETE FROM relay_audit_events')
expect(reaper).toContain('relay_audit_events_at')
expect(reaper).not.toContain('Seq Scan on relay_audit_events')
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest'
import {
AUDIT_EVENT_RETENTION_MS,
hashCredential,
CONFIRM_RESULT_RETENTION_MS,
RelayCredentialStore,
type RelayIdentity
@@ -342,26 +343,52 @@ describe('credential cleanup invite reaper', () => {
})
it('still replays a confirm result inside retention', async () => {
// The one reader: a retried confirm on the same basis gets the stored answer back.
const database = await openInMemoryRelayDatabase()
const store = new RelayCredentialStore(database, () => NOW)
await database.query(
`INSERT INTO relay_confirm_results
(user_id, relay_host_id, req_id, basis_conn_id, tuple_json, result_json, committed_at)
VALUES (?, ?, 'confirm-1', 'basis-1', '{}', ?, ?)`,
[identity.userId, identity.relayHostId, JSON.stringify({ v: 1, reqId: 'confirm-1' }), NOW - DAY_MS]
)
await store.cleanup()
expect(
await store.confirmResume({
let now = NOW - DAY_MS
const store = new RelayCredentialStore(database, () => now)
try {
const invite = await store.createInvite(identity, 'device-1')
const reservation = await store.reserveCredential(identity.relayHostId, invite.inviteToken)
if (!reservation) {
throw new Error('invite did not reserve')
}
await store.recordConnectionBasis({
...reservation,
basisConnId: 'invite-basis',
owningControlGeneration: 1,
deadline: reservation.leaseExpiresAt
})
await store.installCredential({
...identity,
relayDeviceId: 'device-1',
reqId: 'install-1',
newResumeTokenHash: hashCredential('resume-token'),
owningControlGeneration: 1,
authorization: { mode: 'relay-basis', basisConnId: 'invite-basis' }
})
const resume = await store.reserveCredential(identity.relayHostId, 'resume-token')
if (!resume) {
throw new Error('resume did not reserve')
}
await store.recordConnectionBasis({
...resume,
basisConnId: 'resume-basis',
owningControlGeneration: 1,
deadline: resume.leaseExpiresAt
})
const request = {
...identity,
reqId: 'confirm-1',
basisConnId: 'basis-1',
basisConnId: 'resume-basis',
owningControlGeneration: 1
})
).toEqual({ v: 1, reqId: 'confirm-1' })
await database.close()
}
const confirmed = await store.confirmResume(request)
expect(confirmed).toMatchObject({ renewed: true, acceptedAs: 'current' })
now = NOW
await store.cleanup()
expect(await store.confirmResume(request)).toEqual(confirmed)
} finally {
await database.close()
}
})
})
@@ -30,11 +30,15 @@ async function inviteBasis(
describe('relay credential store', () => {
it('issues invites with a skew margin under the client-side TTL ceiling', async () => {
const database = await openInMemoryRelayDatabase()
const store = new RelayCredentialStore(database, () => 1_000_000)
const invite = await store.createInvite(identity, relayDeviceId)
// Zero-tolerance released desktops reject expiry past local now + 10min;
// issuing 30s under the ceiling absorbs that much desktop clock lag.
expect(invite.expiresAt).toBe(1_000_000 + 10 * 60 * 1_000 - 30 * 1_000)
try {
const store = new RelayCredentialStore(database, () => 1_000_000)
const invite = await store.createInvite(identity, relayDeviceId)
// Zero-tolerance released desktops reject expiry past local now + 10min;
// issuing 30s under the ceiling absorbs that much desktop clock lag.
expect(invite.expiresAt).toBe(1_000_000 + 10 * 60 * 1_000 - 30 * 1_000)
} finally {
await database.close()
}
})
it('persists one invite reservation with bounded attempts and cooldown', async () => {
@@ -149,6 +149,9 @@ function watchEventLoop(): { stop: () => number } {
longestGapMs = Math.max(longestGapMs, now - last)
last = now
}, 10)
cleanups.push(async () => {
clearInterval(timer)
})
return {
stop: () => {
clearInterval(timer)
@@ -123,9 +123,13 @@ describe('PostgreSQL relay deadlines', () => {
it('applies the schema on the untimed pool, never on the serving one', async () => {
fakes.query.mockClear()
const ddl: string[] = []
const serving: string[] = []
fakes.query.mockImplementation(async (sql: string) => {
// Every statement issued before the serving pool exists is schema work.
if (fakes.lifecycle.length === 1) ddl.push(sql)
else {
serving.push(sql)
}
return { rows: [], rowCount: 0 }
})
const database = await openRelayDatabase({
@@ -153,6 +157,10 @@ describe('PostgreSQL relay deadlines', () => {
).toBe(true)
// The backfill is DML, so it stays on the deadline-bearing serving pool.
expect(ddl.some((statement) => statement.includes('INSERT INTO'))).toBe(false)
expect(serving.some((statement) => statement.includes('INSERT INTO'))).toBe(true)
expect(serving.some((statement) => /^(?:CREATE|ALTER|DROP)\b/i.test(body(statement)))).toBe(
false
)
await database.close()
})
@@ -203,7 +211,7 @@ describe('PostgreSQL relay deadlines', () => {
// Why: a statement deadline that reaches the caller as a crash converts a
// transient stall into a failed assignment. It aborts the transaction exactly
// as a lock timeout does, so it belongs on the same bounded retry.
it('retries a statement timeout on a fresh client', async () => {
it('retries a transaction after a statement timeout', async () => {
vi.spyOn(console, 'warn').mockImplementation(() => undefined)
const database = await openRelayDatabase({
databaseUrl: 'postgresql://relay:secret@127.0.0.1:5432/relay',
@@ -16,19 +16,10 @@ describePostgres('PostgreSQL statement deadline', () => {
for (const database of databases) await database.close()
})
it('serves requests under the configured deadline', async () => {
const database = await openRelayDatabase({ databaseUrl, dataDir: '', statementTimeoutMs: 300 })
databases.push(database)
expect(await database.query(`SELECT current_setting('statement_timeout') AS statement_timeout`)).toEqual([
{ statement_timeout: '300ms' }
])
})
// Why: a real 57014 aborts the transaction exactly as a lock timeout does. If
// it escapes the bounded retry it becomes a failed assignment instead of a
// slow one.
it('retries a real statement timeout on a fresh client', async () => {
it('retries a transaction after a real statement timeout', async () => {
const database = await openRelayDatabase({ databaseUrl, dataDir: '', statementTimeoutMs: 300 })
databases.push(database)
let attempts = 0
@@ -61,33 +52,35 @@ describePostgres('PostgreSQL statement deadline', () => {
tableHeld()
await tableReleased
})
await tableHeldPromise
try {
await tableHeldPromise
// Resolving while the lock is still held is the whole proof: a statement that queued would hit
// the schema connection's 1s lock_timeout and fail the boot, which is no longer retried.
const database = await openRelayDatabase({
databaseUrl,
dataDir: '',
applicationName,
// Far too short for a blocked DDL; the serving pool wears it, the schema
// connection must not.
statementTimeoutMs: 200
})
databases.push(database)
const waiting = await databases[0]!.query(
`SELECT count(*) AS waiting FROM pg_stat_activity
// Resolving while the lock is still held is the whole proof: a statement that queued would hit
// the schema connection's 1s lock_timeout and fail the boot, which is no longer retried.
const database = await openRelayDatabase({
databaseUrl,
dataDir: '',
applicationName,
// Far too short for a blocked DDL; the serving pool wears it, the schema
// connection must not.
statementTimeoutMs: 200
})
databases.push(database)
const waiting = await databases[0]!.query(
`SELECT count(*) AS waiting FROM pg_stat_activity
WHERE datname = current_database() AND wait_event_type = 'Lock'
AND application_name = ?`,
[`${applicationName}/schema`]
)
expect(Number(waiting[0]!.waiting)).toBe(0)
[`${applicationName}/schema`]
)
expect(Number(waiting[0]!.waiting)).toBe(0)
releaseTable()
await holder
// The serving pool still carries the short deadline it was opened with.
expect(await database.query(`SELECT current_setting('statement_timeout') AS statement_timeout`)).toEqual([
{ statement_timeout: '200ms' }
])
// The serving pool still carries the short deadline it was opened with.
expect(
await database.query(`SELECT current_setting('statement_timeout') AS statement_timeout`)
).toEqual([{ statement_timeout: '200ms' }])
} finally {
releaseTable()
await holder
}
}, 15_000)
})
+62 -98
View File
@@ -2,12 +2,7 @@ import { mkdtempSync, rmSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { afterEach, describe, expect, it } from 'vitest'
import {
openInMemoryRelayDatabase,
openRelayDatabase,
POSTGRES_SCHEMA_MIGRATIONS,
REGIONAL_REHOME_DEFAULT_HOST_COOLDOWN_MS
} from './database.js'
import { openInMemoryRelayDatabase, openRelayDatabase } from './database.js'
const temporaryDirectories: string[] = []
@@ -46,58 +41,6 @@ describe('relay database', () => {
}
})
it('creates every durable relay state table', async () => {
const database = await openInMemoryRelayDatabase()
const rows = await database.query(
`SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'relay_%' ORDER BY name`
)
expect(rows.map((row) => row.name)).toEqual([
'relay_admission_selector_cell_additions',
'relay_admission_selector_intents',
'relay_admission_selectors',
'relay_assignment_activity_leases',
'relay_assignment_migration_incarnations',
'relay_assignment_migrations',
'relay_assignment_region_preferences',
'relay_assignments',
'relay_audit_events',
'relay_cell_admission',
'relay_cell_admit_effective',
'relay_cell_admit_modes',
'relay_cell_capabilities',
'relay_cell_committed_fences',
'relay_cell_connection_limits',
'relay_cell_connection_runtime',
'relay_cell_connection_snapshots',
'relay_cell_drain_attempt_states',
'relay_cell_drain_recovery_attempts',
'relay_cell_fence_apply_invocations',
'relay_cell_fence_attempts',
'relay_cell_fence_plan_bindings',
'relay_cell_fences',
'relay_cell_legacy_fence_adoptions',
'relay_cell_regions',
'relay_cell_rehome_safety',
'relay_cell_runtime',
'relay_cells',
'relay_confirm_results',
'relay_connection_bases',
'relay_control_capabilities',
'relay_control_connection_reservations',
'relay_devices',
'relay_direct_authorizations',
'relay_install_results',
'relay_invites',
'relay_post_drain_migration_pins',
'relay_rate_windows',
'relay_region_decisions',
'relay_region_rehome_attempts',
'relay_region_rehome_control',
'relay_region_rehome_worker_state'
])
await database.close()
})
it('rolls back every effect and serializes concurrent transactions', async () => {
const database = await openInMemoryRelayDatabase()
await expect(
@@ -174,46 +117,67 @@ describe('relay database', () => {
await second.close()
})
it('renders every region check from the shared region list', async () => {
// Derived, not hand-written: a third region must not leave one column
// rejecting a value the rest of the relay already accepts.
it('accepts supported regions and rejects unknown regions in each constrained table', async () => {
const database = await openInMemoryRelayDatabase()
const checked = await database.query(
`SELECT name, sql FROM sqlite_master
WHERE type = 'table'
AND name IN ('relay_assignment_region_preferences', 'relay_cell_regions',
'relay_region_rehome_attempts')
ORDER BY name`
)
const list = `IN ('us-central1', 'asia-east2')`
expect(checked.map((row) => row.name)).toEqual([
'relay_assignment_region_preferences',
'relay_cell_regions',
'relay_region_rehome_attempts'
])
expect(checked.every((row) => String(row.sql).includes(list))).toBe(true)
expect(POSTGRES_SCHEMA_MIGRATIONS.some((statement) => statement.includes(list))).toBe(true)
await database.close()
})
it('indexes rehome attempts by host recency for the per-host cooldown', async () => {
const database = await openInMemoryRelayDatabase()
const rows = await database.query(
`SELECT sql FROM sqlite_master
WHERE type = 'index' AND name = 'relay_region_rehome_attempts_host_recency'`
)
expect(rows[0]?.sql).toContain('(user_id, relay_host_id, created_at)')
expect(REGIONAL_REHOME_DEFAULT_HOST_COOLDOWN_MS).toBe(7 * 24 * 60 * 60_000)
await database.close()
})
it('indexes region preference expiry by observation time', async () => {
const database = await openInMemoryRelayDatabase()
const rows = await database.query(
`SELECT sql FROM sqlite_master
WHERE type = 'index' AND name = 'relay_assignment_region_preferences_observed'`
)
expect(rows[0]?.sql).toContain('(observed_at)')
await database.close()
try {
for (const region of ['us-central1', 'asia-east2', 'invalid-region']) {
const writes = [
() =>
database.query('INSERT INTO relay_cell_regions (cell_id, region) VALUES (?, ?)', [
region,
region
]),
() =>
database.query(
'INSERT INTO relay_assignment_region_preferences (user_id, relay_host_id, preferred_region, observed_at) VALUES (?, ?, ?, ?)',
[region, 'host', region, 1]
),
() =>
database.query(
`INSERT INTO relay_region_rehome_attempts
(attempt_id, user_id, relay_host_id, preferred_region, source_cell_id, source_cell_incarnation,
target_cell_id, target_cell_incarnation, previous_epoch, assignment_epoch,
drain_grace_ms, send_attempts, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
region,
region,
'host',
region,
'source',
'source-incarnation',
'target',
'target-incarnation',
1,
2,
60_000,
0,
1,
1
]
)
]
for (const write of writes) {
await (region === 'invalid-region'
? expect(write()).rejects.toThrow(/CHECK constraint failed/)
: write())
}
}
expect(await database.query('SELECT region FROM relay_cell_regions ORDER BY region')).toEqual(
[{ region: 'asia-east2' }, { region: 'us-central1' }]
)
expect(
await database.query(
'SELECT preferred_region FROM relay_assignment_region_preferences ORDER BY preferred_region'
)
).toEqual([{ preferred_region: 'asia-east2' }, { preferred_region: 'us-central1' }])
expect(
await database.query(
'SELECT preferred_region FROM relay_region_rehome_attempts ORDER BY preferred_region'
)
).toEqual([{ preferred_region: 'asia-east2' }, { preferred_region: 'us-central1' }])
} finally {
await database.close()
}
})
})
@@ -59,14 +59,6 @@ describePostgres('removed relay tables against PostgreSQL', () => {
await client.end()
})
it('does not create the removed tables on a fresh database', async () => {
await resetSchema()
const database = await openRelayDatabase({ databaseUrl: scopedUrl(), dataDir: '' })
await database.close()
expect(await existingDeadTables()).toEqual([])
})
it('boots on a database an older image created, leaving those tables alone', async () => {
await resetSchema()
await onScoped(async (client) => {
@@ -40,7 +40,9 @@ describe('a director reports its reserve placement as built', () => {
})
it('says what the built placement does', async () => {
expect(await status({ reservePlacement: { placementMode: 'on' } }, { reservePlacement: 'on' })).toMatchObject({
expect(
await status({ reservePlacement: { placementMode: 'on' } }, { reservePlacement: 'off' })
).toMatchObject({
reservePlacement: 'on'
})
})
@@ -328,6 +328,7 @@ describePostgres('PostgreSQL drain releases against director placement', () => {
let samples = 0
let waiting = 0
let active = 0
let samplingError: unknown
const loop = (async () => {
while (running) {
const rows = await observer.query(
@@ -340,11 +341,16 @@ describePostgres('PostgreSQL drain releases against director placement', () => {
waiting += rows.filter((row) => row['wait_event_type'] === 'Lock').length
await new Promise((resolve) => setTimeout(resolve, 20))
}
})()
})().catch((error: unknown) => {
samplingError = error
})
return {
stop: async () => {
running = false
await loop
if (samplingError) {
throw samplingError
}
return { waiting: mean(waiting, samples), active: mean(active, samples) }
}
}
@@ -387,106 +393,133 @@ describePostgres('PostgreSQL drain releases against director placement', () => {
delay.enabled = true
const sampler = sampleDirectorWaits()
const startedAt = performance.now()
const releaseWork = paced(releaseRate, releaseCount, async (index) => {
releases.attempted += 1
const began = performance.now()
try {
const released = await servingCell(SOURCE.id).store.releaseActivity(
releasing[index]!,
RELEASED_ACTIVITY
)
if (released) releases.ok += 1
else count(releases.failed, 'lease_missing')
} catch (error) {
count(releases.failed, failureCode(error))
}
releaseLatencies.push(performance.now() - began)
})
// The reconnect path, round-robin over directors: sticky-lane admission,
// the durable-pin check, then the assign the route calls, which re-places
// off the isolated cell. The host then attaches to its new Asia cell.
const dialWork = paced(DIAL_RATE_PER_SECOND, dialCount, async (index) => {
const identity = dialling[index]!
const director = directors[index % directors.length]!
dials.attempted += 1
let rejection = 'unknown'
const lease = await stickyLanes[index % directors.length]!.acquire(
identity.relayHostId,
(reason) => {
rejection = reason
try {
const releaseWork = paced(releaseRate, releaseCount, async (index) => {
releases.attempted += 1
const began = performance.now()
try {
const released = await servingCell(SOURCE.id).store.releaseActivity(
releasing[index]!,
RELEASED_ACTIVITY
)
if (released) {
releases.ok += 1
} else {
count(releases.failed, 'lease_missing')
}
} catch (error) {
count(releases.failed, failureCode(error))
}
)
if (!lease) {
count(dials.admissionRejected, rejection)
return
}
try {
if (!(await director.store.resolve(identity))) {
count(dials.failed, 'unverified')
releaseLatencies.push(performance.now() - began)
})
// The reconnect path, round-robin over directors: sticky-lane admission,
// the durable-pin check, then the assign the route calls, which re-places
// off the isolated cell. The host then attaches to its new Asia cell.
const dialWork = paced(DIAL_RATE_PER_SECOND, dialCount, async (index) => {
const identity = dialling[index]!
const director = directors[index % directors.length]!
dials.attempted += 1
let rejection = 'unknown'
const lease = await stickyLanes[index % directors.length]!.acquire(
identity.relayHostId,
(reason) => {
rejection = reason
}
)
if (!lease) {
count(dials.admissionRejected, rejection)
return
}
const grant = await director.store.assign(identity, 'asia-east2', 'asia-east2')
if (grant.cellId === SOURCE.id) {
count(dials.failed, 'kept_on_source')
return
try {
if (!(await director.store.resolve(identity))) {
count(dials.failed, 'unverified')
return
}
const grant = await director.store.assign(identity, 'asia-east2', 'asia-east2')
if (grant.cellId === SOURCE.id) {
count(dials.failed, 'kept_on_source')
return
}
dials.placed += 1
if (grant.region !== SOURCE.region) {
dials.placedCrossRegion += 1
}
if (performance.now() - startedAt <= WINDOW_MS) {
dials.placedInWindow += 1
}
activationWork.push(
servingCell(grant.cellId)
.store.activateControl(identity, {
cellId: grant.cellId,
assignmentEpoch: grant.assignmentEpoch,
generation: 1
})
.then(
() => {
activations.ok += 1
},
(error: unknown) => count(activations.failed, failureCode(error))
)
)
} catch (error) {
count(dials.failed, failureCode(error))
} finally {
lease.release()
}
})
const outcomes = await Promise.allSettled([...(await releaseWork), ...(await dialWork)])
for (const outcome of outcomes) {
if (outcome.status === 'rejected') {
throw outcome.reason
}
dials.placed += 1
if (grant.region !== SOURCE.region) dials.placedCrossRegion += 1
if (performance.now() - startedAt <= WINDOW_MS) dials.placedInWindow += 1
activationWork.push(
servingCell(grant.cellId)
.store.activateControl(identity, {
cellId: grant.cellId,
assignmentEpoch: grant.assignmentEpoch,
generation: 1
})
.then(
() => {
activations.ok += 1
},
(error: unknown) => count(activations.failed, failureCode(error))
)
)
} catch (error) {
count(dials.failed, failureCode(error))
} finally {
lease.release()
}
})
await Promise.allSettled([...(await releaseWork), ...(await dialWork)])
await Promise.allSettled(activationWork)
const waits = await sampler.stop()
delay.enabled = false
if (neighboursCapped) await heartbeatAll()
expect(releases.attempted).toBe(releaseCount)
expect(dials.attempted).toBe(dialCount)
expect(dials.placed + total(dials.failed) + total(dials.admissionRejected)).toBe(dialCount)
expect(dials.placed).toBeGreaterThan(0)
const activationOutcomes = await Promise.allSettled(activationWork)
for (const outcome of activationOutcomes) {
if (outcome.status === 'rejected') {
throw outcome.reason
}
}
const waits = await sampler.stop()
delay.enabled = false
if (neighboursCapped) {
await heartbeatAll()
}
const holds = directors.map((instance) => consumeRelayCellInventoryHold(instance.database))
const report: RunReport = {
roundTripMs,
releaseRate,
neighboursCapped,
releases: {
...releases,
p50Ms: percentile(releaseLatencies, 0.5),
p95Ms: percentile(releaseLatencies, 0.95)
},
dials,
activations,
placementsPerSecond: Number(((dials.placedInWindow * 1_000) / WINDOW_MS).toFixed(1)),
director: {
lockUnavailable: holds.reduce((sum, hold) => sum + hold.cellInventoryLockUnavailable, 0),
lockTimeouts: holds.reduce((sum, hold) => sum + hold.cellInventoryLockTimeouts, 0),
holds: holds.reduce((sum, hold) => sum + hold.cellInventoryHolds, 0),
holdMsMax: Math.round(Math.max(...holds.map((hold) => hold.cellInventoryHoldMsMax))),
lockWaitingMean: waits.waiting,
activeMean: waits.active
},
sourcePoolWaitersMax: consumeRelayDatabasePoolPressure(servingCell(SOURCE.id).database)
.databasePoolWaitersMax
const holds = directors.map((instance) => consumeRelayCellInventoryHold(instance.database))
const report: RunReport = {
roundTripMs,
releaseRate,
neighboursCapped,
releases: {
...releases,
p50Ms: percentile(releaseLatencies, 0.5),
p95Ms: percentile(releaseLatencies, 0.95)
},
dials,
activations,
placementsPerSecond: Number(((dials.placedInWindow * 1_000) / WINDOW_MS).toFixed(1)),
director: {
lockUnavailable: holds.reduce((sum, hold) => sum + hold.cellInventoryLockUnavailable, 0),
lockTimeouts: holds.reduce((sum, hold) => sum + hold.cellInventoryLockTimeouts, 0),
holds: holds.reduce((sum, hold) => sum + hold.cellInventoryHolds, 0),
holdMsMax: Math.round(Math.max(...holds.map((hold) => hold.cellInventoryHoldMsMax))),
lockWaitingMean: waits.waiting,
activeMean: waits.active
},
sourcePoolWaitersMax: consumeRelayDatabasePoolPressure(servingCell(SOURCE.id).database)
.databasePoolWaitersMax
}
reports.push(report)
console.info(JSON.stringify({ event: 'drain_release_cell_row_contention', ...report }))
return report
} finally {
delay.enabled = false
await sampler.stop()
}
reports.push(report)
console.info(JSON.stringify({ event: 'drain_release_cell_row_contention', ...report }))
return report
}
// Production's shape: the host whose socket the draining cell closes is the
@@ -519,106 +552,151 @@ describePostgres('PostgreSQL drain releases against director placement', () => {
delay.enabled = true
const sampler = sampleDirectorWaits()
const startedAt = performance.now()
// One dial through the sticky lane; 'placed', or the reason it was not.
async function dial(identity: Identity, director: number): Promise<string> {
let rejection = 'unknown'
const lease = await stickyLanes[director]!.acquire(identity.relayHostId, (reason) => {
rejection = reason
})
if (!lease) return `rejected:${rejection}`
try {
if (!(await directors[director]!.store.resolve(identity))) return 'failed:unverified'
const grant = await directors[director]!.store.assign(identity, 'asia-east2', 'asia-east2')
if (grant.cellId === SOURCE.id) return 'failed:kept_on_source'
activationWork.push(
servingCell(grant.cellId)
.store.activateControl(identity, {
try {
// One dial through the sticky lane; 'placed', or the reason it was not.
async function dial(identity: Identity, director: number): Promise<string> {
let rejection = 'unknown'
const lease = await stickyLanes[director]!.acquire(identity.relayHostId, (reason) => {
rejection = reason
})
if (!lease) {
return `rejected:${rejection}`
}
try {
if (!(await directors[director]!.store.resolve(identity))) {
return 'failed:unverified'
}
const grant = await directors[director]!.store.assign(
identity,
'asia-east2',
'asia-east2'
)
if (grant.cellId === SOURCE.id) {
return 'failed:kept_on_source'
}
activationWork.push(
servingCell(grant.cellId).store.activateControl(identity, {
cellId: grant.cellId,
assignmentEpoch: grant.assignmentEpoch,
generation: 1
})
.catch(() => undefined)
)
return 'placed'
} catch (error) {
if (error instanceof RelayAssignmentRowBusyError) return `rejected:${error.message}`
return `failed:${failureCode(error)}`
} finally {
lease.release()
)
return 'placed'
} catch (error) {
if (error instanceof RelayAssignmentRowBusyError) {
return `rejected:${error.message}`
}
return `failed:${failureCode(error)}`
} finally {
lease.release()
}
}
}
const work = paced(releaseRate, hosts.length, async (index) => {
const identity = hosts[index]!
const releasedAt = performance.now()
const release = servingCell(SOURCE.id)
.store.releaseActivity(identity, RELEASED_ACTIVITY)
.then(
(released) => {
if (released) releases.ok += 1
else count(releases.failed, 'lease_missing')
},
(error: unknown) => count(releases.failed, failureCode(error))
)
await new Promise((resolve) => setTimeout(resolve, dialDelayMs))
const director = index % directors.length
for (let attempt = 0; ; attempt += 1) {
const sentAt = performance.now()
const outcome = await dial(identity, director)
if (outcome === `rejected:${new RelayAssignmentRowBusyError().message}`) busyRefusals += 1
if (outcome.startsWith('failed:')) count(unexpected, outcome.slice(7))
if (attempt === 0) {
if (outcome === 'placed') firstAttempt.placed += 1
else if (outcome.startsWith('rejected:')) count(firstRejected, outcome.slice(9))
else count(firstFailed, outcome.slice(7))
const work = paced(releaseRate, hosts.length, async (index) => {
const identity = hosts[index]!
const releasedAt = performance.now()
const release = servingCell(SOURCE.id)
.store.releaseActivity(identity, RELEASED_ACTIVITY)
.then(
(released) => {
if (released) {
releases.ok += 1
} else {
count(releases.failed, 'lease_missing')
}
},
(error: unknown) => count(releases.failed, failureCode(error))
)
await new Promise((resolve) => setTimeout(resolve, dialDelayMs))
const director = index % directors.length
for (let attempt = 0; ; attempt += 1) {
const sentAt = performance.now()
const outcome = await dial(identity, director)
if (outcome === `rejected:${new RelayAssignmentRowBusyError().message}`) {
busyRefusals += 1
}
if (outcome.startsWith('failed:')) {
count(unexpected, outcome.slice(7))
}
if (attempt === 0) {
if (outcome === 'placed') {
firstAttempt.placed += 1
} else if (outcome.startsWith('rejected:')) {
count(firstRejected, outcome.slice(9))
} else {
count(firstFailed, outcome.slice(7))
}
}
if (outcome === 'placed') {
const placedAt = performance.now()
timeToPlaced.push(placedAt - releasedAt)
if (placedAt - startedAt <= WINDOW_MS + dialDelayMs) {
placedInWindow += 1
}
break
}
if (!outcome.startsWith('rejected:')) {
break
}
if (attempt === 1) {
hostsRefusedTwice += 1
}
const nextAt =
sentAt + HOST_ASSIGN_MIN_INTERVAL_MS + Math.random() * HOST_ASSIGN_INTERVAL_JITTER_MS
if (nextAt - releasedAt > REDIAL_GIVE_UP_MS) {
break
}
redials += 1
await new Promise((resolve) => setTimeout(resolve, nextAt - performance.now()))
}
if (outcome === 'placed') {
const placedAt = performance.now()
timeToPlaced.push(placedAt - releasedAt)
if (placedAt - startedAt <= WINDOW_MS + dialDelayMs) placedInWindow += 1
break
await release
})
const outcomes = await Promise.allSettled(await work)
for (const outcome of outcomes) {
if (outcome.status === 'rejected') {
throw outcome.reason
}
if (!outcome.startsWith('rejected:')) break
if (attempt === 1) hostsRefusedTwice += 1
const nextAt =
sentAt +
HOST_ASSIGN_MIN_INTERVAL_MS +
Math.random() * HOST_ASSIGN_INTERVAL_JITTER_MS
if (nextAt - releasedAt > REDIAL_GIVE_UP_MS) break
redials += 1
await new Promise((resolve) => setTimeout(resolve, nextAt - performance.now()))
}
await release
})
await Promise.allSettled(await work)
await Promise.allSettled(activationWork)
const waits = await sampler.stop()
delay.enabled = false
if (neighboursCapped) await heartbeatAll()
const report: DepartingReport = {
dialDelayMs,
neighboursCapped,
hosts: hosts.length,
placed: timeToPlaced.length,
firstAttempt,
busyRefusals,
hostsRefusedTwice,
unexpected,
redials,
timeToPlacedMs: {
p50: percentile(timeToPlaced, 0.5),
p95: percentile(timeToPlaced, 0.95),
max: percentile(timeToPlaced, 1)
},
placementsPerSecond: Number(((placedInWindow * 1_000) / WINDOW_MS).toFixed(1)),
releases,
lockWaitingMean: waits.waiting,
activeMean: waits.active
expect(firstAttempt.placed + total(firstRejected) + total(firstFailed)).toBe(hosts.length)
expect(timeToPlaced.length).toBeGreaterThan(0)
const activationOutcomes = await Promise.allSettled(activationWork)
for (const outcome of activationOutcomes) {
if (outcome.status === 'rejected') {
throw outcome.reason
}
}
const waits = await sampler.stop()
delay.enabled = false
if (neighboursCapped) {
await heartbeatAll()
}
const report: DepartingReport = {
dialDelayMs,
neighboursCapped,
hosts: hosts.length,
placed: timeToPlaced.length,
firstAttempt,
busyRefusals,
hostsRefusedTwice,
unexpected,
redials,
timeToPlacedMs: {
p50: percentile(timeToPlaced, 0.5),
p95: percentile(timeToPlaced, 0.95),
max: percentile(timeToPlaced, 1)
},
placementsPerSecond: Number(((placedInWindow * 1_000) / WINDOW_MS).toFixed(1)),
releases,
lockWaitingMean: waits.waiting,
activeMean: waits.active
}
departingReports.push(report)
console.info(JSON.stringify({ event: 'drain_departing_host_redial', ...report }))
return report
} finally {
delay.enabled = false
await sampler.stop()
}
departingReports.push(report)
console.info(JSON.stringify({ event: 'drain_departing_host_redial', ...report }))
return report
}
beforeAll(async () => {
@@ -161,7 +161,7 @@ describe('floating promises', () => {
const files = productionFiles()
const result = census(ts.createProgram(files, COMPILER_OPTIONS), files)
// Resolution worked: a broken program would see no promises and pass vacuously.
expect(result.seen).toBeGreaterThan(500)
expect(result.seen).toBeGreaterThan(0)
expect(result.floating).toEqual([])
}, 120_000)
@@ -67,16 +67,15 @@ describe('HostCloseReasonMemory', () => {
})
it('re-recording refreshes recency so a live host is not evicted first', () => {
const clock = { now: 1_000 }
const memory = memoryAt(clock)
memory.record('a', RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
memory.record('b', RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
memory.record('a', RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
expect([...['a', 'b'].map((key) => memory.read(key))]).toEqual([
RELAY_HOST_CLOSE_REASON.SIGNED_OUT,
RELAY_HOST_CLOSE_REASON.SIGNED_OUT
])
expect(memory.size()).toBe(2)
const memory = memoryAt({ now: 1_000 })
for (let index = 0; index < 50_000; index++) {
memory.record(`host-${index}`, RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
}
memory.record('host-0', RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
memory.record('overflow', RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
expect(memory.size()).toBe(50_000)
expect(memory.read('host-0')).toBe(RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
expect(memory.read('host-1')).toBeNull()
expect(memory.read('overflow')).toBe(RELAY_HOST_CLOSE_REASON.SIGNED_OUT)
})
})
@@ -103,15 +103,25 @@ describe('a resumed control adopts the token its hello proved', () => {
})
it('keeps a later expiry a refresh delivered over an older token the hello carried', async () => {
const { h, session, resumeHello } = await lapsedHost()
session.identity = { ...session.identity, exp: nowSeconds() + 600 }
const verify = vi.fn<(token: string) => Promise<RelayTokenClaims | null>>()
const { h, first, ack } = await connectedHost(300, verify)
const session = h.registry.get({ userId: h.identity.sub, relayHostId: h.identity.relayHostId })!
const refreshedExpiry = nowSeconds() + 600
verify.mockResolvedValueOnce({ ...h.identity, exp: refreshedExpiry })
sendRefresh(first)
await vi.advanceTimersByTimeAsync(0)
expect(session.identity.exp).toBe(refreshedExpiry)
const older = { ...h.identity, exp: nowSeconds() + 120 }
const resumed = await openProof(h, new ProofSocket(), older, resumeHello())
answerProof(resumed, h.keyPair)
await vi.advanceTimersByTimeAsync(0)
expect(session.identity.exp).toBe(nowSeconds() + 600)
h.registry.drain(0)
await vi.advanceTimersByTimeAsync(0)
try {
const resumed = await openProof(h, new ProofSocket(), older, resumeHelloFor(h.hello, ack)())
answerProof(resumed, h.keyPair)
await vi.advanceTimersByTimeAsync(0)
expect(sentAck(resumed).generation).toBe(ack.generation)
expect(session.identity.exp).toBe(refreshedExpiry)
} finally {
h.registry.drain(0)
await vi.advanceTimersByTimeAsync(0)
}
})
it.each([
@@ -376,35 +376,44 @@ describe('client accept abandoned mid-DB-phase', () => {
const h = harness({ now: () => now })
await activeHost(h)
const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined)
const client = new FakeSocket()
await h.registry.acceptClient(client as unknown as WebSocket, identity.relayHostId, 'credential')
now += RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs
vi.advanceTimersByTime(RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs)
// The phone-only reason; relay-hello itself is unchanged for strict old parsers.
expect(client.close).toHaveBeenCalledWith(RELAY_CLOSE_CODE.HOST_OFFLINE, 'attach-timeout')
expect(client.send).toHaveBeenCalledWith(JSON.stringify({ type: 'relay-hello', ok: false, code: 4404 }))
expect(h.observer.recordPhoneAttachDeadline).toHaveBeenCalledOnce()
expect(h.observer.recordPhoneRejection).toHaveBeenCalledWith(RELAY_CLOSE_CODE.HOST_OFFLINE)
const lines = warn.mock.calls
.map(([line]) => String(line))
.filter((line) => line.includes('orca_relay_attach_deadline_offline'))
expect(lines.map((line) => JSON.parse(line))).toEqual([
{
event: 'orca_relay_attach_deadline_offline',
relayHostIdDigest: expect.any(String),
credentialKind: 'resume',
msSinceLastPong: RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs,
pingOutstanding: false,
controlAgeMs: RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs,
controlRttMs: null,
pong: 'fresh',
cellId: config.cellId
}
])
expect(lines[0]).not.toContain(identity.relayHostId)
warn.mockRestore()
h.registry.drain(0)
vi.advanceTimersByTime(0)
try {
const client = new FakeSocket()
await h.registry.acceptClient(
client as unknown as WebSocket,
identity.relayHostId,
'credential'
)
now += RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs
vi.advanceTimersByTime(RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs)
// The phone-only reason; relay-hello itself is unchanged for strict old parsers.
expect(client.close).toHaveBeenCalledWith(RELAY_CLOSE_CODE.HOST_OFFLINE, 'attach-timeout')
expect(client.send).toHaveBeenCalledWith(
JSON.stringify({ type: 'relay-hello', ok: false, code: 4404 })
)
expect(h.observer.recordPhoneAttachDeadline).toHaveBeenCalledOnce()
expect(h.observer.recordPhoneRejection).toHaveBeenCalledWith(RELAY_CLOSE_CODE.HOST_OFFLINE)
const lines = warn.mock.calls
.map(([line]) => String(line))
.filter((line) => line.includes('orca_relay_attach_deadline_offline'))
expect(lines.map((line) => JSON.parse(line))).toEqual([
{
event: 'orca_relay_attach_deadline_offline',
relayHostIdDigest: expect.any(String),
credentialKind: 'resume',
msSinceLastPong: RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs,
pingOutstanding: false,
controlAgeMs: RELAY_PROTOCOL_LIMITS.hostAttachDeadlineMs,
controlRttMs: null,
pong: 'fresh',
cellId: config.cellId
}
])
expect(lines[0]).not.toContain(identity.relayHostId)
} finally {
warn.mockRestore()
h.registry.drain(0)
vi.advanceTimersByTime(0)
}
})
it('still opens the connection when the phone is holding on', async () => {
@@ -462,8 +471,6 @@ describe('successful client accept timing', () => {
) as { connId: string; connTicket: string }
// The desktop's data leg is the attach window this is meant to expose.
now += 23
const session = h.registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })!
const ownerProbe = vi.spyOn(session.pendingConns, 'has')
const accepted = await h.registry.acceptHostData(
hostData as unknown as WebSocket,
connOpen.connId,
@@ -472,7 +479,6 @@ describe('successful client accept timing', () => {
)
expect(accepted).toBe(true)
expect(ownerProbe).toHaveBeenCalledOnce()
expect(h.observer.recordClientAcceptCompleted).toHaveBeenCalledWith({
totalMs: 49,
stageMs: { assignment: 5, credential: 7, activity: 11, attach: 23, basis: 3 },
@@ -86,8 +86,8 @@ function setup(input: {
ticketEnforce: () => false,
dryRunEnabled: () => false,
databaseShedding: () => input.databaseShedding ?? false,
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: beginProof calls only take() on the reserve book.
book: { take } as unknown as CellReserveBook,
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: The fixture books controls with take() and drains them with clear().
book: { take, clear: vi.fn() } as unknown as CellReserveBook,
verifyLease: vi.fn(async () => 'absent' as const)
}
let answerDatabase: (valid: boolean) => void = () => {}
@@ -187,20 +187,27 @@ describe('host pre-auth latency', () => {
afterEach(() => vi.useRealTimers())
it('records a booked hello on the reserve path, from accept to a verified proof', async () => {
vi.useFakeTimers()
const h = setup({ admitMode: 'reserve', databaseSays: false })
const { keyPair, identity } = hostKey()
const socket = new FakeSocket()
h.registry.acceptControl(socket.asWebSocket(), identity)
h.advance(30)
sendHello(socket, keyPair, identity.relayHostId)
await vi.waitFor(() => expect(socket.send).toHaveBeenCalledTimes(1))
expect(h.recordHostPreAuth).not.toHaveBeenCalled()
h.advance(45)
answerChallenge(socket, keyPair)
try {
const { keyPair, identity } = hostKey()
const socket = new FakeSocket()
h.registry.acceptControl(socket.asWebSocket(), identity)
h.advance(30)
sendHello(socket, keyPair, identity.relayHostId)
await vi.waitFor(() => expect(socket.send).toHaveBeenCalledTimes(1))
expect(h.recordHostPreAuth).not.toHaveBeenCalled()
h.advance(45)
answerChallenge(socket, keyPair)
await vi.advanceTimersByTimeAsync(0)
expect(h.take).toHaveBeenCalledOnce()
expect(h.verifyCellAssignment).not.toHaveBeenCalled()
expect(h.recordHostPreAuth).toHaveBeenCalledExactlyOnceWith('reserve', 'admitted', 75)
expect(h.take).toHaveBeenCalledOnce()
expect(h.verifyCellAssignment).not.toHaveBeenCalled()
expect(h.recordHostPreAuth).toHaveBeenCalledExactlyOnceWith('reserve', 'admitted', 75)
} finally {
h.registry.drain(0)
await vi.advanceTimersByTimeAsync(0)
}
})
it('records a hello the database refuses on the db path', async () => {
@@ -14,7 +14,6 @@ import type { RelayConfig } from './config.js'
import { RelayStoreError, type RelayCredentialStore } from './credential-store.js'
import { CONTROL_RENEWAL_BATCH_INTERVAL_MS } from './control-renewal-batch.js'
import {
CONTROL_RENEWAL_STATEMENT_OUTCOMES,
type ControlRenewalOutcome,
type ControlRenewalRequest
} from './control-renewal-statement.js'
@@ -124,8 +123,7 @@ function createRegistry(
registry: HostSessionRegistry
activate: ActivateSession
acquireActivity: ReturnType<typeof vi.fn>
renewControlActivity: ReturnType<typeof vi.fn>
renewControlActivities: ReturnType<typeof vi.fn>
renewControlActivities: ReturnType<typeof vi.fn<RelayAssignmentStore['renewControlActivities']>>
releaseActivity: ReturnType<typeof vi.fn>
observer: {
recordAuth: ReturnType<typeof vi.fn>
@@ -135,39 +133,15 @@ function createRegistry(
}
} {
const acquireActivity = vi.fn().mockResolvedValue(undefined)
const renewControlActivity = vi.fn().mockResolvedValue(undefined)
const releaseActivity = vi.fn().mockResolvedValue(true)
// Mirrors the store's own batch semantics over the single-renewal mock: a known
// outcome becomes that row's verdict, and any other failure reaches the caller
// as the driver's error. Keeps every per-call expectation below aimed at the
// renewal a session actually asked for.
const renewControlActivities = vi.fn(
async (rows: readonly ControlRenewalRequest[]): Promise<ControlRenewalOutcome[]> =>
await Promise.all(
rows.map(async (row): Promise<ControlRenewalOutcome> => {
try {
await renewControlActivity(row.identity, {
activityId: row.activityId,
cellId: row.cellId,
expiresAt: row.expiresAt
})
return 'renewed'
} catch (error) {
const message = String((error as { message?: unknown }).message)
if (!CONTROL_RENEWAL_STATEMENT_OUTCOMES.has(message as ControlRenewalOutcome)) {
throw error
}
return message as ControlRenewalOutcome
}
})
)
)
const renewControlActivities = vi
.fn<RelayAssignmentStore['renewControlActivities']>()
.mockImplementation(async (rows) => rows.map(() => 'renewed'))
const assignments = {
activateControl,
markMigrationTargetRegistered: vi.fn().mockResolvedValue(undefined),
resolve: vi.fn().mockResolvedValue({ cellId: config.cellId }),
acquireActivity,
renewControlActivity,
renewControlActivities,
releaseActivity
} as unknown as RelayAssignmentStore
@@ -220,7 +194,6 @@ function createRegistry(
registry,
activate,
acquireActivity,
renewControlActivity,
renewControlActivities,
releaseActivity,
observer
@@ -755,7 +728,7 @@ describe('host session cleanup races', () => {
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValueOnce('control:production-gce-c3:1')
.mockReturnValueOnce(blocked.promise)
const { registry, activate, renewControlActivity, releaseActivity } =
const { registry, activate, renewControlActivities, releaseActivity } =
createRegistry(activateControl)
const originalSocket = new FakeSocket()
await activate(originalSocket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -785,7 +758,7 @@ describe('host session cleanup races', () => {
'relay draining'
)
expect(registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })).toBeNull()
expect(renewControlActivity).not.toHaveBeenCalled()
expect(renewControlActivities).not.toHaveBeenCalled()
expect(releaseActivity).toHaveBeenCalledWith(
{ userId: identity.sub, relayHostId: identity.relayHostId },
'control:production-gce-c3:2'
@@ -829,7 +802,7 @@ describe('host session cleanup races', () => {
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValueOnce('control:production-gce-c3:1')
.mockResolvedValueOnce('control:production-gce-c3:2')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
const originalSocket = new FakeSocket()
await activate(originalSocket as unknown as WebSocket, identity, null, 1, false, 1)
const original = registry.get({
@@ -842,14 +815,14 @@ describe('host session cleanup races', () => {
await vi.advanceTimersByTimeAsync(15_000)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledOnce()
expect(renewControlActivity).toHaveBeenCalledWith(
{ userId: identity.sub, relayHostId: identity.relayHostId },
expect(renewControlActivities).toHaveBeenCalledOnce()
expect(renewControlActivities).toHaveBeenCalledWith([
expect.objectContaining({
identity: { userId: identity.sub, relayHostId: identity.relayHostId },
activityId: 'control:production-gce-c3:2',
cellId: 'production-gce-c3'
})
)
])
registry.drain(0)
vi.advanceTimersByTime(0)
})
@@ -859,17 +832,17 @@ describe('host session cleanup races', () => {
const oldSocket = new FakeSocket()
await h.activate(oldSocket as unknown as WebSocket, identity, null, 1, false, 1)
const session = h.registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })!
let reject!: (error: Error) => void
h.renewControlActivity.mockReturnValueOnce(
new Promise<void>((_, fail) => {
reject = fail
let finish!: (outcomes: ControlRenewalOutcome[]) => void
h.renewControlActivities.mockReturnValueOnce(
new Promise<ControlRenewalOutcome[]>((resolve) => {
finish = resolve
})
)
await vi.advanceTimersByTimeAsync(15_000)
await closeRenewalWindow()
const replacement = new FakeSocket()
await h.activate(replacement as unknown as WebSocket, identity, session, 1, true, 1)
reject(new Error('activity_cell_not_authoritative'))
finish(['activity_cell_not_authoritative'])
await vi.advanceTimersByTimeAsync(0)
expect(replacement.close).not.toHaveBeenCalled()
expect(session.socket).toBe(replacement)
@@ -881,7 +854,7 @@ describe('host session cleanup races', () => {
const socket = new FakeSocket()
await h.activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
const session = h.registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })!
h.renewControlActivity.mockRejectedValueOnce(new Error('control_activity_not_found'))
h.renewControlActivities.mockResolvedValueOnce(['control_activity_not_found'])
let reject!: (error: Error) => void
h.acquireActivity.mockReturnValueOnce(
new Promise<void>((_, fail) => {
@@ -907,7 +880,7 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
const socket = new FakeSocket()
const activatedAt = Date.now()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -920,9 +893,9 @@ describe('host session cleanup races', () => {
const pings = socket.send.mock.calls.filter((call) => String(call[0]).includes('"ping"'))
expect(pings).toHaveLength(4)
expect(renewControlActivity).toHaveBeenCalledTimes(2)
const firstExpiry = Number(renewControlActivity.mock.calls[0]![1].expiresAt)
const secondExpiry = Number(renewControlActivity.mock.calls[1]![1].expiresAt)
expect(renewControlActivities).toHaveBeenCalledTimes(2)
const firstExpiry = Number(renewControlActivities.mock.calls[0]![0][0]!.expiresAt)
const secondExpiry = Number(renewControlActivities.mock.calls[1]![0][0]!.expiresAt)
expect(firstExpiry).toBe(
activatedAt +
RELAY_PROTOCOL_LIMITS.controlPingIntervalMs +
@@ -938,18 +911,18 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
renewControlActivity.mockRejectedValueOnce(new Error('pool timeout'))
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
renewControlActivities.mockRejectedValueOnce(new Error('pool timeout'))
const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined)
const socket = new FakeSocket()
try {
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledOnce()
expect(renewControlActivities).toHaveBeenCalledOnce()
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledTimes(2)
expect(renewControlActivities).toHaveBeenCalledTimes(2)
} finally {
warn.mockRestore()
registry.drain(0)
@@ -961,17 +934,17 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
const stalled = deferred<void>()
renewControlActivity.mockReturnValueOnce(stalled.promise)
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
const stalled = deferred<ControlRenewalOutcome[]>()
renewControlActivities.mockReturnValueOnce(stalled.promise)
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs * 2)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledTimes(2)
stalled.resolve(undefined)
expect(renewControlActivities).toHaveBeenCalledTimes(2)
stalled.resolve(['renewed'])
await vi.advanceTimersByTimeAsync(0)
registry.drain(0)
vi.advanceTimersByTime(0)
@@ -981,25 +954,25 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
const stalled = deferred<void>()
renewControlActivity.mockReturnValueOnce(stalled.promise)
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
const stalled = deferred<ControlRenewalOutcome[]>()
renewControlActivities.mockReturnValueOnce(stalled.promise)
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs * 2)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledTimes(2)
stalled.resolve(undefined)
expect(renewControlActivities).toHaveBeenCalledTimes(2)
stalled.resolve(['renewed'])
await vi.advanceTimersByTimeAsync(0)
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledTimes(2)
expect(renewControlActivities).toHaveBeenCalledTimes(2)
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledTimes(3)
expect(renewControlActivities).toHaveBeenCalledTimes(3)
registry.drain(0)
vi.advanceTimersByTime(0)
})
@@ -1008,9 +981,9 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, acquireActivity, renewControlActivity } =
const { registry, activate, acquireActivity, renewControlActivities } =
createRegistry(activateControl)
renewControlActivity.mockRejectedValueOnce(new Error('control_activity_not_found'))
renewControlActivities.mockResolvedValueOnce(['control_activity_not_found'])
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -1034,9 +1007,9 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, acquireActivity, renewControlActivity } =
const { registry, activate, acquireActivity, renewControlActivities } =
createRegistry(activateControl)
renewControlActivity.mockRejectedValueOnce(new Error('control_activity_moved'))
renewControlActivities.mockResolvedValueOnce(['control_activity_moved'])
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -1053,9 +1026,9 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, acquireActivity, renewControlActivity } =
const { registry, activate, acquireActivity, renewControlActivities } =
createRegistry(activateControl)
renewControlActivity.mockRejectedValueOnce(new Error('control_activity_not_found'))
renewControlActivities.mockResolvedValueOnce(['control_activity_not_found'])
acquireActivity.mockRejectedValueOnce(new Error('activity_cell_not_authoritative'))
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -1075,8 +1048,8 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
renewControlActivity.mockRejectedValueOnce(new Error('activity_cell_not_authoritative'))
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
renewControlActivities.mockResolvedValueOnce(['activity_cell_not_authoritative'])
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -1095,7 +1068,7 @@ describe('host session cleanup races', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
registry.drain(60_000)
@@ -1106,7 +1079,7 @@ describe('host session cleanup races', () => {
await closeRenewalWindow()
}
expect(renewControlActivity).toHaveBeenCalledTimes(2)
expect(renewControlActivities).toHaveBeenCalledTimes(2)
expect(socket.readyState).toBe(socket.OPEN)
vi.advanceTimersByTime(15_000)
})
@@ -1123,7 +1096,7 @@ describe('control renewal cadence across a rebind', () => {
const activateControl = vi
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValue('control:production-gce-c3:1')
const { registry, activate, renewControlActivity } = createRegistry(activateControl)
const { registry, activate, renewControlActivities } = createRegistry(activateControl)
const ping = RELAY_PROTOCOL_LIMITS.controlPingIntervalMs
const socket = new FakeSocket()
await activate(socket as unknown as WebSocket, identity, null, 1, false, 1)
@@ -1136,23 +1109,23 @@ describe('control renewal cadence across a rebind', () => {
// Age the session so its attempt counter is well above zero.
for (let tick = 0; tick < 5; tick++) await beat(socket)
expect(renewControlActivity).toHaveBeenCalledTimes(3)
expect(renewControlActivities).toHaveBeenCalledTimes(3)
// The next renewal stalls and is still in flight when the control rebinds.
const stalled = deferred<void>()
renewControlActivity.mockReturnValueOnce(stalled.promise)
const stalled = deferred<ControlRenewalOutcome[]>()
renewControlActivities.mockReturnValueOnce(stalled.promise)
for (let tick = 0; tick < 2; tick++) await beat(socket)
expect(renewControlActivity).toHaveBeenCalledTimes(4)
expect(renewControlActivities).toHaveBeenCalledTimes(4)
const session = registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })!
const rebindSocket = new FakeSocket()
await activate(rebindSocket as unknown as WebSocket, identity, session, 1, true, 1)
stalled.resolve(undefined)
stalled.resolve(['renewed'])
await vi.advanceTimersByTimeAsync(0)
const before = renewControlActivity.mock.calls.length
const before = renewControlActivities.mock.calls.length
for (let tick = 0; tick < 4; tick++) await beat(rebindSocket)
expect(renewControlActivity.mock.calls.length - before).toBe(2)
expect(renewControlActivities.mock.calls.length - before).toBe(2)
registry.drain(0)
vi.advanceTimersByTime(0)
@@ -1222,7 +1195,7 @@ describe('control lease recovery after the session is gone', () => {
.fn<RelayAssignmentStore['activateControl']>()
.mockResolvedValueOnce('control:production-gce-c3:1')
.mockResolvedValueOnce('control:production-gce-c3:2')
const { registry, activate, acquireActivity, renewControlActivity } =
const { registry, activate, acquireActivity, renewControlActivities } =
createRegistry(activateControl)
const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined)
try {
@@ -1231,19 +1204,19 @@ describe('control lease recovery after the session is gone', () => {
const session = registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })!
// The renewal is still in flight when a newer generation takes over.
let failRenewal!: (error: Error) => void
renewControlActivity.mockReturnValueOnce(
new Promise<void>((_resolve, reject) => (failRenewal = reject))
let finishRenewal!: (outcomes: ControlRenewalOutcome[]) => void
renewControlActivities.mockReturnValueOnce(
new Promise<ControlRenewalOutcome[]>((resolve) => (finishRenewal = resolve))
)
await vi.advanceTimersByTimeAsync(RELAY_PROTOCOL_LIMITS.controlPingIntervalMs)
await closeRenewalWindow()
expect(renewControlActivity).toHaveBeenCalledOnce()
expect(renewControlActivities).toHaveBeenCalledOnce()
const newer = new FakeSocket()
await activate(newer as unknown as WebSocket, identity, session, 2, false, 1)
// Its release already removed the lease, so the renewal reports it missing.
failRenewal(new Error('control_activity_not_found'))
finishRenewal(['control_activity_not_found'])
await vi.advanceTimersByTimeAsync(0)
expect(acquireActivity).not.toHaveBeenCalled()
@@ -1658,11 +1631,20 @@ describe('source-owned idle cutover', () => {
userId: identity.sub,
relayHostId: identity.relayHostId,
credentialKind: 'invite',
relayDeviceId: 'device-1',
tokenHash: 'invite-hash',
reservationId: 'reservation-1',
leaseExpiresAt: Date.now() + 1000
},
attachTimer: setTimeout(() => {}, 1000),
credentialActivityId: null
} as never)
credentialActivityId: null,
phonePath: 'db',
timing: {
startedAt: Date.now(),
connOpenAt: Date.now(),
stageMs: { assignment: 0, credential: 0, activity: 0 }
}
})
const attached = h.registry.acceptHostData(
new FakeSocket() as unknown as WebSocket,
'conn',
@@ -1804,18 +1786,10 @@ describe('host data attach owner lookup', () => {
})
}
// The pre-change implementation, kept inline as the oracle the new counts are
// differenced against: two inventory arrays, two independent finds.
function legacyOwnerLookup(
sessions: Map<string, HostSession>,
connId: string
): { owner: HostSession | undefined; session: HostSession | undefined } {
const owner = [...sessions.values()].find((candidate) => candidate.pendingConns.has(connId))
const session = [...sessions.values()].find((candidate) => candidate.pendingConns.has(connId))
return { owner, session }
}
function pendingConn(client: FakeSocket, connTicket: string) {
function pendingConn(
client: FakeSocket,
connTicket: string
): NonNullable<ReturnType<HostSession['pendingConns']['get']>> {
return {
connId: CONN_ID,
connTicket,
@@ -1824,11 +1798,20 @@ describe('host data attach owner lookup', () => {
userId: identity.sub,
relayHostId: identity.relayHostId,
credentialKind: 'invite',
relayDeviceId: 'device-1',
tokenHash: 'invite-hash',
reservationId: 'reservation-1',
leaseExpiresAt: Date.now() + 1000
},
attachTimer: setTimeout(() => {}, 1000),
credentialActivityId: null
} as never
credentialActivityId: null,
phonePath: 'db',
timing: {
startedAt: Date.now(),
connOpenAt: Date.now(),
stageMs: { assignment: 0, credential: 0, activity: 0 }
}
}
}
// Every decoy holds a pending conn of its own, so each membership check the
@@ -1874,31 +1857,25 @@ describe('host data attach owner lookup', () => {
it.each([
{
placement: 'first',
before: { visits: 2000, membership: 2 },
after: { visits: 1, membership: 1 }
},
{
placement: 'middle',
before: { visits: 2000, membership: 1000 },
after: { visits: 500, membership: 500 }
},
{
placement: 'last',
before: { visits: 2000, membership: 2000 },
after: { visits: 1000, membership: 1000 }
},
{
placement: 'absent',
before: { visits: 2000, membership: 2000 },
after: { visits: 1000, membership: 1000 }
}
] as const)(
'visits the inventory once, not twice, for a $placement owner',
async ({ placement, before, after }) => {
async ({ placement, after }) => {
const h = await attachRegistry(placement)
expect(h.sessions.size).toBe(SESSION_COUNT)
const oracle = legacyOwnerLookup(h.sessions, CONN_ID)
const legacy = { ...h.counts }
h.counts.visits = 0
h.counts.membership = 0
const host = new FakeSocket()
@@ -1912,10 +1889,7 @@ describe('host data attach owner lookup', () => {
RELAY_CLOSE_CODE.BAD_OUTER_CREDENTIAL,
'invalid host data ticket'
)
expect(legacy).toEqual(before)
expect({ ...h.counts }).toEqual(after)
expect(oracle.owner).toBe(placement === 'absent' ? undefined : h.owner)
expect(oracle.owner).toBe(oracle.session)
}
)
@@ -1947,7 +1921,6 @@ describe('host data attach owner lookup', () => {
it('rejects on the earlier duplicate owner rather than the later live one', async () => {
const h = await attachRegistry('middle')
h.ordered[0]!.pendingConns.set(CONN_ID, pendingConn(new FakeSocket(), 'stale-ticket') as never)
expect(legacyOwnerLookup(h.sessions, CONN_ID).owner).toBe(h.ordered[0])
h.counts.visits = 0
h.counts.membership = 0
const host = new FakeSocket()
@@ -1958,7 +1931,7 @@ describe('host data attach owner lookup', () => {
expect(h.owner.pendingConns.has(CONN_ID)).toBe(true)
})
it('splices the earlier duplicate owner and leaves the later one untouched', async () => {
it('consumes the earlier duplicate owner on basis failure and leaves the later one untouched', async () => {
const basis = vi.fn().mockRejectedValue(new Error('basis failed'))
const h = await attachRegistry('first', { recordConnectionBasis: basis })
const duplicate = h.ordered[3]!
@@ -2046,11 +2019,11 @@ describe('paced drain', () => {
expect(drainsSent(sockets)).toBe(5)
})
it('fences admission for every session before the first paced send lands', async () => {
it('refuses new host controls before the first paced send lands', async () => {
const { registry, sockets } = await connectHosts(3)
registry.drain(0, { paceWindowMs: 40_000 })
expect(registry.isDraining()).toBe(true)
// A host whose drain has not been sent yet must already be non-authoritative.
// The fleet drain refuses newly arriving host controls immediately.
const socket = new FakeSocket()
registry.acceptControl(socket as unknown as WebSocket, { ...identity, sub: 'user-late' })
expect(socket.close).toHaveBeenCalledWith(RELAY_CLOSE_CODE.DRAINING, 'relay draining')
@@ -2067,7 +2040,7 @@ describe('paced drain', () => {
// Its own send at 40s plus its own 10s grace, not 10s from the drain call.
await vi.advanceTimersByTimeAsync(39_999)
expect(sockets[1]!.readyState).toBe(sockets[1]!.OPEN)
await vi.advanceTimersByTimeAsync(10_001)
await vi.advanceTimersByTimeAsync(1)
expect(sockets[1]!.readyState).toBe(sockets[1]!.CLOSED)
})
@@ -239,37 +239,41 @@ describe('POST /v1/admin/host-whereabouts', () => {
describe('RelayAssignmentStore.hostWhereabouts', () => {
it('reads the assignment row and its open migration by primary key', async () => {
const database = await openInMemoryRelayDatabase()
const store = new RelayAssignmentStore(database, () => 100)
await store.reconcileCells([
{ id: 'cell-a', url: 'https://cell-a.example.test', capacityRequests: 10 },
{ id: 'cell-b', url: 'https://cell-b.example.test', capacityRequests: 10 }
])
const identity = { userId: 'user-a', relayHostId: HOST }
expect(await store.hostWhereabouts(identity)).toBeNull()
try {
const store = new RelayAssignmentStore(database, () => 100)
await store.reconcileCells([
{ id: 'cell-a', url: 'https://cell-a.example.test', capacityRequests: 10 },
{ id: 'cell-b', url: 'https://cell-b.example.test', capacityRequests: 10 }
])
const identity = { userId: 'user-a', relayHostId: HOST }
expect(await store.hostWhereabouts(identity)).toBeNull()
const assigned = await store.assign(identity)
expect(await store.hostWhereabouts(identity)).toEqual({
cellId: assigned.cellId,
assignmentEpoch: assigned.assignmentEpoch,
leaseExpiresAt: assigned.leaseExpiresAt,
openMigration: null
})
const assigned = await store.assign(identity)
expect(await store.hostWhereabouts(identity)).toEqual({
cellId: assigned.cellId,
assignmentEpoch: assigned.assignmentEpoch,
leaseExpiresAt: assigned.leaseExpiresAt,
openMigration: null
})
await database.query(
`INSERT INTO relay_assignment_migrations
await database.query(
`INSERT INTO relay_assignment_migrations
(user_id, relay_host_id, source_cell_id, target_cell_id, previous_epoch, assignment_epoch,
source_request_units, target_reserved_units, expires_at, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
['user-a', HOST, 'cell-a', 'cell-b', 1, 2, 1, 1, 900, 100, 100]
)
expect((await store.hostWhereabouts(identity))?.openMigration).toEqual({
sourceCellId: 'cell-a',
targetCellId: 'cell-b',
previousEpoch: 1,
assignmentEpoch: 2,
expiresAt: 900,
targetRegisteredAt: null
})
['user-a', HOST, 'cell-a', 'cell-b', 1, 2, 1, 1, 900, 100, 100]
)
expect((await store.hostWhereabouts(identity))?.openMigration).toEqual({
sourceCellId: 'cell-a',
targetCellId: 'cell-b',
previousEpoch: 1,
assignmentEpoch: 2,
expiresAt: 900,
targetRegisteredAt: null
})
} finally {
await database.close()
}
})
})
@@ -86,12 +86,45 @@ describe('idle cutover durable reconciliation', () => {
)
})
await locked
const transaction = database.transaction.bind(database)
let reached!: () => void
const requested = new Promise<void>((resolve) => {
reached = resolve
})
let waiterPid: number | undefined
vi.spyOn(database, 'transaction').mockImplementation(async (operation, options) => {
reached()
return await transaction(async (tx) => {
if (database.dialect === 'postgres') {
waiterPid = Number((await tx.query('SELECT pg_backend_pid() AS pid'))[0]!.pid)
}
return await operation(tx)
}, options)
})
let settled = false
const reconciliation = store.reconcileIdleRegionalRehome(request).finally(() => {
settled = true
})
try {
await new Promise<void>((resolve) => setImmediate(resolve))
await requested
if (database.dialect === 'postgres') {
await expect
.poll(
async () => {
if (waiterPid === undefined) {
return false
}
const rows = await database.query(
`SELECT 1 FROM pg_stat_activity
WHERE pid = ? AND wait_event_type = 'Lock' AND query LIKE '%relay_assignments%'`,
[waiterPid]
)
return rows.length === 1
},
{ timeout: 900, interval: 10 }
)
.toBe(true)
}
expect(settled).toBe(false)
} finally {
release()
@@ -226,9 +226,39 @@ describe('constrained idle regional assignment transaction', () => {
expect(await store.selectIdleRegionalRehomeCandidates(safety)).toHaveLength(1)
})
it('leaves the candidate page offset untouched across a closed dispatch budget', async () => {
it('leaves the candidate page cursor untouched across a closed dispatch budget', async () => {
const { store, database, safety } = await setup()
for (const table of [
'relay_assignments',
'relay_assignment_activity_leases',
'relay_control_capabilities',
'relay_region_decisions'
]) {
const template = (
await database.query(`SELECT * FROM ${table} WHERE user_id = ? AND relay_host_id = ?`, [
identity.userId,
identity.relayHostId
])
)[0]!
const columns = Object.keys(template)
for (let index = 0; index < 100; index++) {
const values = columns.map((column) =>
column === 'user_id' || column === 'relay_host_id' ? '?' : column
)
await database.query(
`INSERT INTO ${table} (${columns.join(', ')}) SELECT ${values.join(', ')} FROM ${table}
WHERE user_id = ? AND relay_host_id = ?`,
[
`idle-store-test-${String(index).padStart(3, '0')}`,
`pagehost${String(index).padStart(8, '0')}`,
identity.userId,
identity.relayHostId
]
)
}
}
const first = await store.selectIdleRegionalRehomeCandidates(safety)
expect(first).toHaveLength(100)
await database.query(
`UPDATE relay_region_rehome_worker_state SET next_dispatch_at = ? WHERE worker_id = 'global'`,
[safety.observedAt + 1]
@@ -237,7 +267,10 @@ describe('constrained idle regional assignment transaction', () => {
await database.query(
`UPDATE relay_region_rehome_worker_state SET next_dispatch_at = 0 WHERE worker_id = 'global'`
)
expect(await store.selectIdleRegionalRehomeCandidates(safety)).toEqual(first)
const next = await store.selectIdleRegionalRehomeCandidates(safety)
expect(next).toHaveLength(1)
expect(next[0]!.relayHostId).toBe('pagehost00000099')
expect(first.some((c) => c.relayHostId === next[0]!.relayHostId)).toBe(false)
})
it('progresses past a full page of busy candidates without writing eligibility state', async () => {
@@ -291,8 +324,8 @@ describe('constrained idle regional assignment transaction', () => {
const { store, safety, request, database } = await setup()
const held = holdStatement(database, 'SELECT * FROM relay_region_rehome_control')
const commit = store.commitIdleRegionalRehome(request, safety)
await held.entered
try {
await held.entered
await store.activateControl(identity, {
cellId: 'source',
assignmentEpoch: 1,
@@ -302,6 +335,7 @@ describe('constrained idle regional assignment transaction', () => {
})
} finally {
held.release()
await commit
}
expect(await commit).toEqual({ outcome: 'deferred', reason: 'candidate-ineligible' })
expect(await store.reconcileIdleRegionalRehome(request)).toBe('stale')
@@ -322,10 +356,19 @@ describe('constrained idle regional assignment transaction', () => {
idleRegionalRehome: true
})
const rejected = expect(replacement).rejects.toThrow('wrong_assignment')
held.release()
expect(await commit).toEqual({ outcome: 'committed' })
await rejected
expect(await store.resolve(identity)).toMatchObject({ cellId: 'target', assignmentEpoch: 2 })
try {
held.release()
expect(await commit).toEqual({ outcome: 'committed' })
await rejected
expect(await store.resolve(identity)).toMatchObject({ cellId: 'target', assignmentEpoch: 2 })
} finally {
held.release()
try {
await commit
} finally {
await rejected
}
}
})
it('finds the committed attempt after its database reply is lost', async () => {
@@ -1,7 +1,6 @@
import { afterEach, describe, expect, it, vi } from 'vitest'
import { RelayAssignmentStore } from './assignment-store.js'
import type { RelayDatabase } from './database.js'
import { IDLE_REHOME_DECISION_WINDOW } from './idle-regional-rehome-selection.js'
import { openIdleRehomeTestDatabase } from './idle-regional-rehome-test-database.js'
// One source cell and three targets, so a poll has to rank targets per host
@@ -176,22 +175,33 @@ describe('idle regional rehome candidate window', () => {
it('reads a bounded window of decisions however many hosts are eligible', async () => {
const { store, database, safety } = await setup()
await seedHost(store, identity)
await cloneHosts(database, identity, IDLE_REHOME_DECISION_WINDOW + 200)
const query = vi.spyOn(database, 'query')
await store.selectIdleRegionalRehomeCandidates(safety)
const calls = query.mock.calls.map((call) => call[0])
const window = calls.findIndex((sql) => /FROM relay_region_decisions\s*$/m.test(sql))
expect(window).toBeGreaterThanOrEqual(0)
expect(query.mock.calls[window]![1]!.at(-1)).toBe(IDLE_REHOME_DECISION_WINDOW)
// No statement pages by OFFSET any more: that was the cost that grew with the rollout.
expect(calls.some((sql) => /OFFSET/i.test(sql))).toBe(false)
await cloneHosts(database, identity, 700)
const query = database.query.bind(database)
const decisionRows: number[] = []
vi.spyOn(database, 'query').mockImplementation(async (sql, params) => {
const rows = await query(sql, params)
if (/^SELECT user_id, relay_host_id FROM relay_region_decisions/.test(sql)) {
decisionRows.push(rows.length)
}
return rows
})
const first = await store.selectIdleRegionalRehomeCandidates(safety)
const next = await store.selectIdleRegionalRehomeCandidates(safety)
expect(decisionRows.length).toBeGreaterThan(0)
for (const count of decisionRows) {
expect(count).toBeLessThanOrEqual(500)
}
expect(first).toHaveLength(102)
expect(next).toHaveLength(102)
const firstKeys = new Set(first.map((c) => `${c.userId}/${c.targetCellId}`))
expect(next.every((c) => !firstKeys.has(`${c.userId}/${c.targetCellId}`))).toBe(true)
})
it('keeps the window\'s last host when a decision turns eligible between the two reads', async () => {
it("keeps the window's last host when a decision turns eligible between the two reads", async () => {
const { store, database, safety, now } = await setup()
await seedHost(store, identity)
// Exactly one full window, whose last key in sort order is the seeded host.
await cloneHosts(database, identity, IDLE_REHOME_DECISION_WINDOW - 1)
await cloneHosts(database, identity, 499)
await database.query(
"UPDATE relay_assignment_activity_leases SET expires_at = ? WHERE user_id LIKE 'clone-%'",
[now - 1]
@@ -225,6 +235,7 @@ describe('idle regional rehome candidate window', () => {
return rows
})
const candidates = await store.selectIdleRegionalRehomeCandidates(safety)
expect(inserted).toBe(true)
expect(candidates.map((candidate) => candidate.userId)).toEqual([
identity.userId,
identity.userId,
@@ -237,20 +248,24 @@ describe('idle regional rehome candidate window', () => {
await seedHost(store, identity)
await cloneHosts(database, identity, 120)
const seen = new Set<string>()
let pages = 0
let wrapped = false
// 121 hosts x 3 targets is 363 candidates, so the page cap has to be hit
// several times before the window runs out and the cursor wraps.
for (let poll = 0; poll < 20 && !wrapped; poll++) {
const page = await store.selectIdleRegionalRehomeCandidates(safety)
pages += 1
const before = seen.size
for (const candidate of page) seen.add(`${candidate.userId}/${candidate.targetCellId}`)
if (seen.size === before && page.length > 0) wrapped = true
if (page.length < 3) wrapped = true
expect(page.length).toBeGreaterThan(0)
expect(page.length).toBeLessThanOrEqual(102)
for (const candidate of page) {
const key = `${candidate.userId}/${candidate.targetCellId}`
if (seen.has(key)) {
expect(seen.size).toBe(363)
wrapped = true
} else {
expect(wrapped).toBe(false)
seen.add(key)
}
}
}
expect(pages).toBeGreaterThan(1)
expect(seen.size).toBe(121 * 3)
expect(seen.size).toBe(363)
expect(wrapped).toBe(true)
})
it('does not stall on a host the window found but the join rejected', async () => {
@@ -1,6 +1,7 @@
import { afterEach, describe, expect, it, vi } from 'vitest'
import type { RelayAssignmentStore } from './assignment-store.js'
import type { RelayConfig } from './config.js'
import type { RegionalRehomeSafetySnapshot } from './relay-observability.js'
import { startRegionalRehomeWorker } from './regional-rehome-worker.js'
const candidate = {
@@ -15,6 +16,15 @@ const candidate = {
sourceGeneration: 3,
targetCellId: 'target'
}
const safety = {
observedAt: 100,
sqlFailures: 0,
reconnects: 0,
controlActivityRecoveryFailures: 0,
databasePoolWaiting: 0,
databasePoolWaitersMax: 0,
databasePoolWaitMsMax: 0
} satisfies RegionalRehomeSafetySnapshot
const config = {
role: 'director',
regionCorrectionCohortPercent: 100,
@@ -37,7 +47,7 @@ function setup(fetch: typeof globalThis.fetch) {
recordRegionalRehomeDispatchFailure
} as unknown as RelayAssignmentStore,
{
safetySnapshot: () => ({ observedAt: 100 }) as never,
safetySnapshot: () => safety,
intervalMs: 60_000,
identityToken: async () => 'private-token',
fetch
@@ -58,19 +68,22 @@ describe('idle regional worker dispatch', () => {
Response.json({ v: 1, outcome: 'committed' })
)
const c = setup(fetch)
await vi.waitFor(() => expect(c.selectIdleRegionalRehomeCandidates).toHaveBeenCalledOnce())
await c.worker.run()
c.worker.stop()
expect(c.claimRegionalRehome).not.toHaveBeenCalled()
expect(fetch).toHaveBeenCalledOnce()
const [url, init] = fetch.mock.calls[0]!
expect(String(url)).toBe('https://source.example.test/v1/admin/host-idle-rehome')
const { sourceCellUrl: _, ...request } = candidate
expect(JSON.parse(String(init?.body))).toEqual({
...request,
cohortPercent: 100,
directorSafety: { observedAt: 100 }
})
try {
await vi.waitFor(() => expect(c.selectIdleRegionalRehomeCandidates).toHaveBeenCalledOnce())
await c.worker.run()
expect(c.claimRegionalRehome).not.toHaveBeenCalled()
expect(fetch).toHaveBeenCalledOnce()
const [url, init] = fetch.mock.calls[0]!
expect(String(url)).toBe('https://source.example.test/v1/admin/host-idle-rehome')
const { sourceCellUrl: _, ...request } = candidate
expect(JSON.parse(String(init?.body))).toEqual({
...request,
cohortPercent: 100,
directorSafety: safety
})
} finally {
c.worker.stop()
}
})
it('progresses past busy hosts without charging a dispatch failure', async () => {
const fetch = vi
@@ -78,28 +91,40 @@ describe('idle regional worker dispatch', () => {
.mockResolvedValueOnce(Response.json({ v: 1, outcome: 'busy' }))
.mockResolvedValueOnce(Response.json({ v: 1, outcome: 'committed' }))
const c = setup(fetch)
await vi.waitFor(() => expect(c.selectIdleRegionalRehomeCandidates).toHaveBeenCalledOnce())
c.selectIdleRegionalRehomeCandidates.mockResolvedValue([
candidate,
{
...candidate,
relayHostId: 'ponmlkjihgfedcba',
attemptId: '33333333-3333-4333-8333-333333333333'
}
])
await c.worker.run()
c.worker.stop()
expect(fetch).toHaveBeenCalledTimes(2)
expect(c.recordRegionalRehomeDispatchFailure).not.toHaveBeenCalled()
try {
await vi.waitFor(() => expect(c.selectIdleRegionalRehomeCandidates).toHaveBeenCalledOnce())
c.selectIdleRegionalRehomeCandidates.mockResolvedValue([
candidate,
{
...candidate,
relayHostId: 'ponmlkjihgfedcba',
attemptId: '33333333-3333-4333-8333-333333333333'
}
])
await c.worker.run()
expect(fetch).toHaveBeenCalledTimes(2)
expect(c.recordRegionalRehomeDispatchFailure).not.toHaveBeenCalled()
} finally {
c.worker.stop()
}
})
it('does not charge a lost response as a claimed migration failure', async () => {
const warning = vi.spyOn(console, 'warn').mockImplementation(() => undefined)
const fetch = vi.fn<typeof globalThis.fetch>(async () => {
throw new Error('response lost')
})
const c = setup(fetch)
await vi.waitFor(() => expect(c.selectIdleRegionalRehomeCandidates).toHaveBeenCalledOnce())
await c.worker.run()
c.worker.stop()
expect(c.recordRegionalRehomeDispatchFailure).not.toHaveBeenCalled()
try {
await vi.waitFor(() => expect(c.selectIdleRegionalRehomeCandidates).toHaveBeenCalledOnce())
await c.worker.run()
expect(fetch).toHaveBeenCalledOnce()
expect(warning).toHaveBeenCalledWith(
expect.stringContaining('"event":"orca_relay_idle_rehome_request_failed"')
)
expect(warning).toHaveBeenCalledWith(expect.stringContaining('"outcomes":{"failed":1}'))
expect(c.recordRegionalRehomeDispatchFailure).not.toHaveBeenCalled()
} finally {
c.worker.stop()
}
})
})
@@ -37,50 +37,57 @@ describePostgres('PostgreSQL migration recovery', () => {
})
afterAll(async () => {
await database.query(
`DELETE FROM relay_control_connection_reservations
try {
await database.query(
`DELETE FROM relay_control_connection_reservations
WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_post_drain_migration_pins WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_assignment_migration_incarnations WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_assignment_activity_leases WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_assignment_migrations WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(`DELETE FROM relay_assignments WHERE user_id LIKE 'recovery-user-%'`)
await database.query(
`DELETE FROM relay_cell_fence_apply_invocations WHERE attempt_id IN (
)
await database.query(
`DELETE FROM relay_post_drain_migration_pins WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_assignment_migration_incarnations WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_assignment_activity_leases WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_assignment_migrations WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(
`DELETE FROM relay_control_capabilities WHERE user_id LIKE 'recovery-user-%'`
)
await database.query(`DELETE FROM relay_assignments WHERE user_id LIKE 'recovery-user-%'`)
await database.query(
`DELETE FROM relay_cell_fence_apply_invocations WHERE attempt_id IN (
SELECT attempt_id FROM relay_cell_fence_attempts
WHERE cell_id LIKE 'recovery-cell-%'
)`
)
await database.query(
`DELETE FROM relay_cell_committed_fences WHERE cell_id LIKE 'recovery-cell-%'`
)
await database.query(
`DELETE FROM relay_cell_legacy_fence_adoptions
)
await database.query(
`DELETE FROM relay_cell_committed_fences WHERE cell_id LIKE 'recovery-cell-%'`
)
await database.query(
`DELETE FROM relay_cell_legacy_fence_adoptions
WHERE cell_id LIKE 'recovery-cell-%'`
)
await database.query(
`DELETE FROM relay_cell_fence_plan_bindings WHERE attempt_id IN (
)
await database.query(
`DELETE FROM relay_cell_fence_plan_bindings WHERE attempt_id IN (
SELECT attempt_id FROM relay_cell_fence_attempts
WHERE cell_id LIKE 'recovery-cell-%'
)`
)
await database.query(
`DELETE FROM relay_cell_fence_attempts WHERE cell_id LIKE 'recovery-cell-%'`
)
await database.query(`DELETE FROM relay_cell_fences WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cell_runtime WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cell_admission WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cells WHERE cell_id LIKE 'recovery-cell-%'`)
await database.close()
)
await database.query(
`DELETE FROM relay_cell_fence_attempts WHERE cell_id LIKE 'recovery-cell-%'`
)
await database.query(`DELETE FROM relay_cell_fences WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cell_runtime WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cell_admission WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cell_regions WHERE cell_id LIKE 'recovery-cell-%'`)
await database.query(`DELETE FROM relay_cells WHERE cell_id LIKE 'recovery-cell-%'`)
} finally {
await database?.close()
}
})
async function fixture(replacementCapacity = 20): Promise<RecoveryFixture> {
@@ -452,7 +459,9 @@ describePostgres('PostgreSQL migration recovery', () => {
input.heartbeat(input.cells.source)
])
expect(heartbeatResult.status).toBe('fulfilled')
expect(['fulfilled', 'rejected']).toContain(commit.status)
if (commit.status === 'rejected') {
expect(commit.reason).toMatchObject({ message: 'legacy_cell_fence_not_active' })
}
expect(
await database.query(
`SELECT cell_id FROM relay_cell_legacy_fence_adoptions WHERE cell_id = ?`,
@@ -673,7 +682,7 @@ describePostgres('PostgreSQL migration recovery', () => {
expect(await reservations(input.cells)).toEqual({ source: 0, failed: 1, replacement: 0 })
})
it('fails dead-source completion without a stale source heartbeat', async () => {
it('requires fence evidence for dead-source completion', async () => {
const input = await fixture()
await input.store.releaseActivity(input.identity, input.sourceControlId)
@@ -136,18 +136,6 @@ describe('PlacementLoadBand', () => {
expect(lines[0]?.fallbacks).toBeGreaterThan(0)
})
it('never places past capacity while the fuller cells fill', () => {
const cells: SimulatedCell[] = [
{ cellId: 'cell-empty', reserved: 0, capacity: 100 },
...['cell-b', 'cell-c'].map((cellId) => ({ cellId, reserved: 90, capacity: 100 }))
]
const director = new PlacementLoadBand(seededRandom(11), quiet)
const counts = simulate([director], cells, 120, () => 1_000)
expect(cells.map((cell) => cell.reserved)).toEqual([100, 100, 100])
expect(counts.get('cell-empty')).toBe(100)
})
it('falls back to the least-loaded cell when every candidate is over budget', () => {
const band = new PlacementLoadBand(seededRandom(3), quiet)
const only = [{ cellId: 'cell-a', loadRatio: 0.5 }]
@@ -228,26 +216,34 @@ describe('leastLoadedCell with the load band', () => {
}
it('spreads within the preferred region and keeps an empty US cell out', async () => {
const { store } = await setupRegions()
const counts = await placements(store, 200)
const { database, store } = await setupRegions()
try {
const counts = await placements(store, 200)
expect(counts.get('us-a')).toBeUndefined()
expect(counts.get('asia-a')).toBeLessThanOrEqual(PLACEMENT_INTAKE_SHARE * 200 + 1)
const used = [...counts.values()].filter((count) => count >= 20)
expect(used.length).toBeGreaterThanOrEqual(3)
expect(counts.get('us-a')).toBeUndefined()
expect(counts.get('asia-a')).toBeLessThanOrEqual(PLACEMENT_INTAKE_SHARE * 200 + 1)
const used = [...counts.values()].filter((count) => count >= 20)
expect(used.length).toBeGreaterThanOrEqual(3)
} finally {
await database.close()
}
})
it('fills the preferred region to its hard cap before spilling, never past it', async () => {
const { database, store } = await setupRegions()
const counts = await placements(store, 520)
const rows = await database.query(
`SELECT reserved_requests, capacity_requests FROM relay_cells`
)
try {
const counts = await placements(store, 520)
const rows = await database.query(
`SELECT reserved_requests, capacity_requests FROM relay_cells`
)
// The hard cap is reserved < capacity: five Asia cells hold 500, the rest spill to the US.
expect(counts.get('us-a')).toBe(20)
for (const row of rows) {
expect(Number(row.reserved_requests)).toBeLessThanOrEqual(Number(row.capacity_requests))
// The hard cap is reserved < capacity: five Asia cells hold 500, the rest spill to the US.
expect(counts.get('us-a')).toBe(20)
for (const row of rows) {
expect(Number(row.reserved_requests)).toBeLessThanOrEqual(Number(row.capacity_requests))
}
} finally {
await database.close()
}
})
})
@@ -41,21 +41,23 @@ describe('checked-out PostgreSQL client failure handling', () => {
throw terminated
})
const warning = vi.spyOn(console, 'warn').mockImplementation(() => {})
const database = new PostgresDatabase(poolOf(client) as never)
try {
const database = new PostgresDatabase(poolOf(client) as never)
await expect(
database.transaction(async (transaction) => await transaction.query('SELECT 1'))
).rejects.toBe(terminated)
await expect(
database.transaction(async (transaction) => await transaction.query('SELECT 1'))
).rejects.toBe(terminated)
expect(listenersWhileCheckedOut).toBe(1)
expect(client.listenerCount('error')).toBe(0)
expect(client.released).toEqual([terminated])
expect(client.statements).toEqual(['BEGIN', 'SELECT 1'])
expect(warning).toHaveBeenCalledWith(
'[orca-relay] checked-out PostgreSQL client failed: 57P01 Connection terminated unexpectedly'
)
warning.mockRestore()
expect(listenersWhileCheckedOut).toBe(1)
expect(client.listenerCount('error')).toBe(0)
expect(client.released).toEqual([terminated])
expect(client.statements).toEqual(['BEGIN', 'SELECT 1'])
expect(warning).toHaveBeenCalledWith(
'[orca-relay] checked-out PostgreSQL client failed: 57P01 Connection terminated unexpectedly'
)
} finally {
warning.mockRestore()
}
})
it('releases a healthy client back to the pool with no error', async () => {
@@ -63,22 +63,29 @@ describePostgres('PostgreSQL counter write committed in the same round trip', ()
it('commits the earlier statements and the counter together in one message', async () => {
const sent = vi.spyOn(pg.Client.prototype, 'query')
let messagesForCommit = 0
const result = await database.transaction(async (transaction) => {
await transaction.query(`INSERT INTO ${table}_log (id, note) VALUES (?, ?)`, ['a', 'x'])
const before = sent.mock.calls.length
const committed = await commitWithFinalWrite(transaction, counterUpdate, counterParams("it's", 1))
messagesForCommit = sent.mock.calls.length - before
return committed
})
const texts = sent.mock.calls.map(([text]) => String(text))
sent.mockRestore()
expect(result).toBe(true)
expect(messagesForCommit).toBe(1)
expect(texts.filter((text) => text === 'COMMIT')).toEqual([])
expect(texts.at(-1)).toMatch(/; COMMIT$/)
expect(await counter("it's")).toBe(1)
expect(await logged()).toBe(1)
try {
let messagesForCommit = 0
const result = await database.transaction(async (transaction) => {
await transaction.query(`INSERT INTO ${table}_log (id, note) VALUES (?, ?)`, ['a', 'x'])
const before = sent.mock.calls.length
const committed = await commitWithFinalWrite(
transaction,
counterUpdate,
counterParams("it's", 1)
)
messagesForCommit = sent.mock.calls.length - before
return committed
})
const texts = sent.mock.calls.map(([text]) => String(text))
expect(result).toBe(true)
expect(messagesForCommit).toBe(1)
expect(texts.filter((text) => text === 'COMMIT')).toEqual([])
expect(texts.at(-1)).toMatch(/; COMMIT$/)
expect(await counter("it's")).toBe(1)
expect(await logged()).toBe(1)
} finally {
sent.mockRestore()
}
})
it('rolls back over cap and lets the caller read the row outside the transaction', async () => {
@@ -113,34 +120,45 @@ describePostgres('PostgreSQL counter write committed in the same round trip', ()
expect(await logged()).toBe(0)
})
it('retries a deadlock or lock timeout raised by the fused message and commits once', async () => {
it('retries a deadlock raised by the fused message and commits once', async () => {
const sequence = `${table}_retry_sequence`
const trigger = `${table}_retry_trigger`
const fn = `${table}_retry`
let attempts = 0
let theirAttempts = 0
let otherHolds!: () => void
const otherHolding = new Promise<void>((resolve) => (otherHolds = resolve))
let ourHold!: () => void
const weHold = new Promise<void>((resolve) => (ourHold = resolve))
const theirs = other.transaction(async (transaction) => {
theirAttempts += 1
await transaction.query(`UPDATE ${table} SET n = n WHERE id = 'b'`)
otherHolds()
await weHold
// Waits for 'a', which the first attempt below holds: one side deadlocks.
await transaction.query(`UPDATE ${table} SET n = n WHERE id = 'a'`)
}, { reportRetries: false })
const ours = database.transaction(async (transaction) => {
attempts += 1
await transaction.query(`UPDATE ${table} SET n = n WHERE id = 'a'`)
await otherHolding
ourHold()
return await commitWithFinalWrite(transaction, counterUpdate, counterParams('b', 1))
}, { reportRetries: false })
const [mine, their] = await Promise.allSettled([ours, theirs])
// Whichever side PostgreSQL picks as the victim retries and then succeeds.
expect(mine.status).toBe('fulfilled')
expect(their.status).toBe('fulfilled')
expect(await counter('b')).toBe(1)
expect(attempts + theirAttempts).toBeGreaterThanOrEqual(3)
try {
await admin.query(`CREATE SEQUENCE ${sequence}`)
await admin.query(`CREATE FUNCTION ${fn}() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
IF nextval('${sequence}') = 1 THEN
RAISE EXCEPTION 'injected fused deadlock' USING ERRCODE = '40P01';
END IF;
RETURN NEW;
END $$`)
await admin.query(`CREATE TRIGGER ${trigger} BEFORE UPDATE ON ${table}
FOR EACH ROW EXECUTE FUNCTION ${fn}()`)
const result = await database.transaction(
async (transaction) => {
attempts += 1
await transaction.query(`INSERT INTO ${table}_log (id, note) VALUES (?, ?)`, [
'a',
'retry'
])
return await commitWithFinalWrite(transaction, counterUpdate, counterParams('a', 1))
},
{ reportRetries: false }
)
expect(result).toBe(true)
expect(attempts).toBe(2)
expect(await counter('a')).toBe(1)
expect(await logged()).toBe(1)
expect(
Number((await admin.query(`SELECT last_value FROM ${sequence}`)).rows[0].last_value)
).toBe(2)
} finally {
await admin.query(`DROP TRIGGER IF EXISTS ${trigger} ON ${table}`)
await admin.query(`DROP FUNCTION IF EXISTS ${fn}()`)
await admin.query(`DROP SEQUENCE IF EXISTS ${sequence}`)
}
}, 20_000)
it('retries a lock timeout raised by the fused message', async () => {
@@ -165,6 +183,8 @@ describePostgres('PostgreSQL counter write committed in the same round trip', ()
it('never retries when the connection is lost under the fused message', async () => {
let attempts = 0
let pid: number | undefined
let rejected: Promise<void> | undefined
const blocker = new pg.Client({ connectionString: databaseUrl })
await blocker.connect()
try {
@@ -172,21 +192,40 @@ describePostgres('PostgreSQL counter write committed in the same round trip', ()
await blocker.query(`SELECT n FROM ${table} WHERE id = 'a' FOR UPDATE`)
const ours = database.transaction(async (transaction) => {
attempts += 1
const pid = Number((await transaction.query('SELECT pg_backend_pid() AS pid'))[0]!.pid)
// Ends the backend while the fused message waits on the row lock.
setTimeout(() => {
void admin.query('SELECT pg_terminate_backend($1)', [pid])
}, 200)
pid = Number((await transaction.query('SELECT pg_backend_pid() AS pid'))[0]!.pid)
return await commitWithFinalWrite(transaction, counterUpdate, counterParams('a', 1))
})
await expect(ours).rejects.toThrow()
rejected = expect(ours).rejects.toMatchObject({ code: '57P01' })
await expect
.poll(
async () => {
if (pid === undefined) {
return false
}
const rows = await admin.query(
`SELECT 1 FROM pg_stat_activity
WHERE pid = $1 AND wait_event_type = 'Lock' AND query LIKE '%; COMMIT'`,
[pid]
)
return rows.rowCount === 1
},
{ timeout: 2_000, interval: 10 }
)
.toBe(true)
expect(
(await admin.query('SELECT pg_terminate_backend($1) AS terminated', [pid])).rows
).toEqual([{ terminated: true }])
await rejected
} finally {
await blocker.query('ROLLBACK').catch(() => undefined)
await blocker.end()
try {
await blocker.query('ROLLBACK')
} finally {
await blocker.end()
await rejected
}
}
expect(attempts).toBe(1)
expect(await counter('a')).toBe(0)
// The pool still serves after dropping the dead client.
await expect(database.query('SELECT 1 AS one')).resolves.toEqual([{ one: 1 }])
}, 20_000)
@@ -61,6 +61,10 @@ describePostgres('PostgreSQL drain-send locking', () => {
source.id,
target.id
])
await database.query(`DELETE FROM relay_cell_regions WHERE cell_id IN (?, ?)`, [
source.id,
target.id
])
await database.query(`DELETE FROM relay_cells WHERE cell_id IN (?, ?)`, [
source.id,
target.id
@@ -133,7 +137,10 @@ describePostgres('PostgreSQL drain-send locking', () => {
})
).rejects.toThrow('drain_application_receipt_missing')
await expect(
database.query(`SELECT drain_attempt_id FROM relay_post_drain_migration_pins`)
database.query(
`SELECT drain_attempt_id FROM relay_post_drain_migration_pins WHERE user_id = ? AND relay_host_id = ?`,
[identity.userId, identity.relayHostId]
)
).resolves.toEqual([{ drain_attempt_id: attemptId }])
})
@@ -1,22 +1,19 @@
import pg from 'pg'
import { describe, expect, it, vi } from 'vitest'
import { absorbPostgresIdleClientErrors } from './database.js'
describe('PostgreSQL idle-client failure handling', () => {
it('absorbs the pool error without logging connection details', () => {
let listener: ((error: Error) => void) | undefined
const pool = {
on: vi.fn((_event: string, value: (error: Error) => void) => {
listener = value
return pool
})
}
it('absorbs the pool error without logging connection details', async () => {
const pool = new pg.Pool()
const warning = vi.spyOn(console, 'warn').mockImplementation(() => {})
absorbPostgresIdleClientErrors(pool as never)
expect(() => listener?.(new Error('postgres://user:secret@database'))).not.toThrow()
expect(warning).toHaveBeenCalledWith('[orca-relay] idle PostgreSQL client failed')
expect(JSON.stringify(warning.mock.calls)).not.toContain('secret')
warning.mockRestore()
try {
absorbPostgresIdleClientErrors(pool)
expect(() => pool.emit('error', new Error('postgres://user:secret@database'))).not.toThrow()
expect(warning).toHaveBeenCalledWith('[orca-relay] idle PostgreSQL client failed')
expect(JSON.stringify(warning.mock.calls)).not.toContain('secret')
} finally {
warning.mockRestore()
await pool.end()
}
})
})
@@ -33,6 +33,9 @@ describePostgres('PostgreSQL lock-wait sample', () => {
})
afterAll(async () => {
for (const table of ['relay_cell_regions', 'relay_cell_admission']) {
await directorDatabase?.query(`DELETE FROM ${table} WHERE cell_id = ?`, [cell.id])
}
await directorDatabase?.query(`DELETE FROM relay_cells WHERE cell_id = ?`, [cell.id])
await cellDatabase?.close()
await directorDatabase?.close()
@@ -124,6 +124,7 @@ describe('computer-use smoke script', () => {
encoding: 'utf8',
env: {
...process.env,
ORCA_COMPUTER_SMOKE_APPS: undefined,
ORCA_COMPUTER_SMOKE_CLI_PATH: cliPath,
ORCA_COMPUTER_SMOKE_USER_DATA_PATH: path.join(root, 'user-data')
}
@@ -57,11 +57,6 @@ describe('counterbalanced benchmark schedule', () => {
const login = summarizeBenchmarkSamples(samples.login)
const fast = summarizeBenchmarkSamples(samples.fast)
expect(fast.medianMs - login.medianMs).toBe(trueDuration.fast - trueDuration.login)
const lowerMedian = (values) => [...values].sort((left, right) => left - right)[9]
expect(lowerMedian(samples.fast) - lowerMedian(samples.login)).toBe(
trueDuration.fast - trueDuration.login - driftPerLaunch
)
})
it('bounds the descriptive p95 bias to one linear-drift launch slot', () => {
+1 -15
View File
@@ -61,26 +61,12 @@ describe('latestPreviousPublishedDesktopReleaseTag', () => {
it('bounds stable notes to the previous stable release when rcs exist', () => {
expect(
latestPreviousPublishedDesktopReleaseTag(
[release('v1.4.35'), release('v1.4.36-rc.0'), release('v1.4.36')],
[release('v1.4.35'), release('v1.4.36-rc.0'), release('v1.4.36-rc.6'), release('v1.4.36')],
'v1.4.36'
)
).toBe('v1.4.35')
})
it('does not collapse a stable changelog to its rc-to-stable version bump', () => {
expect(
latestPreviousPublishedDesktopReleaseTag(
[
release('v1.4.120'),
release('v1.4.121-rc.0'),
release('v1.4.121-rc.6'),
release('v1.4.121')
],
'v1.4.121'
)
).toBe('v1.4.120')
})
it('bounds the first rc notes to the previous stable release', () => {
expect(
latestPreviousPublishedDesktopReleaseTag(
+2 -9
View File
@@ -22,16 +22,14 @@ describe('createDailyBuildVersion', () => {
const version = createDailyBuildVersion('1.4.160-rc.3', new Date('2026-07-28T13:00:00Z'))
expect(version).toBe('1.4.160-daily.202607281300')
expect(compareAppVersions(version, '1.4.160-rc.3')).toBeLessThan(0)
expect(compareAppVersions('1.4.160-rc.3-daily.202607281300', '1.4.160-rc.3')).toBeGreaterThan(0)
})
// Why: 'daily' sorts before 'hourly' alphabetically, so a daily of the same
// base never outranks an hourly — both stay below rc/stable and only the
// channel picker offers them.
it('sorts below the hourly build of the same base version', () => {
expect(
compareAppVersions('1.4.160-daily.202607281300', '1.4.160-hourly.202607281400')
).toBeLessThan(0)
const version = createDailyBuildVersion('1.4.160', new Date('2026-07-28T13:00:00Z'))
expect(compareAppVersions(version, '1.4.160-hourly.202607281400')).toBeLessThan(0)
})
it('rejects invalid input', () => {
@@ -44,11 +42,6 @@ describe('formatDailyReleaseName', () => {
const name = (iso, buildNumber = 1, commit = 'e698241abcde') =>
formatDailyReleaseName('1.4.163-daily.x', buildNumber, commit, new Date(iso))
it('renders version, number, Pacific timestamp, and short sha', () => {
// 17:15 UTC is 10:15AM PDT in July (the daily cut time).
expect(name('2026-07-28T17:15:00Z')).toBe('1.4.163 • 01 • Jul 28, 10:15AM • e698241')
})
// Why both sides of DST: the tag's stamp is UTC and the title is Pacific, so
// the offset between them is not a constant. A test pinned to one season would
// pass all summer and start failing in November.
@@ -1,4 +1,4 @@
import { describe, expect, it } from 'vitest'
import { describe, expect, it, vi } from 'vitest'
import {
readPublishedVersionsFromEnv,
resolveDevChannelBaseVersion
@@ -39,13 +39,6 @@ describe('dev channel base version', () => {
)
})
// Why tags rather than GitHub releases: unpublishing a buggy cut deletes the
// GitHub release and leaves the tag. Releases-only then treated 1.4.202 as
// free, so hourlies sat on 1.4.202-hourly and sorted below that tagged stable.
it('climbs past a tagged stable that has no GitHub release', () => {
expect(resolveDevChannelBaseVersion('1.4.197', ['v1.4.201', 'v1.4.202'])).toBe('1.4.203')
})
// 2026-09-14: v1.4.202's GitHub release was deleted for a bug after hourlies
// had already shipped as 1.4.203. Without the channel tags as a floor, the
// next hourlies would have been 1.4.202-hourly, which electron-updater will
@@ -80,9 +73,19 @@ describe('dev channel base version', () => {
expect(resolveDevChannelBaseVersion('1.4.0', ['v2.0.0'])).toBe('2.0.1')
})
it('splits an env tag list on any whitespace', () => {
expect(readPublishedVersionsFromEnv('v1.4.167\nv1.4.166\n')).toEqual(['v1.4.167', 'v1.4.166'])
it('reads whitespace-separated tags from explicit input or the environment', () => {
expect(readPublishedVersionsFromEnv(' \tv1.4.167\r\nv1.4.166\n')).toEqual([
'v1.4.167',
'v1.4.166'
])
expect(readPublishedVersionsFromEnv('')).toEqual([])
expect(readPublishedVersionsFromEnv(undefined)).toEqual([])
try {
vi.stubEnv('ORCA_PUBLISHED_VERSIONS', 'v1.4.170\tv1.4.169')
expect(readPublishedVersionsFromEnv()).toEqual(['v1.4.170', 'v1.4.169'])
vi.stubEnv('ORCA_PUBLISHED_VERSIONS', undefined)
expect(readPublishedVersionsFromEnv()).toEqual([])
} finally {
vi.unstubAllEnvs()
}
})
})
@@ -39,14 +39,6 @@ function patchesUnder(dockTitle: string, branch: string) {
}
describe('dev-electron-bundle-identity', () => {
it('leaves process.env untouched, including its object identity', () => {
const envBefore = process.env
const snapshot = { ...process.env }
patchesUnder('Orca: some-branch', 'some-branch')
expect(process.env).toBe(envBefore)
expect({ ...process.env }).toEqual(snapshot)
})
it('gives the dev app a legible display name so notifications are not just "Electron"', () => {
const byKey = Object.fromEntries(
getDevBundlePlistPatches().map((patch) => [patch.key, patch.value])
@@ -79,15 +71,4 @@ describe('dev-electron-bundle-identity', () => {
patchesUnder('Orca: some-worktree @ feature/x', 'feature/x')
)
})
it('leaks no branch, worktree, or title text into any patched value', () => {
const branch = 'fix-login-crash'
const worktree = 'Orca-safe-storage-lock'
for (const patch of patchesUnder(`Orca: ${branch}`, branch)) {
expect(patch.value).not.toContain(branch)
expect(patch.value).not.toContain(worktree)
expect(typeof patch.value).toBe('string')
expect(patch.value.length).toBeGreaterThan(0)
}
})
})
+45 -37
View File
@@ -22,29 +22,34 @@ describe('electron-builder config', () => {
})
it('excludes repo-only source trees from app.asar', () => {
expect(electronBuilderConfig.files).toEqual(
expect.arrayContaining([
'!src{,/**/*}',
'!config{,/**/*}',
'!cloud{,/**/*}',
'!docs{,/**/*}',
'!mobile{,/**/*}',
'!native{,/**/*}',
'!skills{,/**/*}',
'!skill-guides{,/**/*}',
'!skill-stubs{,/**/*}',
'!resources/skills/**',
'!tests{,/**/*}',
'!examples{,/**/*}',
'!pr-evidence{,/**/*}',
'!notes{,/**/*}',
'!{.claude,.grok,.agents,.codex}{,/**/*}',
'!Casks{,/**/*}',
'!{AGENTS.md,CLAUDE.md,DEVELOPING.md,bundle-size-progress.md,ORCHESTRATION_IMPLEMENTATION_CHECKLIST.md,ORCHESTRATION_STRUCTURED_OUTPUT_DESIGN.md}',
'!out/**/*.test.js',
'!resources/plugins/launch/**'
])
)
const matcher = new FileMatcher('/app', '/dest', (value) => value, electronBuilderConfig.files)
matcher.prependPattern('**/*')
const isPacked = matcher.createFilter()
const packs = (repoPath) => isPacked(join('/app', repoPath), { isDirectory: () => false })
for (const sourcePath of [
'src/main/index.ts',
'config/electron-builder.config.cjs',
'cloud/apps/relay/index.ts',
'docs/README.md',
'mobile/app/index.tsx',
'native/windows-cli-launcher/main.cpp',
'skills/release/SKILL.md',
'skill-guides/release.md',
'skill-stubs/release.md',
'resources/skills/current-manifest.json',
'tests/e2e/example.spec.ts',
'examples/example.ts',
'pr-evidence/example.png',
'Casks/orca.rb',
'AGENTS.md',
'out/main/workspace.test.js',
'resources/plugins/launch/example.ts'
]) {
expect(packs(sourcePath), sourcePath).toBe(false)
}
expect(packs('out/main/index.js')).toBe(true)
expect(packs('node_modules/example/docs/index.js')).toBe(true)
expect(packs('node_modules/example/src/index.js')).toBe(true)
})
it('keeps release build staging out of app.asar while preserving runtime output', () => {
@@ -629,21 +634,24 @@ describe('arch-aware packaging guard', () => {
}
})
it('requires the other architecture natives to be installed', () => {
const otherSherpaInstalled = existsSync(
join(REPO_ROOT, 'node_modules', otherSherpa, 'package.json')
)
const otherSherpaExpected = Object.hasOwn(
require('../../package.json').optionalDependencies,
otherSherpa
)
if (otherSherpaExpected && !otherSherpaInstalled) {
expect(() => packHost(OTHER_ARCH)).toThrow(otherSherpa)
expect(() => packHost(OTHER_ARCH)).toThrow('pnpm install:release')
} else if (process.platform !== 'win32') {
expect(() => packHost(OTHER_ARCH)).not.toThrow()
it.skipIf(process.platform === 'win32')(
'requires the other architecture natives to be installed',
() => {
const otherSherpaInstalled = existsSync(
join(REPO_ROOT, 'node_modules', otherSherpa, 'package.json')
)
const otherSherpaExpected = Object.hasOwn(
require('../../package.json').optionalDependencies,
otherSherpa
)
if (otherSherpaExpected && !otherSherpaInstalled) {
expect(() => packHost(OTHER_ARCH)).toThrow(otherSherpa)
expect(() => packHost(OTHER_ARCH)).toThrow('pnpm install:release')
} else {
expect(() => packHost(OTHER_ARCH)).not.toThrow()
}
}
})
)
// The host's own build is the foreign-arch case: a Windows checkout compiles these for its CPU only.
it.runIf(process.platform === 'win32')(
@@ -100,13 +100,7 @@ describe('assertNodePtyJobOwnership', () => {
it('rejects the prebuild that shipped without the job exports', () => {
expect(() => assertNodePtyJobOwnership(onWindows(PREBUILD, CURRENT_ADDON))).toThrow(
/listJobProcessIds, terminateJob, assignCurrentProcessToJob/
)
})
it('names where the bad native came from, so the fix is obvious', () => {
expect(() => assertNodePtyJobOwnership(onWindows(PREBUILD, CURRENT_ADDON))).toThrow(
/prebuilds\/win32-x64/
/listJobProcessIds, terminateJob, assignCurrentProcessToJob[\s\S]*prebuilds\/win32-x64/
)
})
@@ -119,13 +113,7 @@ describe('assertNodePtyJobOwnership', () => {
// child out of its pane's job satisfies all of them.
it('rejects a source build that predates the Cygwin/MSYS breakaway denial', () => {
expect(() => assertNodePtyJobOwnership(onWindows(PATCHED, PRE_MSYS_ADDON))).toThrow(
/predates the Cygwin\/MSYS job-breakaway denial/
)
})
it('tells that build apart by path, and says to rebuild', () => {
expect(() => assertNodePtyJobOwnership(onWindows(PATCHED, PRE_MSYS_ADDON))).toThrow(
/pre-msys\.node[\s\S]*Rebuild node-pty from source/
/pre-msys\.node[\s\S]*predates the Cygwin\/MSYS job-breakaway denial[\s\S]*Rebuild node-pty from source/
)
})
@@ -218,17 +206,12 @@ describe('assertRebuiltConptyDeniesMsysBreakaway', () => {
// falls through to the published prebuild -- the binary that leaks every MSYS
// pane child. That is a broken build, not an absence to shrug at.
it('refuses a same-host rebuild that reported success and produced nothing', () => {
const nodePtyDir = rebuiltInto({ 'package.json': {} })
expect(() =>
assertRebuiltConptyDeniesMsysBreakaway({ nodePtyDir, rebuildArch: 'x64', crossHost: false })
).toThrow(/the rebuild reported success/)
})
it('names both the addon it wanted and the prebuild that would load instead', () => {
const nodePtyDir = rebuiltInto({ 'package.json': {} })
expect(() =>
assertRebuiltConptyDeniesMsysBreakaway({ nodePtyDir, rebuildArch: 'arm64', crossHost: false })
).toThrow(/build[\\/]Release[\s\S]*prebuilds[\\/]win32-arm64/)
).toThrow(
/the rebuild reported success[\s\S]*build[\\/]Release[\s\S]*prebuilds[\\/]win32-arm64/
)
})
// A rebuild that ignored --arch leaves a binary the target cannot load, so
@@ -250,16 +233,9 @@ describe('assertRebuiltConptyDeniesMsysBreakaway', () => {
writeFileSync(join(nodePtyDir, 'build', 'Release', 'conpty.node'), Buffer.alloc(0x200))
expect(() =>
assertRebuiltConptyDeniesMsysBreakaway({ nodePtyDir, rebuildArch: 'x64', crossHost: false })
).toThrow(/is not a PE image[\s\S]*truncated or quarantined/)
})
it('still names the consequence for that file, which is the prebuild', () => {
const nodePtyDir = join(mkdtempSync(join(fixtureDir, 'rebuild-')), 'node-pty')
mkdirSync(join(nodePtyDir, 'build', 'Release'), { recursive: true })
writeFileSync(join(nodePtyDir, 'build', 'Release', 'conpty.node'), Buffer.alloc(0x200))
expect(() =>
assertRebuiltConptyDeniesMsysBreakaway({ nodePtyDir, rebuildArch: 'x64', crossHost: false })
).toThrow(/fall back to the published prebuild/)
).toThrow(
/is not a PE image[\s\S]*fall back to the published prebuild[\s\S]*truncated or quarantined/
)
})
it('accepts one a cross-arch rebuild really did emit for the target', () => {
@@ -280,17 +280,6 @@ describe('bundled skill guide generator', () => {
}
)
it('pins guide sources, projections, and embedded output to LF in Git', async () => {
const attributes = await readFile(path.join(projectDir, '.gitattributes'), 'utf8')
expect(normalizeMarkdown(attributes)).toContain('/skill-guides/*.md text eol=lf\n')
expect(normalizeMarkdown(attributes)).toContain('/skill-stubs/*.md text eol=lf\n')
expect(normalizeMarkdown(attributes)).toContain('/skill-stubs/_shared/*.md text eol=lf\n')
expect(normalizeMarkdown(attributes)).toContain('/skills/*/SKILL.md text eol=lf\n')
expect(normalizeMarkdown(attributes)).toContain(
'/src/cli/bundled-skill-guides.ts text eol=lf\n'
)
})
it('reports stale outputs and write mode repairs all projections', async () => {
const root = await createFixture()
const artifacts = await buildArtifacts(root)
@@ -37,10 +37,6 @@ describe('runtime-required English catalog rule', () => {
])
})
it('keeps a plural entry even when a call site spells it identically', () => {
expect(collectRuntimeRequiredKeys(entries, references).has('count.thing_one')).toBe(true)
})
// The generated file is committed, so a walk-order difference between a
// contributor's machine and CI would make the gate flap forever.
it('produces byte-identical output whatever order the call sites are visited in', () => {
@@ -17,6 +17,11 @@ it('keeps byte-compared artifacts and source LF in an autocrlf checkout', () =>
['src/main/example.ts', lf],
['config/scripts/example.mjs', lf],
['config/scripts/nested/deeper/example.mjs', lf],
['skill-guides/example.md', lf],
['skill-stubs/example.md', lf],
['skill-stubs/_shared/example.md', lf],
['skills/example/SKILL.md', lf],
['src/cli/bundled-skill-guides.ts', lf],
...['cmd', 'bat', 'ps1', 'nsh'].map((extension) => [`config/example.${extension}`, crlf]),
['resources/skills-extra/example.json', crlf],
['vendor/resources/skills/example.json', crlf],
@@ -40,6 +40,10 @@ describe('happy-dom MutationObserver retention', () => {
})
it('keeps delivering records after the weak callback would have been collected', async () => {
const collectGarbage = globalThis.gc
if (typeof collectGarbage !== 'function') {
throw new Error('MutationObserver retention requires --expose-gc')
}
installHappyDomMutationObserverRetention()
const target = document.createElement('div')
document.body.append(target)
@@ -53,14 +57,11 @@ describe('happy-dom MutationObserver retention', () => {
await Promise.resolve()
expect(deliveries).toBe(1)
const collectGarbage = (globalThis as { gc?: () => void }).gc
if (collectGarbage) {
for (let round = 0; round < 5; round += 1) {
await new Promise((resolve) => setTimeout(resolve, 1))
collectGarbage()
}
for (let round = 0; round < 5; round += 1) {
await new Promise((resolve) => setTimeout(resolve, 1))
collectGarbage()
}
await new Promise((resolve) => setTimeout(resolve, 1))
target.replaceChildren(document.createElement('span'))
await Promise.resolve()
@@ -3,13 +3,6 @@ import { Terminal } from '@xterm/xterm'
import { afterEach, describe, expect, it, vi } from 'vitest'
import { installHappyDomOffscreenCanvasCompatibility } from './happy-dom-offscreen-canvas'
type TestOffscreenCanvas = new (
width: number,
height: number
) => {
getContext: (contextType: string, contextAttributes?: unknown) => unknown
}
const openTerminals: Terminal[] = []
describe('happy-dom OffscreenCanvas compatibility', () => {
@@ -22,12 +15,8 @@ describe('happy-dom OffscreenCanvas compatibility', () => {
})
it('delegates adapter-less 2D contexts to the existing HTML canvas double', () => {
const offscreenCanvas = (globalThis as { OffscreenCanvas?: TestOffscreenCanvas })
.OffscreenCanvas
if (!offscreenCanvas) {
expect(installHappyDomOffscreenCanvasCompatibility()).toBe(false)
return
}
const offscreenCanvas = globalThis.OffscreenCanvas
expect(offscreenCanvas).toBeTypeOf('function')
const context = { measureText: () => ({ width: 10 }) }
const getContext = vi
@@ -40,11 +29,8 @@ describe('happy-dom OffscreenCanvas compatibility', () => {
})
it('does not turn unsupported non-2D contexts into test doubles', () => {
const offscreenCanvas = (globalThis as { OffscreenCanvas?: TestOffscreenCanvas })
.OffscreenCanvas
if (!offscreenCanvas) {
return
}
const offscreenCanvas = globalThis.OffscreenCanvas
expect(offscreenCanvas).toBeTypeOf('function')
const getContext = vi.spyOn(HTMLCanvasElement.prototype, 'getContext')
expect(new offscreenCanvas(1, 1).getContext('webgl')).toBeNull()
+31 -15
View File
@@ -24,10 +24,10 @@ Completion requires no unreviewed or stale test files, no unresolved support/scr
| Area | Reviewer | Next batch |
| ------------------------------------------------ | -------------- | -------------------------- |
| `cloud/` | `audit_cloud` | `cloud-0003` (read-only) |
| `config/` | `audit_config` | `config-0003` (read-only) |
| `mobile/` | `audit_mobile` | `mobile-0003` (read-only) |
| `src/`, `native/`, `tests/`, `.github/`, `docs/` | root | Continue after `root-0006` |
| `cloud/` | `audit_cloud` | `cloud-0004` |
| `config/` | `audit_config` | `config-0004` |
| `mobile/` | `audit_mobile` | `mobile-0004` |
| `src/`, `native/`, `tests/`, `.github/`, `docs/` | root | Continue after `root-0013` |
Ownership is disjoint. Within an area, continue in tracked path order after the last batch; explicitly include nonstandard/inline cases and support candidates before closing the area.
@@ -41,19 +41,35 @@ Batch validation lives in `reviews/<area>-<batch>-validation.json`. Local log pa
[PR #32269](https://github.com/stablyai/orca/pull/32269) merged the first 105 reviewed files and 720 original declarations, removing 467 net test lines. Its full PR aggregate and all other checks passed; squash commit `bc99add2897d1e9a77da44630d11eaff5cf81249`.
[PR #32305](https://github.com/stablyai/orca/pull/32305) merged another 210 original files and 1,482 case records, removing 324 net test lines. All required checks and the full PR aggregate passed; squash commit `92dfb4fda69e746e96786ea7af417813ac441394`.
The next batch adds 180 original files and 1,188 case records, plus one re-review after upstream changes. Its 70 changed test files remove 318 net test lines. Case records include static declarations and explicitly classified manual controls; they are not runtime test totals.
Further completed review records:
| Batch | Files | Original cases | Main decisions |
| ------------- | ----: | -------------: | ----------------------------------------------------------------------------------------------------------------- |
| `root-0001` | 14 | 101 | Repair observer reset/readiness; trim allocator and environment-only checks. |
| `root-0002` | 20 | 87 | Exercise installed link callbacks; consolidate cache checks; remove a conditional no-op test. |
| `root-0003` | 6 | 40 | Classify Windows fixtures and standalone cases; retain native clipboard integration; trim exact traversal counts. |
| `root-0004` | 15 | 101 | Remove source-string and capability-only checks; observe pacing in actual mouse delivery. |
| `root-0005` | 4 | 32 | Retain real Windows argument, filesystem and delayed tree-termination boundaries. |
| `root-0006` | 1 | 14 | Retain storage lease ownership, generation conflicts and clock-driven credential caching. |
| `mobile-0002` | 50 | 283 | Consolidate repeated mounts and inventories; fix action routing and deferred SSH assertions. |
| `config-0002` | 50 | 375 | Trim copied policies; fix vacuous assertions and nested Bash fixture isolation. |
| `cloud-0002` | 50 | 449 | Use independent authorization inputs and durable phone state; observe scoped locks and clean migration fixtures. |
| Batch | Files | Case records | Main decisions |
| ------------- | ----------: | -----------: | ----------------------------------------------------------------------------------------------------------------- |
| `root-0001` | 14 | 101 | Repair observer reset/readiness; trim allocator and environment-only checks. |
| `root-0002` | 20 | 87 | Exercise installed link callbacks; consolidate cache checks; remove a conditional no-op test. |
| `root-0003` | 6 | 40 | Classify Windows fixtures and standalone cases; retain native clipboard integration; trim exact traversal counts. |
| `root-0004` | 15 | 101 | Remove source-string and capability-only checks; observe pacing in actual mouse delivery. |
| `root-0005` | 4 | 32 | Retain real Windows argument, filesystem and delayed tree-termination boundaries. |
| `root-0006` | 1 | 14 | Retain storage lease ownership, generation conflicts and clock-driven credential caching. |
| `mobile-0002` | 50 | 283 | Consolidate repeated mounts and inventories; fix action routing and deferred SSH assertions. |
| `config-0002` | 50 | 375 | Trim copied policies; fix vacuous assertions and nested Bash fixture isolation. |
| `cloud-0002` | 50 | 449 | Use independent authorization inputs and durable phone state; observe scoped locks and clean migration fixtures. |
| `root-0007` | 3 | 22 | Trim action/docs inventories; test actual hostile formatter inputs under a VM deadline. |
| `root-0008` | 5 | 5 | Classify filesystem, socket and task retention proofs; distinguish measurements from assertions. |
| `root-0009` | 5 | 6 | Preserve archived browser lifecycle and source-graph proofs with explicit drift limits. |
| `root-0010` | 4 | 6 | Preserve actual Monaco/store lifetime proof and its dependency/source fences. |
| `root-0011` | 2 | 10 | Correct a chunk-size test's memory claim; classify the historical history-window driver. |
| `root-0012` | 8 | 96 | Preserve independent full-reader oracle and every manual parity/growth/allocation/verifier control. |
| `root-0013` | 1 re-review | 7 | Recheck the upstream compiler-gate change; all seven actual build cases pass. |
| `mobile-0003` | 50 | 315 | Remove copied inventories; exercise real editor fallback, discard target and hardware-back delivery. |
| `config-0003` | 50 | 328 | Use actual file matching, generated versions and Git checkout bytes; require real GC/canvas paths. |
| `cloud-0003` | 53 | 400 | Exercise batch renewal, actual replay/SQL, scoped locks, pagination and deterministic transaction errors. |
Archived proofs retain historical source/dependency fences. A drift rejection is recorded as a limitation, never as a current-head test pass. Permanent suites read only as supporting evidence remain pending unless they have their own completed review.
Validation commands, results and platform limits live in each batch's validation JSON. The macOS changes require the native Swift CI job; local Linux runs cannot establish that result. Standalone Windows cases are explicitly enumerated even when the static parser finds no declarations. Fixture/support classifications have no invented runnable cases. All remaining candidates stay pending, and broad discovery still requires final runner/entrypoint reconciliation.
+200 -184
View File
@@ -1,4 +1,4 @@
{"path":".github/actions/cloud-sql-rollout-lease/action-contract.test.mjs","sha256":"854ccd6d3fd2f71e230368c584df88c1a1393fdc5505fe2a4d4f0c666499bb88","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":".github/actions/cloud-sql-rollout-lease/action-contract.test.mjs","sha256":"711d8a6d0afc2dcaaf8f233c2894685bb3e72481d62722be05ccc8261372e324","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/root-0007.jsonl"}
{"path":".github/actions/cloud-sql-rollout-lease/storage-lease.test.mjs","sha256":"1dd2bd63f08125608cdfaf2560eff75f2800b49f1b2b43c52788a23f85ba782d","declarations":14,"signals":["named","declarations"],"status":"reviewed","review":"reviews/root-0006.jsonl"}
{"path":"cloud/apps/push/src/apns-client.test.ts","sha256":"4de5e44d0b2ef7dab8508935c85f14e9dbb19ab2d02026481497399f89c76f69","declarations":8,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0001.jsonl"}
{"path":"cloud/apps/push/src/apns-session-replacement.test.ts","sha256":"e6fb235c1dac08b79a00c641cefc19917219ad049d40d4f680bd05433babd913","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0001.jsonl"}
@@ -88,56 +88,57 @@
{"path":"cloud/apps/relay/src/cell-reserve-rollback.blackbox.test.ts","sha256":"575be0aef560304a9c10f444ea7760e9fe45f3342876fae742b9c0bb3a00c822","declarations":10,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0002.jsonl"}
{"path":"cloud/apps/relay/src/cell-reserve-routes.test.ts","sha256":"bfb6049db1f492b6d65b6cedea72e1a3fa41998776735f3160fa2d2b7308eeb6","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0002.jsonl"}
{"path":"cloud/apps/relay/src/cell-seat-drift.test.ts","sha256":"f763eefde98c42df7825be2de93a6035af2abf9e2fa3612e89a37815539561f4","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0002.jsonl"}
{"path":"cloud/apps/relay/src/cell-seat-feed.test.ts","sha256":"c8a0642b4858af185c2877b2a0f4b1c76e65a33deef6838a766e843eff650fae","declarations":11,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/cell-seat-log.test.ts","sha256":"d5173601a135cf68339ec65df3c0d07629f698f163237a6213771caf0abaec7d","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/config.test.ts","sha256":"96e13eb55b2e856d6278502ae0123148de9808b4bcf8cda77f0a47e3c8d03487","declarations":15,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/connection-reservation-debt-retention.test.ts","sha256":"41d35eaf400f161b6a329113ecffba339326d2ba02fbf633f2e7f6e66bc08abc","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-accept-cell-row-lock-postgres.test.ts","sha256":"4cc5ea469a9d5261d770b910d5ab65a11b54e375674e4fba10454b8fa3a9ea70","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-accept-cell-row-lock.test.ts","sha256":"4c60f182c1b021668ce716a23a6bbaf827c52dcd45d45e9a91ef3065541d7f10","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-lease-recovery-postgres.test.ts","sha256":"303671b93a590a4bf1b0f0ca11e7889df0bedec49b0afa87419333e3bd3cbecb","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-rebind-inventory-lock-postgres.test.ts","sha256":"ba35c4d006cec797fd85bdbadb6632aa48c8b9488fc209c89bc96276647ee641","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-renewal-batch-store.test.ts","sha256":"58425a95d7efe57071ac5c73aca198f3c7ab559f8b72a84be2a66d11e72b0b1c","declarations":12,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-renewal-batch.test.ts","sha256":"0cb0e1bbb0261f62bb2a1fabd329b0f9c0d08947d65e0b02ea8a92a746e3c9f1","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-renewal-postgres.test.ts","sha256":"3df1cf3aad0a7dc794ba8a1d72a4157fcb8b2cf4a4418b80efe5b9601fe631ce","declarations":10,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/control-reservation-reconnect-claim.test.ts","sha256":"f617fb4e79f0cef41507b1b1983b08f97ff5a9520872c7928b677e0f42e2ee4d","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/credential-cleanup-sweep-postgres.test.ts","sha256":"85e76c71b9bf741f926829a51516e0e1280aeb148922d21ddce97dd63f2053d8","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/credential-store-cleanup.test.ts","sha256":"643200d2fcbc61abe423e58452e772bb2d487bfc013d9627d788734e4727fd2e","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/credential-store.test.ts","sha256":"753ce3910596d2905c72ab2289e24e2a1da361141c56b2994a2e9b8f62d2df77","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/database-connect-stall-postgres.test.ts","sha256":"dfa160d2467b14ce891a18ff2a9cba09adfa78c436aec4f3d7bab58e0db9da24","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/database-postgres-timeout.test.ts","sha256":"3497d7e6146ad6fd7a0051c9670d1f71946b867ca33b96615b265e08b8b1d367","declarations":21,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/database-statement-timeout-postgres.test.ts","sha256":"4377fdb2b495aa3eba9370de9d53c365b15e746d843de7b2f15e931da70ede50","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/database-transient-error.test.ts","sha256":"76729a1363b84aabad8b0dbb17489e17aa8c1f60a77dd50657f55d1894c07ef2","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/database.test.ts","sha256":"11a4c7be7489e24733be81606073ef432a683e5ba03b1c4441fb266a64888788","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/dead-cell-evacuation-precheck.test.ts","sha256":"fa3acbdf0094e45a46d5482e5809a100744761471b17368520c4231b46f66a89","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/dead-relay-tables-postgres.test.ts","sha256":"f5d97ad3278402e7715928edaaac1d326c26478f583d31c836cc600a230dd25e","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/director-reserve-placement-status.test.ts","sha256":"59253d3a7b73cddb6eeba362e73e16ec0821fc61a6a4059b36949b0043927ddf","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/drain-migration-row-lookup.test.ts","sha256":"783947cca8f9db3e0fdec0f5c56cdb8c9c422cf5d3db1a7a2bb592cab14b26fb","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/drain-migration-row-scaling.test.ts","sha256":"2adabae89beee885a85d5a58dedfb9e3d3379b6d0045edd088ec399e4023a76c","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/drain-release-cell-row-contention-postgres.test.ts","sha256":"0dc9fe610ebe8ec298c0d61fcd27bc9fc4e0c6cdfdd5ff745e529a36564b518a","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/drain-return-admission.test.ts","sha256":"6d1902ea12f44ea8fb75f532582eb1f9bef02a82679c84c60ca0b676c9b7e2c2","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/floating-promise-census.test.ts","sha256":"5364ef8bf1e5e18aed2795ed0ab32ee7a8021e79f6218f2eabe2adae2141380b","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-close-reason-memory.test.ts","sha256":"20bbb0d25f0de972fc9419975b87bbbabe706ff41bf3c64efa19fd9a3ecba039","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-control-proof-cleanup.test.ts","sha256":"16ebfdec0a7e542316c27b0d53ff319c614c3dffd09feb086dde54042ace1705","declarations":12,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-control-resume-identity.test.ts","sha256":"0a47bbf7d4f824734be27e7851e8cd871531b3fe402a2ca9e665c5a81606320d","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-session-client-accept.test.ts","sha256":"05ec3447db6b3e7758f7964c905e773c070aa36683d8262d1f96a7b3ea7e7366","declarations":19,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-session-drain-release-order.test.ts","sha256":"67cf0d3b4ee29e762f771ff34991dc89e41d5efdc8094ddcaf8d714e14515c71","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-session-preauth-latency.test.ts","sha256":"fd204e24f7dbe3889c4e939cb6adadbd9fbef7c85084faecd314d0df7c9ad5db","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-session-registry.test.ts","sha256":"90534b6173be8f5234822d92126239800deda64e0adfb7c303934fd13ca47818","declarations":75,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-signed-out-rejection.test.ts","sha256":"5bf81f9f83182d458810414dcbc618998e018fabcf142bd0798c0b63c99a644f","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/host-whereabouts-app.test.ts","sha256":"5a2f335ab1b023d1e93ebb4d354f655fa2302d2775aaa803009a585773506a51","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-reconciliation.test.ts","sha256":"4bc34a7385f4b7a6be00471e8ede5e5e2706bd3b799feb73041460c27eaf2123","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-store.test.ts","sha256":"562fb019637e30ff98442789f547b8a7f855f4a137ec71ae76957b549a380f9c","declarations":14,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-window.test.ts","sha256":"1e32a2de9b5a547c65a04578b3f527e44aec82afe63a2974e9e7ec4d00bc86f5","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-worker.test.ts","sha256":"c34eb2c717dc8ac05d238508677fc2f946b40df9f80e6e994f57fc4c6e4ee3a2","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/migration-recovery-postgres.test.ts","sha256":"8c80069a6a4758fb3dfdfc719de569da0773cfee64f512bc46a21e9bf63642d2","declarations":29,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/placement-load-band.test.ts","sha256":"b2642e82ad5844448da6e7e1c47a998b3b96154bc677a8bf29554ec9d856ca67","declarations":10,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/post-proof-close-log.test.ts","sha256":"34c4a6788d688d8ff25de1538a435dffe3cea303b65f69c3b2ee3cf43d79ba50","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-checked-out-client-error.test.ts","sha256":"cee18f05c444278d86ba3506a941d616b3ba5304659d79325e2fb3e206368d1c","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-commit-with-final-write-postgres.test.ts","sha256":"a2fc81bfaca3d3c0270e751ab3fe39edcb51302deffe73180fa7f52ddb366b33","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-drain-send-locking.test.ts","sha256":"a02f2a140ccbf171db79a8a41c8c78d0bb85078e4100ac0340d9c6a807f36bfd","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-idle-client-error.test.ts","sha256":"3cd23450d732ea42c1ebbd6c136d4451564fe8fd80e33984d8037cdcff40d7d2","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-lock-wait-sample-postgres.test.ts","sha256":"aa71d6d74c586b1102b4a8a58f51e6e2dec7a0ecd721ae37732c72ca5699b87e","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-lock-wait-sample.test.ts","sha256":"b5a1cf90b57c891a5fa5fa849cc79338cf7b21de21596562890946f5dd8e8e37","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/cell-seat-feed.test.ts","sha256":"d95676c889380ac05e56c75c51c4fcff1ba6635f856772b86d475c0ce466dc12","declarations":11,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/cell-seat-log.test.ts","sha256":"d5173601a135cf68339ec65df3c0d07629f698f163237a6213771caf0abaec7d","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/config.test.ts","sha256":"96e13eb55b2e856d6278502ae0123148de9808b4bcf8cda77f0a47e3c8d03487","declarations":15,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/connection-reservation-debt-retention.test.ts","sha256":"41d35eaf400f161b6a329113ecffba339326d2ba02fbf633f2e7f6e66bc08abc","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-accept-cell-row-lock-postgres.test.ts","sha256":"4cc5ea469a9d5261d770b910d5ab65a11b54e375674e4fba10454b8fa3a9ea70","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-accept-cell-row-lock.test.ts","sha256":"3ab794c308aeb1f2c738f0c8439999dd3c79442351bf1802834d485ec4fdf1a1","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-lease-recovery-postgres.test.ts","sha256":"303671b93a590a4bf1b0f0ca11e7889df0bedec49b0afa87419333e3bd3cbecb","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-rebind-inventory-lock-postgres.test.ts","sha256":"90d3e5a930b567e88bad1c5b372ce2d46917a209057f5f91252494c3eb2611f5","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-renewal-batch-store.test.ts","sha256":"856bce7b93b3ca0fb9aed7bd59ff0fc4d6909b5b13345e7e897eaae8d40c3797","declarations":11,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-renewal-batch.test.ts","sha256":"0cb0e1bbb0261f62bb2a1fabd329b0f9c0d08947d65e0b02ea8a92a746e3c9f1","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-renewal-postgres.test.ts","sha256":"1c5032198245240fbdfdba935a9214116cd8798c71e85dceed930050c6fe9e9a","declarations":10,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/control-reservation-reconnect-claim.test.ts","sha256":"f617fb4e79f0cef41507b1b1983b08f97ff5a9520872c7928b677e0f42e2ee4d","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/credential-cleanup-sweep-postgres.test.ts","sha256":"5129a0dbd975ad12bee655675582c4898ced0df8dabf8e73f5130b9dde146131","declarations":8,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/credential-store-cleanup.test.ts","sha256":"8274533789ba4332d233507bd17c2c83156aa30421deb3bc1dd5ccbb398a8306","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/credential-store.test.ts","sha256":"12570ddac3ae51f4ea015c4effd70c95bdd6830ce9084c1f602af0e74775fc3d","declarations":7,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/database-connect-stall-postgres.test.ts","sha256":"f2e196714898b1a51b10b659de90d2c0095284f1a45f155a3795d5bc074c744b","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/database-postgres-timeout.test.ts","sha256":"910caabb96ac8a196c182df07322b589a74645e35463663928926738a5df3a32","declarations":21,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/database-statement-timeout-postgres.test.ts","sha256":"8a767423720af5eea5f35e0bd0fce73a9849c47a105659f7688bdbf22c8bf362","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/database-transient-error.test.ts","sha256":"76729a1363b84aabad8b0dbb17489e17aa8c1f60a77dd50657f55d1894c07ef2","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/database.test.ts","sha256":"e12b26f76368231c088b786be743102a166591da866c311aedec693489d4f41a","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/dead-cell-evacuation-precheck.test.ts","sha256":"fa3acbdf0094e45a46d5482e5809a100744761471b17368520c4231b46f66a89","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/dead-relay-tables-postgres.test.ts","sha256":"956a752584134198451aa2c11f2470bab4d2a360487b909e57b61c4cda876758","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/director-reserve-placement-status.test.ts","sha256":"7c3bab48bcbdfa90e3db6fb4a22537322aaaf7a54e1c12e499225ccd3dd1f770","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/drain-migration-row-lookup.test.ts","sha256":"783947cca8f9db3e0fdec0f5c56cdb8c9c422cf5d3db1a7a2bb592cab14b26fb","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/drain-migration-row-scaling.test.ts","sha256":"2adabae89beee885a85d5a58dedfb9e3d3379b6d0045edd088ec399e4023a76c","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/drain-release-cell-row-contention-postgres.test.ts","sha256":"e45ed3017e70377493a84776e8b3f3e80a14ea468df320c164514d25fc2e0166","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/drain-return-admission.test.ts","sha256":"6d1902ea12f44ea8fb75f532582eb1f9bef02a82679c84c60ca0b676c9b7e2c2","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/floating-promise-census.test.ts","sha256":"a863b2eb430294bd4846bc02759000cda99e3701eed66ba07be52805968e6664","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-close-reason-memory.test.ts","sha256":"92da427416a1f2d55121eacfed26027e18e8bdb44e8f5b297801edb4ffad6e9e","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-control-proof-cleanup.test.ts","sha256":"16ebfdec0a7e542316c27b0d53ff319c614c3dffd09feb086dde54042ace1705","declarations":12,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-control-resume-identity.test.ts","sha256":"ac29bd21d656e17c6722a27b01e8b48be26d02ed0a4195ccf151d1741f2e04ae","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-session-client-accept.test.ts","sha256":"22c7e48886aea21ab072762d4b2b8a2e0e9003709ecb09b63885c692192d9df9","declarations":19,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-session-drain-release-order.test.ts","sha256":"67cf0d3b4ee29e762f771ff34991dc89e41d5efdc8094ddcaf8d714e14515c71","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-session-preauth-latency.test.ts","sha256":"a48b9c7035700f1436b66dd2341d7880f530b3be9a9141cda9cb46101c0fe9a4","declarations":7,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-session-registry.test.ts","sha256":"f285b3724340fe47f09640ab65375fc640f88f14c6f09b08d093865e307a64bf","declarations":75,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-signed-out-rejection.test.ts","sha256":"5bf81f9f83182d458810414dcbc618998e018fabcf142bd0798c0b63c99a644f","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/host-whereabouts-app.test.ts","sha256":"3bf9908dfa2fb9d01d555851b2694520c540f8a5283bea62208e1f6ed5c684da","declarations":8,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-reconciliation.test.ts","sha256":"fa3bc53d0a5a2f37df623867d09d3d479c4744783e6ada51accdf4c7e204a2ca","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-store.test.ts","sha256":"5df06920367ee17690f0f5446dc2240567e8ad4fc3e806a471b8bff59c5c0b86","declarations":14,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-test-database.ts","sha256":"343bdc997f3beb8f1ec4714f95b9d7d70d4500f613637f89233d23b1ada0adf0","declarations":0,"signals":[],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-window.test.ts","sha256":"ae3e946a75587a7387c5403abb790e51716f61dfae0b5bf5b1c18c57a1cb673f","declarations":8,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/idle-regional-rehome-worker.test.ts","sha256":"6c4d6339e6a960dbf3523af84a1ba64cbc45c798049a5e0454cb74bbbd08f770","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/migration-recovery-postgres.test.ts","sha256":"8a61b80052eac264d4e92f3b8c181130a2117b0e9648a1050f05e3d7b001ed33","declarations":29,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/placement-load-band.test.ts","sha256":"f8aba58bbb49fb869e8db1f43e224432fb8074e9cc041865fe58b484fb64dbf9","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/post-proof-close-log.test.ts","sha256":"34c4a6788d688d8ff25de1538a435dffe3cea303b65f69c3b2ee3cf43d79ba50","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-checked-out-client-error.test.ts","sha256":"0b7da794a86f39ffb6c583f70803e3a6a1755ebdfbaa0e4c25c8a79f0b891581","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-commit-with-final-write-postgres.test.ts","sha256":"8dd628f605cc2c94a75f7612b831aca9bb522ad68bbd136935460ac418f4896c","declarations":7,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-drain-send-locking.test.ts","sha256":"b0ecdbafdff311bfd70f98ed11626a13c4dbf80a555108e3c59c50fe587ab1c0","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-idle-client-error.test.ts","sha256":"57d81afc1b9dfbcf275b7f814c9c2dbb634fbf51fc23f48c11ac5883da32eccf","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-lock-wait-sample-postgres.test.ts","sha256":"e2830bcfa3bae572dd31bc2c4178248ab534ea87b9a72de4b6030993d036e0c8","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-lock-wait-sample.test.ts","sha256":"b5a1cf90b57c891a5fa5fa849cc79338cf7b21de21596562890946f5dd8e8e37","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/postgres-lost-reply-postgres.test.ts","sha256":"8f9d90fa5790b8d0cfa43ffaf2109610608c86ec8c040bbba8a723b630a39943","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-lost-reply.test.ts","sha256":"7592fb52ba3c0d8de0c714ecfb7b3f8484fce8bb29ef9db63adf527d574f6679","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/postgres-maintenance-sweep-plans.test.ts","sha256":"380d6df576a31e0fe58619b21ee8b632672a17ea4d3a73d10828b1d1a36bdd3c","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
@@ -206,8 +207,8 @@
{"path":"cloud/apps/relay/src/staging-asia-proof-admission.test.ts","sha256":"2065a6a1645a4140abbf1fe2947618093a8ebe27c06c95f565fab71e8521b688","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/stale-if-error-jwks.test.ts","sha256":"e9a5fabb9345413b3f9febe178412268d302f92e541cc7e4e95925f0d29c16b9","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/sticky-slot-statements.test.ts","sha256":"0d22fbdf2321ac5e5849557117b11ee6ea3794fc7a64a15dc862ad4224247d5d","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/test-fixtures/delayed-postgres-database.ts","sha256":"30b9024e1574be2caf3cdf3983ff7a7f1caa92b33ad4894bd8a29c8c69401ae4","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/test-fixtures/host-control-proof.ts","sha256":"995e8d5e545fcc70728ea8d987cd8b151176b48df5a1a369ebe0fe556d93c5fa","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/test-fixtures/delayed-postgres-database.ts","sha256":"30b9024e1574be2caf3cdf3983ff7a7f1caa92b33ad4894bd8a29c8c69401ae4","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/test-fixtures/host-control-proof.ts","sha256":"995e8d5e545fcc70728ea8d987cd8b151176b48df5a1a369ebe0fe556d93c5fa","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/cloud-0003.jsonl"}
{"path":"cloud/apps/relay/src/test-fixtures/relay-contract-baseline/control-messages.ts","sha256":"8fcae470a5fc72f2fcdde9d2f09cd20289c256356dd490484ac1cfa53839fbe4","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/test-fixtures/relay-contract-baseline/director-messages.ts","sha256":"aba94e108a5cd0f1af8b38875429ad8636d24c43a728273e3df60d9a1a1d1b6d","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"cloud/apps/relay/src/test-fixtures/relay-contract-baseline/relay-regions.ts","sha256":"bc89116f884a2f20a6588f9b91219aa596bc2410d28b499a93a78350def109d5","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
@@ -251,14 +252,14 @@
{"path":"config/scripts/audit-localization-coverage.test.mjs","sha256":"38706e9ce7b3b0b9bf098c37d460975680cfb0c2ad2a9d10d61617bb75d9d2d7","declarations":9,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
{"path":"config/scripts/benchmark-artifact-comparison.test.mjs","sha256":"d591b82a362972b7167fbf85d24ea817d1a06ba4cde9afc8bc437b41104c3390","declarations":12,"signals":["named","declarations","auxiliary","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
{"path":"config/scripts/benchmark-browser-tunnel-framing.mjs","sha256":"9bf45fe19c5572fe5753f4350649f23f865c80d54ac0aa1d64312eaea01d515a","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-ci-preflight-critical-path.mjs","sha256":"e2a75ef9a47cdb7bc50b9e1501ef719db47dd1b41dc84d2133ca6ef844500d0c","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-ci-preflight-critical-path.mjs","sha256":"9f4db6d2f9fc1851cccae23699edea4ac39fadf50aea4df5beab20f01e7d327f","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-cli-error-imports.mjs","sha256":"7e1b7f0d7001e3c1911956c950043203bff5c15ffa54ad757d69bb3fce6867e4","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-cli-response-framing.mjs","sha256":"fc246f194b95c6bd2ac2bb96d7e1657d37c6a48a9f9f0bc844a613ea8a277442","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-explorer-dotfile-filter.mjs","sha256":"90c0e20c9588aa474d054ff173bf329396e6e78c358a203304157d33a9d94c8d","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-compat-boundary.mjs","sha256":"3a5979267d49b5ece59cf9a2ebef8f822289e34558aee11a29a4c932c5790310","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-compilers.mjs","sha256":"cfc1ac497bc6de1f20482636d6e3b38aeed62ea35b3c74a143f19fd771465a1f","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-localization-extraction.mjs","sha256":"2455459dce02b6a18cd3d8a696e43d801ab7eea9ebc7d7b3679585994445c586","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-static-analysis.mjs","sha256":"28d233ed314594b15cb0c4a353b6dd6f2faad7768e4cac783338a37c53062c46","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-compat-boundary.mjs","sha256":"1af3f5a2dc650dad72273d8cc84928ff14cb77760c63d0b4375224a73713d89c","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-compilers.mjs","sha256":"36de45a9babf15f3c05fcd6d558402a356b84030cd68a0d901938fe0bc31a551","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-localization-extraction.mjs","sha256":"3a410de5bf29f9d795485815e2d84372cef4edd7a060487c3242f79e76b756b4","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-preflight-static-analysis.mjs","sha256":"5bbd8ad16da844610bf9d290e225034bad8fbdab1d08e1005b179fe94e14794a","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-sample-summary.mjs","sha256":"feecbd5ec627e7d0ad568f8521c108c1a1cfd478b56f2239d72cd04cb079db1c","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-sample-summary.test.mjs","sha256":"eb1bc224b3dc911f0896a855930d6be245ba9e3ca9001815aee35d1e417a3ece","declarations":4,"signals":["named","declarations","auxiliary","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
{"path":"config/scripts/benchmark-skill-depth.mjs","sha256":"c592ef0e48b3b5f655dce65dd65356c09694dc21608a83a6156bb64e80438423","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
@@ -267,7 +268,7 @@
{"path":"config/scripts/benchmark-windows-native-preparation.mjs","sha256":"135006a2c2be84f0f29a0aaa006a364f2fa9bf6d0732ce0dc8d77210a49b164b","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/benchmark-windows-security-reuse.mjs","sha256":"4b732c5b9e1fd2d4dd1c5ab0c8b5d9b0fc4e2b59e422b1266ed1234825e973d8","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/branch-compare-head-benchmark.mjs","sha256":"84f32853973da665078ce6eac6b03b99e55dcf6bbf2405dfde44314c41c95cd6","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/build-cli.test.mjs","sha256":"bebfde15a222dcf2944c444010d7176d4d4b363ec8bb225c24af198c4c32a6b8","declarations":7,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
{"path":"config/scripts/build-cli.test.mjs","sha256":"3e609e5b2b405f6906f23f6ba2cde8f4996b28ab434dde2a6c5e36b5e5fbd8fc","declarations":7,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/root-0013.jsonl"}
{"path":"config/scripts/build-linux-local.test.mjs","sha256":"2319c12389319a7a2f212c32bb10be5c954d90e47a1ace01aba9729417cdf4af","declarations":6,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
{"path":"config/scripts/build-mac-local.test.mjs","sha256":"5cd7b017fdaf184613fc6ca8ff4cf4025e4400e3a43017fd4aaeeac35a01b2ac","declarations":2,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
{"path":"config/scripts/build-mac-notarization-overlap.test.mjs","sha256":"a5b22245d1e25f4ae7fb3bc5dae312bb64d4c0ca4ae3ffab2bd48fa578cbfc5e","declarations":9,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0001.jsonl"}
@@ -357,56 +358,56 @@
{"path":"config/scripts/compact-packaged-orcad-ripgrep.test.mjs","sha256":"f9f850bf6b4ba9c718fcfabb2d308895cc83a4a994b92fc3124f3f4b03879cc0","declarations":10,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0002.jsonl"}
{"path":"config/scripts/compare-benchmark-artifacts.mjs","sha256":"e2fc1c66dedd2479d75b62ac02bd33f975935fffa0dd1bd88c6fb3ea4cc190da","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/computer-use-smoke.mjs","sha256":"e3ccd011183408da12371f8165526911385bdb19a70ab938064bb722d1563069","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/computer-use-smoke.test.mjs","sha256":"1e5e01e9306fec03973fdcc10ffb9217e66e152a32e8c44e80c48be3b800f383","declarations":5,"signals":["named","declarations","auxiliary","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/counterbalanced-benchmark-schedule.mjs","sha256":"bc35b40e954fa7ddec0225ed375bd3b113c2e05b8554bc50734d14f89987294d","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/counterbalanced-benchmark-schedule.test.mjs","sha256":"fabc00232748f05fb3a4c3e715db67c45592b3284d6820db386692d8942ec7c0","declarations":6,"signals":["named","declarations","auxiliary","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/create-draft-release.test.mjs","sha256":"eb1ef315b70a68f733ff5c009d5a61982ef8c52f10568a3f6048b7d16f35fff5","declarations":20,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/daemon-boot-smoke.mjs","sha256":"c4f26b0de5bb604afb806c1483eb57ff44db025330a86f68965bd9c38ac6bee4","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/daemon-endpoint-handover-smoke.mjs","sha256":"73acd45caa94539c099d6629e6139fc93606229a710a3b4436d6a99ca25088b5","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/daemon-protocol-facts.test.mjs","sha256":"6ec6bf7f0e97707e2c4d518c87bf54b4debb042dec704bebf9270e0bd3a6176b","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/daily-build-version.test.mjs","sha256":"ca1f317d15c82fe0646ef1b7d8db57b41e47034f6c59f0e91021a062640bfb88","declarations":13,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dark-build-switches.test.mjs","sha256":"0ea5c08c8e57aab37e096b9d53e14111b35bc5076c6e3999d3815c963bee38ea","declarations":4,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dependency-security-audit.test.mjs","sha256":"9816d97523bfd03bc9fb41d06f97cf71f09d1b0c0b3fcefacb7489488a5d3b8b","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dependency-security-patches.test.mjs","sha256":"a74f2596e2e0a63958680e63f579716b5d04f1720a1e43ae4f1b9a7e70b3dc15","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dependency-security-release.test.mjs","sha256":"85581ab67d1bc9c166927d442da8991850b7206884c668b3aba8a923018a256e","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-channel-base-version.test.mjs","sha256":"e01a7e6eb393c85f47a95eb4926b6c63c558048077fd945210b1a5ad408ad4f8","declarations":11,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-channel-orcad-template-workflow.test.mjs","sha256":"5baf4eb09655502bd184a1b6c28525692c203c39ce2e172e9d89b191cd98ecbb","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-channel-windows-staging.test.mjs","sha256":"c454ebd6c0984167764a82def23f12e496e060e7aa6b2ea1b2de358edf1a82ee","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-cli-terminal-wrapper.test.mjs","sha256":"7120a00319c1223edcb8a423bf59afd627f18542285819e3e66e14713fb5b871","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-electron-bundle-cache.test.ts","sha256":"7da48621f835e5680e719f5c82073dfaf79ef4d02539f28fc4f5ae95a84d8378","declarations":10,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-electron-bundle-identity.test.ts","sha256":"ad7e6d3e4bf5681b527e57b5b86eeafb789538925364cbc4fc06565557d9cacc","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-storage-reclaim.test.mjs","sha256":"aa7d040da76351c4a97a1b5ac113bd22d097c97f6a8bbf6e33a42824123219b8","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/dev-web-client-freshness.test.mjs","sha256":"c16b0c2520f0134e11af7f531e92a7285d6168b018cf2bf79d76ca6454a5fad6","declarations":12,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/e2e-cli-artifact-capability.test.mjs","sha256":"1ff82a46786f48a948978db3351ba367a329789172d8b5721aeb517ad3300510","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-builder-config.test.mjs","sha256":"e614ac6673bca68ec2d5df34e0b59b707c4351c6a6d1662ea0aed4f589a14437","declarations":36,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-builder-mac-channel-config.test.mjs","sha256":"c49efa3b9471da19f11dfdca172bfb1773e122287ac51919fd4baf1784b77e68","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-builder-native-rebuild.test.mjs","sha256":"6faf310bfd7fe32cf998ad30bbc7f7569543daa254d2a037c3997e282a893a36","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-builder-runtime-resources.test.mjs","sha256":"44aea1d7b65fcda14c99c5a3145eabd7855cc041d04de84f4aaeb21ae9550128","declarations":22,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-builder-speech-config.test.mjs","sha256":"eacc9dfe152847ac95d2dde91acdfad4e5a68ca67aad99cfdb23807bcd3b3aeb","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-runtime-floor.test.ts","sha256":"9d502a18df39c3d6b7b7997539e1f1ee739fea65ec0d6db9a7ee4a07bb53f51e","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-vite-development-config.test.ts","sha256":"1b0b10656d3ca646e59a5befc2d0dfd49f9b8552d95da00d3b9105a4a5e75081","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/electron-vite-output-contract.test.ts","sha256":"955d247c5dc78d5f26ed7fc4022952a0c4124cce1072ee8a14583656a543f772","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/ensure-native-runtime-job-ownership.test.mjs","sha256":"62b913a91d8330c0fa398fde2ef329bf04fe6d166a03c063fe4e0c931ce66f36","declarations":24,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/ensure-native-runtime.test.mjs","sha256":"1600ee4adc16cf98be3f19aadac13b361dc4ff6b258531d15e3e2379a9ff97dd","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/ephemeral-vm-runtime-store-cross-version.test.ts","sha256":"8d0254f61d4c228400b19a6faa8bef4f35120ec0cc7e57316a92382c5cf0e3c3","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/file-explorer-deletion-roots-benchmark.mjs","sha256":"d13fad3c55b87d8ea5aec4627fef69d4e3f670bf2d25ec96cc2324a610e86e7e","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/file-explorer-tree-projection-benchmark.mjs","sha256":"fcdf0f947998b6b51bcf95d1428cc68e2946b01794d517568b686d06f0636239","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/foreign-sqlite-reader-worker-smoke.mjs","sha256":"0c90a93be25e25087e16168d60773ec7fa688cb70afe3262c51905b66027bfb7","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/foreign-sqlite-reader-worker-smoke.test.mjs","sha256":"7feeaaf8f11c5c81c50e52b3195b22dd4b10a78b9d887146af51e044b94cd6b8","declarations":3,"signals":["named","declarations","auxiliary","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/generate-bundled-skill-guides.test.mjs","sha256":"926068948c4a8bf40e6fa0923f6ed2ed5170ed1353ecca95999cb9f4d2ce998e","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/generate-monaco-associations.test.mjs","sha256":"882a1f5921c5f06f0ab66924a61f78e6adfdc77205ec10dd91be912dc48cb40e","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/generate-runtime-required-english-catalog.test.mjs","sha256":"ab9263d03316c1670c602dbf72ad5048f3f338734f1d984a5edd37e07bce975e","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/generate-skill-bundle-manifest.test.mjs","sha256":"e0aa0f23215c85b2ddb123dec435c1183fe81eaa8d73c9b669bf3907b4ea29de","declarations":17,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/generate-terminal-perf-html-report.test.mjs","sha256":"062c694f99e8b632f519865b5d158bc9fded02653d9882233450b5e35700bd5d","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/generated-artifact-line-ending-pin.test.mjs","sha256":"3ba2f2659e30d121ba4c99a36aea9529dc40c48aa0c8f8fb45e59a5fc6c99c22","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/git-diff-blob-concurrency-benchmark.mjs","sha256":"0f28ba936da60fae22428b0c5c42a0e2aa4e6d5593cf5a14f9c92a67b4ddb872","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/git-pull-request-diff-base.test.mjs","sha256":"d5ec01fd3bc4522c1a47010f526371d20df987beeca4f5352dade188ff536de1","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/github-opened-issue-repository.test.ts","sha256":"bbd534c3802fae5032e9af9bedd305840cc1de94a17a22c2abca9b464ad2c94a","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/github-pr-assignee-repository.test.ts","sha256":"e6dc517e18e6f46e2d3d00b1c26e363cdf2aa960a26f4ee1ca1541dbd1f283ed","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/hang-watchdog-memory-benchmark.mjs","sha256":"fa5fb59c8059afd053ef09190eb6d5896423d8a95d1a99c344b18f19dc98bfb3","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/hang-watchdog-process-metrics.test.mjs","sha256":"b14017bb024307c1f0c368dc6efbf4056e5ff7f9c06c1779732b0ada9bd31add","declarations":12,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/happy-dom-mutation-observer-retention.test.ts","sha256":"c7abb2f036f9dc2d8665c2fc5c4d1282e29f7af58d4166c1145860cdf777f991","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/happy-dom-offscreen-canvas.test.ts","sha256":"c10adb495d7b9c50bd45effc275c6d1b77c92f0020b2f19734bbde0a8d761900","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/computer-use-smoke.test.mjs","sha256":"4d381c651f21d9fe12a602652f30f0d8a3a46bd48ce698224e1104c030fabd07","declarations":5,"signals":["named","declarations","auxiliary","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/counterbalanced-benchmark-schedule.mjs","sha256":"bc35b40e954fa7ddec0225ed375bd3b113c2e05b8554bc50734d14f89987294d","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/counterbalanced-benchmark-schedule.test.mjs","sha256":"0292512350fad9e1a8ac205a55d975ce4c214f0fb2f4fba8ebbd1f5b98aa9501","declarations":6,"signals":["named","declarations","auxiliary","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/create-draft-release.test.mjs","sha256":"e9e3ad80f6f1ca8e83d51dcf92ec6cf8b11be8ecf3d7c223492813891689d2c4","declarations":19,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/daemon-boot-smoke.mjs","sha256":"c4f26b0de5bb604afb806c1483eb57ff44db025330a86f68965bd9c38ac6bee4","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/daemon-endpoint-handover-smoke.mjs","sha256":"73acd45caa94539c099d6629e6139fc93606229a710a3b4436d6a99ca25088b5","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/daemon-protocol-facts.test.mjs","sha256":"6ec6bf7f0e97707e2c4d518c87bf54b4debb042dec704bebf9270e0bd3a6176b","declarations":7,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/daily-build-version.test.mjs","sha256":"bbc3936df1ad589a0350d6bcd819a8d09429c1b861eb4de7ca851161b0149e9b","declarations":12,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dark-build-switches.test.mjs","sha256":"0ea5c08c8e57aab37e096b9d53e14111b35bc5076c6e3999d3815c963bee38ea","declarations":4,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dependency-security-audit.test.mjs","sha256":"9816d97523bfd03bc9fb41d06f97cf71f09d1b0c0b3fcefacb7489488a5d3b8b","declarations":8,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dependency-security-patches.test.mjs","sha256":"a74f2596e2e0a63958680e63f579716b5d04f1720a1e43ae4f1b9a7e70b3dc15","declarations":1,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dependency-security-release.test.mjs","sha256":"85581ab67d1bc9c166927d442da8991850b7206884c668b3aba8a923018a256e","declarations":3,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-channel-base-version.test.mjs","sha256":"99d6f41ca8637a443b53c9fb80e0326b398fac374a70e58218ce877c11789ad4","declarations":10,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-channel-orcad-template-workflow.test.mjs","sha256":"5baf4eb09655502bd184a1b6c28525692c203c39ce2e172e9d89b191cd98ecbb","declarations":3,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-channel-windows-staging.test.mjs","sha256":"c454ebd6c0984167764a82def23f12e496e060e7aa6b2ea1b2de358edf1a82ee","declarations":6,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-cli-terminal-wrapper.test.mjs","sha256":"7120a00319c1223edcb8a423bf59afd627f18542285819e3e66e14713fb5b871","declarations":3,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-electron-bundle-cache.test.ts","sha256":"7da48621f835e5680e719f5c82073dfaf79ef4d02539f28fc4f5ae95a84d8378","declarations":10,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-electron-bundle-identity.test.ts","sha256":"179dfe568d4d38c9ecae67aa37b2badd726e664673aea7d2b1051cd0caafb349","declarations":3,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-storage-reclaim.test.mjs","sha256":"aa7d040da76351c4a97a1b5ac113bd22d097c97f6a8bbf6e33a42824123219b8","declarations":5,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/dev-web-client-freshness.test.mjs","sha256":"c16b0c2520f0134e11af7f531e92a7285d6168b018cf2bf79d76ca6454a5fad6","declarations":12,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/e2e-cli-artifact-capability.test.mjs","sha256":"1ff82a46786f48a948978db3351ba367a329789172d8b5721aeb517ad3300510","declarations":2,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-builder-config.test.mjs","sha256":"df383425cbfbfde462367b10503c800d70c25343752d27d73e6f714f24061362","declarations":36,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-builder-mac-channel-config.test.mjs","sha256":"c49efa3b9471da19f11dfdca172bfb1773e122287ac51919fd4baf1784b77e68","declarations":8,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-builder-native-rebuild.test.mjs","sha256":"6faf310bfd7fe32cf998ad30bbc7f7569543daa254d2a037c3997e282a893a36","declarations":5,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-builder-runtime-resources.test.mjs","sha256":"44aea1d7b65fcda14c99c5a3145eabd7855cc041d04de84f4aaeb21ae9550128","declarations":22,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-builder-speech-config.test.mjs","sha256":"eacc9dfe152847ac95d2dde91acdfad4e5a68ca67aad99cfdb23807bcd3b3aeb","declarations":1,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-runtime-floor.test.ts","sha256":"9d502a18df39c3d6b7b7997539e1f1ee739fea65ec0d6db9a7ee4a07bb53f51e","declarations":1,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-vite-development-config.test.ts","sha256":"1b0b10656d3ca646e59a5befc2d0dfd49f9b8552d95da00d3b9105a4a5e75081","declarations":7,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/electron-vite-output-contract.test.ts","sha256":"955d247c5dc78d5f26ed7fc4022952a0c4124cce1072ee8a14583656a543f772","declarations":14,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/ensure-native-runtime-job-ownership.test.mjs","sha256":"5d0392135ad2071ef857994b6ad034d9e7732c2e0040ce73f1b06aee34ea2c73","declarations":20,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/ensure-native-runtime.test.mjs","sha256":"1600ee4adc16cf98be3f19aadac13b361dc4ff6b258531d15e3e2379a9ff97dd","declarations":6,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/ephemeral-vm-runtime-store-cross-version.test.ts","sha256":"8d0254f61d4c228400b19a6faa8bef4f35120ec0cc7e57316a92382c5cf0e3c3","declarations":1,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/file-explorer-deletion-roots-benchmark.mjs","sha256":"d13fad3c55b87d8ea5aec4627fef69d4e3f670bf2d25ec96cc2324a610e86e7e","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/file-explorer-tree-projection-benchmark.mjs","sha256":"fcdf0f947998b6b51bcf95d1428cc68e2946b01794d517568b686d06f0636239","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/foreign-sqlite-reader-worker-smoke.mjs","sha256":"0c90a93be25e25087e16168d60773ec7fa688cb70afe3262c51905b66027bfb7","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/foreign-sqlite-reader-worker-smoke.test.mjs","sha256":"7feeaaf8f11c5c81c50e52b3195b22dd4b10a78b9d887146af51e044b94cd6b8","declarations":3,"signals":["named","declarations","auxiliary","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/generate-bundled-skill-guides.test.mjs","sha256":"54d8330848111579d46ebf42b744a8f0ceabd3fd637934457bfe5686f57fd813","declarations":13,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/generate-monaco-associations.test.mjs","sha256":"882a1f5921c5f06f0ab66924a61f78e6adfdc77205ec10dd91be912dc48cb40e","declarations":2,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/generate-runtime-required-english-catalog.test.mjs","sha256":"35c528caa03ab61ab68da89e2f415a76147fe462d3c2efd6bd68cdb8302b853d","declarations":5,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/generate-skill-bundle-manifest.test.mjs","sha256":"e0aa0f23215c85b2ddb123dec435c1183fe81eaa8d73c9b669bf3907b4ea29de","declarations":17,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/generate-terminal-perf-html-report.test.mjs","sha256":"062c694f99e8b632f519865b5d158bc9fded02653d9882233450b5e35700bd5d","declarations":8,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/generated-artifact-line-ending-pin.test.mjs","sha256":"78f9be9e0ba35a5ed31972ffdbb9145e82cae018979b0efb11875a1a7c3c6c01","declarations":1,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/git-diff-blob-concurrency-benchmark.mjs","sha256":"0f28ba936da60fae22428b0c5c42a0e2aa4e6d5593cf5a14f9c92a67b4ddb872","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/git-pull-request-diff-base.test.mjs","sha256":"d5ec01fd3bc4522c1a47010f526371d20df987beeca4f5352dade188ff536de1","declarations":2,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/github-opened-issue-repository.test.ts","sha256":"bbd534c3802fae5032e9af9bedd305840cc1de94a17a22c2abca9b464ad2c94a","declarations":8,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/github-pr-assignee-repository.test.ts","sha256":"e6dc517e18e6f46e2d3d00b1c26e363cdf2aa960a26f4ee1ca1541dbd1f283ed","declarations":1,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/hang-watchdog-memory-benchmark.mjs","sha256":"fa5fb59c8059afd053ef09190eb6d5896423d8a95d1a99c344b18f19dc98bfb3","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/hang-watchdog-process-metrics.test.mjs","sha256":"b14017bb024307c1f0c368dc6efbf4056e5ff7f9c06c1779732b0ada9bd31add","declarations":12,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/happy-dom-mutation-observer-retention.test.ts","sha256":"3301754ecaf60cd13354437e83bf91db633d13f7addb0609b830e9800fca9feb","declarations":2,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/happy-dom-offscreen-canvas.test.ts","sha256":"0e3012dd17a430eb7061ccb1b90b43cad1bbe1aa773ed88c130c413a8b6adc78","declarations":3,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/config-0003.jsonl"}
{"path":"config/scripts/headless-detector-compiler-cache.test.mjs","sha256":"cf9f81da5dff2559d4f2ee03af02d93def801e5eb1d61b75f6d42bae9a5b3850","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/headless-serve-shutdown-matrix.test.mjs","sha256":"9d7aff4c6f8b082f2962a76447fe8f7c0cdd3a1deeec69ca5d84d05fafded42e","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/hibernation-output-epoch-leak-benchmark.mjs","sha256":"7305fce78a09525082ab640edde519b86e0bc5a7b2331709c3f5594dd0b36578","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
@@ -617,7 +618,7 @@
{"path":"config/scripts/pr-e2e-linux-packages.test-fixture.mjs","sha256":"7533987df28d1149c10170a44af7aba0c6deff63e70595558f37314b1b74d37d","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/pr-e2e-managed-ssh-harness-route.test.mjs","sha256":"b5cd549a924be88e29708be608e802a4d6a3f435bccb35ccc464873c58884ccc","declarations":1,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/pr-e2e-route-contracts.test.mjs","sha256":"5a117f3469e6379f9d7ff4ddf070f33b1a92260728d32e105ad88fed9e144285","declarations":25,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/pr-preflight-gates.test.mjs","sha256":"d0521a4a304f3655250bbb2f5fa0bcca9e417ca8320dc376076df78a6ca94d50","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/pr-preflight-gates.test.mjs","sha256":"3cc5577383cfb5eab6048fde968376faf9fd35540b09ecf4875ee0fa542bd70a","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/pr-ready-check-gate.test.mjs","sha256":"c7c6e73324a72fd107b7b884297062d95cd62f245287541d6194f4d79060a7b2","declarations":4,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/pr-ready-check-reuse.test.mjs","sha256":"e4bacf85772fc909f1b70afe508e366f46e30d20ddfa72293b578e3159ae2903","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/pr-test-loc-summary.test.mjs","sha256":"35f2c6a19c841552044b380259ceaec8e55490c47a49242f15e6624d71db5934","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -696,7 +697,7 @@
{"path":"config/scripts/run-multi-workspace-typing-bench.mjs","sha256":"0bb1964d1ad43831c5d8af78f06701948c4a5e317eae4e630a48f10bd0e3b711","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/run-terminal-scale-perf-report-gate.test.mjs","sha256":"7fa19ef0fee78827cb5b1f6be0ced6cf278818dc8b7e5650943c0b0de100d9f2","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/run-typecheck-bun-queue.test.mjs","sha256":"cefa167409e0ae7b7a5537d874192352efdc79dd92aaf40266c8c1574a441c35","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/run-typecheck-projects-in-parallel.test.mjs","sha256":"2033aef212126c58ca6b67f5884d43008cfe05fc78cdee207161bbd6064550c3","declarations":19,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/run-typecheck-projects-in-parallel.test.mjs","sha256":"dabc0311813ac4efe0ff774256635a1a649eb3e9671bb5e2e53023a748ad6c80","declarations":22,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/runtime-serve-terminal-smoke.mjs","sha256":"537cc883e6ff20f2080d3466357a0bc41284768d8e1e89f1ef4fce284611bbf3","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/runtime-serve-terminal-smoke.test.mjs","sha256":"a3f248c2f66dcae0c69f664755aa94b5953d4a478e122bbed8d8aac7c6a0a7f9","declarations":3,"signals":["named","declarations","auxiliary","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/scan-release-artifacts-antivirus.test.mjs","sha256":"ea695fe496eaa446769ca994ed1f4fa51da633df0abb8784da7a59c839b16146","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -756,6 +757,7 @@
{"path":"config/scripts/tool-preview-whitespace-benchmark.mjs","sha256":"aef26e0b523cfc3263b10330d3232db1993831717b9ecae05de842df9b93ca79","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/transcript-stream-fragments-benchmark.mjs","sha256":"7ee5eb4e7b6e8f9226480223bea331f7c88fa1f47d7bd6a232a7002adecf0530","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"config/scripts/trim-windows-icon-source.test.mjs","sha256":"76568efaba636bd2e118c6f214f09480a7574e80ce34975f2340786ebd6bacaf","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/tsrs-typecheck-compiler.test.mjs","sha256":"4213f73141c3c39381d373e27ed250988de2cc827d06a137f59044629d647fd4","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/typecheck-project-coverage.test.mjs","sha256":"b4d5bf3f65c0aaba1989fb2e4d44584dcad996d00a41039bd248649fc6950625","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/undeclared-dependency-resolution.test.ts","sha256":"4e02faf5aa6598ab77ca41189f00275932a7c59aafd2e295789c432c236e788b","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"config/scripts/update-node-runtime-pin.test.mjs","sha256":"6459ebba83724e6b5b8345f5631914463fcd1739b6fdcd5494e3f8d04a8c45e2","declarations":13,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -836,16 +838,29 @@
{"path":"config/vitest.agent-status-benchmark.config.ts","sha256":"810c9f87cd645ed7ca7a3b0e8432cfd0603792215e79398f3c848042a1e5ebbe","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/acknowledged-tab-retirement/fixture.test.ts","sha256":"a0d7957f191efe00d59c61fc65e9fe80889a224b74157b2936893a70b2a5dd05","declarations":13,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/acknowledged-tab-retirement/reproduce.mjs","sha256":"8af00341f2a8d654edf4c109c87f13b2845837714ee352b75e117cdb2b97da9c","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/auth-filesystem-wait-retention/reproduce.cjs","sha256":"2208bd827a1a0777b9686b18d36ae0af4a34897479fd07187e239a91af54bff2","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/browser-closed-result-retention/scenario.test.mjs","sha256":"93a44e2b2583f397d5c08d29d9de3e1413a9185b893264bf4d468276d8d13ed5","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"docs/audits/browser-destroyed-guest-retention/reproduce.mjs","sha256":"8a9b3316089cdae9409a6375b29a0a9f51742e2f78cd4558b4ab6a9027cf2752","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/browser-registration-reply-retention/reproduce.mjs","sha256":"7dcc15e63d1fdc16866240e0dbf96ab0532ebc7115cda78399d879c11f7d0221","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/cdp-stream-retention/reproduce.mjs","sha256":"f9e5f6c91d19427f959ed3cce60fe1d186b534d933e7dbf38cbc4d218a044379","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/claude-branch-proof-streaming/regressions.mjs","sha256":"ddebeeee655ba5b97b370c3caad9aa086f2b88d3180df0af9b337483958b3088","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/claude-branch-proof-streaming/reproduce.cjs","sha256":"824d6d1048f136b314e181f4e8f8d8cc73aa6a4c5a96abb497639e2f4623e4f1","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/claude-history-window-budget/reproduce.mjs","sha256":"f7ce76164924bc9272af0d199f5698f44030252768f4287ae839f0c6b7d42630","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/claude-task-retention/reproduce.cjs","sha256":"a06b6373a26ff3faee61068aa60bce4dbcd358c2fa5adc5864063a77ee7720e7","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/closed-editor-model-lifetime/lifecycle.test.mjs","sha256":"afc0b7e45e056d1f730ac58f266094471b58187646c91b4436b909544a3a4e29","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"docs/audits/auth-filesystem-wait-retention/reproduce.cjs","sha256":"2208bd827a1a0777b9686b18d36ae0af4a34897479fd07187e239a91af54bff2","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0008.jsonl"}
{"path":"docs/audits/auth-filesystem-wait-retention/settlement-order.cjs","sha256":"7648792560e1840df44da64bfd15ec88a4ce38b9c70f686a965788ae014956c9","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0008.jsonl"}
{"path":"docs/audits/auth-filesystem-wait-retention/sources.cjs","sha256":"115aced3091797efe36bb8814faf88c0822d4168b317473f4867128a59e6dd16","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0008.jsonl"}
{"path":"docs/audits/browser-closed-result-retention/scenario.test.mjs","sha256":"93a44e2b2583f397d5c08d29d9de3e1413a9185b893264bf4d468276d8d13ed5","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/root-0009.jsonl"}
{"path":"docs/audits/browser-closed-result-retention/sources.cjs","sha256":"9d05c182b2052265dae299ae328d1db039168bbd84608a1a6f8ad5f9df75fbbc","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0009.jsonl"}
{"path":"docs/audits/browser-closed-result-retention/vitest.config.mjs","sha256":"b85dd0f517b27434995e63088fab1ff22f0e8815791fc4fa440f2d6ab298ef06","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0009.jsonl"}
{"path":"docs/audits/browser-destroyed-guest-retention/reproduce.mjs","sha256":"8a9b3316089cdae9409a6375b29a0a9f51742e2f78cd4558b4ab6a9027cf2752","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0009.jsonl"}
{"path":"docs/audits/browser-registration-reply-retention/reproduce.mjs","sha256":"7dcc15e63d1fdc16866240e0dbf96ab0532ebc7115cda78399d879c11f7d0221","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0009.jsonl"}
{"path":"docs/audits/cdp-stream-retention/reproduce.mjs","sha256":"f9e5f6c91d19427f959ed3cce60fe1d186b534d933e7dbf38cbc4d218a044379","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0008.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/allocation.cjs","sha256":"93bdb172e14624a5ff7b30974e3e1c56fafc5724e8b4f973275ead9063e099c9","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/duration.cjs","sha256":"5b24ded05da1b21c1e63d2cde33437a016b61780ecca3a30f9430e0dd689f81d","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/growth.cjs","sha256":"6c3e29d47c6e0c689143de932161a2cf9c65662c748ae0ef69f96be264ebb132","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/parity-cases.cjs","sha256":"b30e9219d96fd34015c884d45e12477be23fcc2bccd699f4d48e72aab5b63d0a","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/regressions.mjs","sha256":"ddebeeee655ba5b97b370c3caad9aa086f2b88d3180df0af9b337483958b3088","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/reproduce.cjs","sha256":"824d6d1048f136b314e181f4e8f8d8cc73aa6a4c5a96abb497639e2f4623e4f1","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/sources.cjs","sha256":"36821771ed1e2aeed1587300e891943c77048c8d16f1f810aacee369de74792e","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-branch-proof-streaming/verifier.cjs","sha256":"2ce5e8b25136f9553cfa39185391803623a4d0c91995b0b7d3ad45c4c2ff33d4","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0012.jsonl"}
{"path":"docs/audits/claude-history-window-budget/reproduce.mjs","sha256":"f7ce76164924bc9272af0d199f5698f44030252768f4287ae839f0c6b7d42630","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0011.jsonl"}
{"path":"docs/audits/claude-task-retention/reproduce.cjs","sha256":"a06b6373a26ff3faee61068aa60bce4dbcd358c2fa5adc5864063a77ee7720e7","declarations":0,"signals":["auxiliary"],"status":"reviewed","review":"reviews/root-0008.jsonl"}
{"path":"docs/audits/closed-editor-model-lifetime/lifecycle.test.mjs","sha256":"afc0b7e45e056d1f730ac58f266094471b58187646c91b4436b909544a3a4e29","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/root-0010.jsonl"}
{"path":"docs/audits/closed-editor-model-lifetime/loader-controls.cjs","sha256":"4cdcf0309ff0acce00cff5f5b17ce91236f5eaa27245de65c651dd4c6535a352","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0010.jsonl"}
{"path":"docs/audits/closed-editor-model-lifetime/sources.cjs","sha256":"d5914770eb9db3c75b153b55d7f2f94415d3ab1850bc5b021be1165d104828be","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0010.jsonl"}
{"path":"docs/audits/closed-editor-model-lifetime/vitest.config.mjs","sha256":"bfe98cdc66445e31801a9b64f698f158110dc7a8b1ec8f92ef7f99a5fb296444","declarations":0,"signals":[],"status":"reviewed","review":"reviews/root-0010.jsonl"}
{"path":"docs/audits/codex-prompt-claim-retention/reproduce.cjs","sha256":"770da9e5c1b0e2a5f2a1175473fc2bad25ca8e11f4bbdac15be990bb19bc1d5d","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/crashpad-read-limit/reproduce.mjs","sha256":"f933664d7956dc935dc54873f43f1e9628830e4eb30f85759ba7dc2590b3c276","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/daemon-late-exit/reproduce.mjs","sha256":"16e3c55c99d1bb3a727ff7f7a1cfed8009362df93a7609326d8f134c001006b4","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
@@ -884,8 +899,8 @@
{"path":"docs/audits/tui-transcript-acquisition/reproduce.mjs","sha256":"7dc13b0b5a9dce5def8f5a87970ad161ea8034211ae6569ef99f28a932422a34","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/tui-transcript-close/reproduce.mjs","sha256":"5205558afafeb099438db8f89a777ff48afaf8ac4e25f76f2dfc5bfff5770f44","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/audits/working-directory-wait-retention/reproduce.cjs","sha256":"b6b6b4d44b20b57bcb01740e68af241ca14dbc450b868c7c16aa098b1cf69954","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"docs/site/tests/docs-package.test.mjs","sha256":"6bf5305dbf19474175c2e6d9918c257616ba45525f74e25ccb0cdbd0893d1559","declarations":11,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"docs/site/tests/search-excerpt.test.mjs","sha256":"0f0fe3753174cf76f27e443dcb710a67cadf388a6bead9b0c926a974d01abbc5","declarations":7,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"docs/site/tests/docs-package.test.mjs","sha256":"9bd380102a154119728c1c4a1fbbcc877b6fd4a1f22fdc307dcdad3f8ce26c31","declarations":5,"signals":["named","declarations","auxiliary"],"status":"reviewed","review":"reviews/root-0007.jsonl"}
{"path":"docs/site/tests/search-excerpt.test.mjs","sha256":"331358ef182ec591c9502f760c73ac87f7d0554924785ab1b1c30d7308b49984","declarations":7,"signals":["named","declarations","auxiliary"],"status":"reviewed","review":"reviews/root-0007.jsonl"}
{"path":"mobile/fastlane/fastfile_testflight_arguments_test.rb","sha256":"10eb0f4413e5f95d246eee4e81d572ac1857f21b55f17939f84fb3281dd21e5f","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/fastlane/ios_release_version_test.rb","sha256":"26392c6b88e72ff0637d9b7d9ba550a2eead2df43ad35215971a081e593367d3","declarations":11,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/modules/orca-gzip-utf8-codec/android/src/test/java/expo/modules/orcagziputf8codec/BoundedGunzipTest.kt","sha256":"472db5df83509402f757c9cc916d1c74e636fd2af16b7a12a3abba0840e2bcf1","declarations":1,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
@@ -993,56 +1008,54 @@
{"path":"mobile/src/components/drag-reorder-positions.test.ts","sha256":"66242dc5e93f01d06aa7410a7a0c950b16482df69053cdca061f9877087ebe31","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0002.jsonl"}
{"path":"mobile/src/components/html-preview-inert-links.test.ts","sha256":"b7a61f0ce734ca1c107deb08ebb31c8444ad042aafa7e98e1b85a08751e2a597","declarations":11,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0002.jsonl"}
{"path":"mobile/src/components/html-preview-link-affordance.test.tsx","sha256":"fd487e696dd4c0920050a3672df6633eb2d6befde90452f18baa9e92d4932c5e","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0002.jsonl"}
{"path":"mobile/src/components/keyed-bottom-drawer.test.tsx","sha256":"e7821bcd5eb8b63642877ded940a6d559eeeecf81dd4fbac42bfaf6e4fcfcaeb","declarations":10,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/markdown-file-path-detection.test.ts","sha256":"3ce8a2db739360e56499854235063b946a22fbedaee29c96ecdb7b86d26f9fa4","declarations":35,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/markdown-href-routing.test.ts","sha256":"91ddafa7b6de7adff114b0ee62b95a127af87864d90869f66406f3cb4da6eea5","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/markdown-inline-matcher.test.ts","sha256":"a2baa277499d2134b0885cabe21fab57811d4588f5c45042ecc55e21fdc74f59","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-agent-icon-assets.test.ts","sha256":"d9e53f844ce508d4c2954fece2a086b1be78a5d349b702c7210828b664da8c15","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-agent-icon-gradient.test.ts","sha256":"8ebced6d92fcdaebdead9268a61ee3e139c04ddaca7c513767fe9af321c30343","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-diff-review-send-sheet-stacking.test.ts","sha256":"bd6bef6d0643fd2b837fd73437bc7a674c66f9a6231e11e28be2764439a208db","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-markdown-android-selection.test.tsx","sha256":"48f6392ee0e227d7522277b7a54bed1fb5c2040c07a3d41b41f647247b38bf37","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-markdown-mermaid-routing.test.ts","sha256":"44179b3ff3c53a7edf75ef1606f3a02a257c2843b2ac4e46f3515e7174278fde","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-markdown-preview-placeholder.test.ts","sha256":"c433ccf994fb3a0265d74fc17c55c57836f30070bc5f7abb3195b175b84c986e","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-markdown-selectable.test.tsx","sha256":"5ddbbe0c391aa7b60d54d69347568a6429abb57247171a95a94751bc630eb85a","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-markdown-table.test.tsx","sha256":"722fe0ea49d167b647d79354fec3a97282fd736acf98f6cd45e82f770b6c52ea","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-markdown-visual-lines.test.ts","sha256":"258d48357045d42db0decb7a3beca0528a55660539cc09c0cc7b3876799f3551","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-pr-sidebar-presentation.test.ts","sha256":"eb638cc6ddbfe0ef151ccb416ab9c0f5a08026429eb70e3b853f6421e071dc26","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-rich-markdown-editor-keyboard-inset.test.ts","sha256":"02bb35a7b63b2d0c143d4f02292fe07ebdb5ceea8727117079467ed236f2f823","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx","sha256":"2801742877053503a3ab9c07b425df5c211e4058da9f35dbee58d84a06bf0289","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mounted-bottom-drawer-keyboard-seam.test.tsx","sha256":"3b5385ad8c656a6e1cef499a0ae3253eb1c14dd4b0322d74e6fe06f3aaab1665","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/mounted-bottom-drawer-page-keyboard.web.test.tsx","sha256":"638a335e30998cde9dcc2b403d036eb02e90b57007cac02aba8a3095cb4e4bf2","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/new-workspace-project-targets.test.ts","sha256":"8c960accd11524c80e2d36d8182a92f1677f5dc6d6d5d9de0bb5c8596ea4a7ae","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/new-workspace-reply-schema.test.ts","sha256":"97d4b35122f8142c73ac08dfafe9dcf80b622253ce21bcdebf4a8c5dbe291dcc","declarations":10,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/new-worktree-agent-selection.test.ts","sha256":"7e95db97b2dc751aec37875e4f70df00875a239f2a695f35599985d106a22c3f","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/new-worktree-form-sheet-visibility.test.ts","sha256":"d698bf17f3f37a95f945a048ec1028e6d8e1177ad709cc6b1066005a1cd937e1","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/PRCommentsSection.test.ts","sha256":"46773635c7e583db4363b5ce8ba9774481ff0bf18837af0bed1d33ddcd22cfac","declarations":1,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/PRConflictingFilesSection.test.ts","sha256":"09e52b11c21fd62383b6f0c425c04b6d2c86a72e525c2a4cf8bb11485d32e334","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/markdown-blocks.test.ts","sha256":"08e1d2f5d821b7c13aba57d3861727067853ec3e2027cae985542a3bb9eb2747","declarations":16,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/markdown-link-scheme.test.ts","sha256":"5e8f9da3f32a24428606a1406426ba0594ba8ebf3016640b73f9f9d02894bf16","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/markdown-table-delimiter-performance.test.ts","sha256":"332be159d58386bb3a6d4c05d404b0afdedea1912e1cbe4919834e3e354ac7f0","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/markdown-tag-stripping-performance.test.ts","sha256":"438616da1fe5005a311cabfd5dc448d8d8b436054660e48c0eee1550ea8d8a98","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/pr-actions-state.test.ts","sha256":"a60dc1c9004f32ece3161127047569781e6112c590ed285ae74070fb869d5ec6","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/pr-check-detail-content.test.ts","sha256":"af5ba9e6afefb2c09b4a7fbbc38f060622bcda0571a105623a4530cd72be99fc","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/pr-checks-presentation.test.ts","sha256":"5ac883d8c7bd9b7aa1d8c97423c26abd6768e7e8be8719568a2853d2100b8b99","declarations":22,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/pr-comment-card-web-avatar.test.tsx","sha256":"19db4ab57c9519f6181dad6bebae91f6848534dbe100a5e6d3ab4f961a6a2382","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-sidebar/pr-conflict-presentation.test.ts","sha256":"366ae54e9585479f977d7b1fc2aba1e2143136a8da4b939c31a72bf1b7db7a82","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/pr-state-token.test.ts","sha256":"a119debbec9f9121ff44642aa98c3b9f527a3d55f661c0c4fb827e175acfed3f","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/document-host-root.test.ts","sha256":"4b2663f5a9cab245e99e17853fb20d49e68137519e2abca52755bf163fbc3d5d","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/document-lifecycle.test.ts","sha256":"e4eece192c9316ece62180e2ff934e634c1da370cf833bde97540157cf0902ed","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/editor-content.test.ts","sha256":"cc9efcaea2123e9735f506749fbcbfb0cef7ec26d371b4176652ecc13205b377","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/editor-selection.test.ts","sha256":"626a41798e3678d1de44a606524cbba0cc271d5928f0f5f88b751ed134e37863","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/markdown-code-fence-allocation.test.ts","sha256":"82162ac53bd9dc37bcdd65ff0f5b80f8581c44eff27bb178f939831c3e505fa2","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/markdown-round-trip.test.ts","sha256":"5ece31a73137c79382c57da6843b6c4ad67c7457a6b9582f39f7b18773cf368b","declarations":13,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/page-stylesheet.test.ts","sha256":"1b6b03036da1e70cd2b4fb1cbafd7aa5ecde9d7e8a86ad9b88eb50e6cd2798f9","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts","sha256":"ef1e9a997f2486cdb99923271169ce285244396de45e514fa2bd6f0e01ffe5fb","declarations":10,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts","sha256":"240bf9840390a31326a4121fb7c40a22d2f2e6161dc2336a8c26b7b41f75f2b9","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/rich-markdown/rich-markdown-web-document-mount.test.ts","sha256":"e624a37a29aad659609c1e95e3b26c4725a9bf80d28f4c2a635803dd14f9ddc7","declarations":8,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/right-drawer-hardware-back.test.tsx","sha256":"8f829ce491b545f9d717419a53cb92b4c4fa827d1dbf82cae38ba66f172b1917","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/right-drawer-panel-width.test.ts","sha256":"cfa9324af63499c711519499fc53e355059e5e0f298f247307ad8808b272df89","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/terminal-shortcut-settings-custom-keys.test.tsx","sha256":"2e2ddf71703459c8e0d666c6f8944ec5dfa0062d35f2ca09676bcaf7667018f3","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/use-bottom-drawer-follow-up.test.tsx","sha256":"b2e976d229c062cdda5fed47ac4acaa11cb5f526341617af9010f03c4577c52c","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/use-connected-host-picker.test.ts","sha256":"e00bce4e0a7e7249207a2679151a1f8c1e1ac4f79f79fa2463b2a34c8e79685e","declarations":9,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/use-html-preview-link-grant.web.test.tsx","sha256":"88507d031d249cfe346fca157afea2f10fd79b7a4fb32bfa53712d94f40180d1","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/keyed-bottom-drawer.test.tsx","sha256":"e7821bcd5eb8b63642877ded940a6d559eeeecf81dd4fbac42bfaf6e4fcfcaeb","declarations":10,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/markdown-file-path-detection.test.ts","sha256":"3ce8a2db739360e56499854235063b946a22fbedaee29c96ecdb7b86d26f9fa4","declarations":35,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/markdown-href-routing.test.ts","sha256":"91ddafa7b6de7adff114b0ee62b95a127af87864d90869f66406f3cb4da6eea5","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/markdown-inline-matcher.test.ts","sha256":"a2baa277499d2134b0885cabe21fab57811d4588f5c45042ecc55e21fdc74f59","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-diff-review-send-sheet-stacking.test.ts","sha256":"e38247e14c4b2df44a269b621e45a4e225436e3e949b264208f81824286cf239","declarations":7,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-markdown-android-selection.test.tsx","sha256":"48f6392ee0e227d7522277b7a54bed1fb5c2040c07a3d41b41f647247b38bf37","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-markdown-mermaid-routing.test.ts","sha256":"44179b3ff3c53a7edf75ef1606f3a02a257c2843b2ac4e46f3515e7174278fde","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-markdown-preview-placeholder.test.ts","sha256":"5edfbc066a772b09fe02c5aab4010686106eeea39b57bd5e622dc23a5b973c26","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-markdown-selectable.test.tsx","sha256":"5ddbbe0c391aa7b60d54d69347568a6429abb57247171a95a94751bc630eb85a","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-markdown-table.test.tsx","sha256":"722fe0ea49d167b647d79354fec3a97282fd736acf98f6cd45e82f770b6c52ea","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-markdown-visual-lines.test.ts","sha256":"258d48357045d42db0decb7a3beca0528a55660539cc09c0cc7b3876799f3551","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-pr-sidebar-presentation.test.ts","sha256":"eb638cc6ddbfe0ef151ccb416ab9c0f5a08026429eb70e3b853f6421e071dc26","declarations":7,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-rich-markdown-editor-keyboard-inset.test.ts","sha256":"02bb35a7b63b2d0c143d4f02292fe07ebdb5ceea8727117079467ed236f2f823","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx","sha256":"e7ef3bc3067e36d9c59fedc9e071a3f23f4a724b0060581fb477130b80bec367","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mounted-bottom-drawer-keyboard-seam.test.tsx","sha256":"3b5385ad8c656a6e1cef499a0ae3253eb1c14dd4b0322d74e6fe06f3aaab1665","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mounted-bottom-drawer-page-keyboard.web.test.tsx","sha256":"638a335e30998cde9dcc2b403d036eb02e90b57007cac02aba8a3095cb4e4bf2","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/new-workspace-project-targets.test.ts","sha256":"8c960accd11524c80e2d36d8182a92f1677f5dc6d6d5d9de0bb5c8596ea4a7ae","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/new-workspace-reply-schema.test.ts","sha256":"9c9070f1272242d99a43913ff572d8e3be50ca3e07591a0cddc6cb22d4f80e37","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/new-worktree-agent-selection.test.ts","sha256":"7e95db97b2dc751aec37875e4f70df00875a239f2a695f35599985d106a22c3f","declarations":7,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/new-worktree-form-sheet-visibility.test.ts","sha256":"56588ebcb83076954b9f4dcd29da2375849449be73265f098f150e6a3b9c4625","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/PRCommentsSection.test.ts","sha256":"46773635c7e583db4363b5ce8ba9774481ff0bf18837af0bed1d33ddcd22cfac","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/PRConflictingFilesSection.test.ts","sha256":"09e52b11c21fd62383b6f0c425c04b6d2c86a72e525c2a4cf8bb11485d32e334","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/markdown-blocks.test.ts","sha256":"e25284984552932915190fbd6504b3d790aa38e1604b35db8681f9190f70a9d0","declarations":16,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/markdown-link-scheme.test.ts","sha256":"5e8f9da3f32a24428606a1406426ba0594ba8ebf3016640b73f9f9d02894bf16","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/markdown-table-delimiter-performance.test.ts","sha256":"332be159d58386bb3a6d4c05d404b0afdedea1912e1cbe4919834e3e354ac7f0","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/markdown-tag-stripping-performance.test.ts","sha256":"438616da1fe5005a311cabfd5dc448d8d8b436054660e48c0eee1550ea8d8a98","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/pr-actions-state.test.ts","sha256":"a60dc1c9004f32ece3161127047569781e6112c590ed285ae74070fb869d5ec6","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/pr-check-detail-content.test.ts","sha256":"af5ba9e6afefb2c09b4a7fbbc38f060622bcda0571a105623a4530cd72be99fc","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/pr-checks-presentation.test.ts","sha256":"65a7a741da1670ee5348bbe2a5ffc94c5d12bd4ded04b2bb43cb6a102583e784","declarations":17,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/pr-comment-card-web-avatar.test.tsx","sha256":"19db4ab57c9519f6181dad6bebae91f6848534dbe100a5e6d3ab4f961a6a2382","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-sidebar/pr-conflict-presentation.test.ts","sha256":"97c5b66bf81d75e3c9798546d64e07bd1e76f1a732981630dd5000ab06af6e63","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/pr-state-token.test.ts","sha256":"61f121841b9c5fff7bae46bc381717c7fa0d176b1ccb03f3b008ab945f96991c","declarations":1,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/document-host-root.test.ts","sha256":"4b2663f5a9cab245e99e17853fb20d49e68137519e2abca52755bf163fbc3d5d","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/document-lifecycle.test.ts","sha256":"38c5d8767420a3e2f721cce540e8457fa5d292c5c24c2e034e2558f29e65140c","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/editor-content.test.ts","sha256":"b743d2d3daef65c0f98fc9de6c2f911b45a84a66a1f50184a2bcc88c4f30b4fd","declarations":8,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/editor-selection.test.ts","sha256":"626a41798e3678d1de44a606524cbba0cc271d5928f0f5f88b751ed134e37863","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/markdown-code-fence-allocation.test.ts","sha256":"82162ac53bd9dc37bcdd65ff0f5b80f8581c44eff27bb178f939831c3e505fa2","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/markdown-round-trip.test.ts","sha256":"ea5a8e62fe9e72fd3a01ed4fcf5ca4c86d4df39911eed0d796e4154b19b1edf6","declarations":13,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/page-stylesheet.test.ts","sha256":"e85b3cb743410d4bc211f6c62aac42634eec67a87a1983ae93c3e66a3db5d58c","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts","sha256":"b2b3227a92b35c80f08ea280a76253bf8062f892d7f9600db018436ac0091e17","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts","sha256":"6147e257d9447b4eb25ce2b01154a37e5883f13a257ed3c081a97acddb370c79","declarations":6,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/rich-markdown/rich-markdown-web-document-mount.test.ts","sha256":"4580951669ab65109e06f834eb7939620d4187bdd408f544b4ce1b92fdb22701","declarations":8,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/right-drawer-hardware-back.test.tsx","sha256":"2abc189ece66a52aef573dbc96b200f79964387e71c7b3c6602b829920fe8b5d","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/right-drawer-panel-width.test.ts","sha256":"cfa9324af63499c711519499fc53e355059e5e0f298f247307ad8808b272df89","declarations":5,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/terminal-shortcut-settings-custom-keys.test.tsx","sha256":"2e2ddf71703459c8e0d666c6f8944ec5dfa0062d35f2ca09676bcaf7667018f3","declarations":2,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/use-bottom-drawer-follow-up.test.tsx","sha256":"b2e976d229c062cdda5fed47ac4acaa11cb5f526341617af9010f03c4577c52c","declarations":3,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/use-connected-host-picker.test.ts","sha256":"e00bce4e0a7e7249207a2679151a1f8c1e1ac4f79f79fa2463b2a34c8e79685e","declarations":9,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/use-html-preview-link-grant.web.test.tsx","sha256":"305ff1a9e20308a4fab4a01e3c82123403ef7a4b15fc6755b9af76cfcd5df318","declarations":4,"signals":["named","declarations"],"status":"reviewed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/use-new-workspace-execution-target.test.tsx","sha256":"96b5cd07721bea8ba9302313817f1716373510c54d5196ca2fdcc382b55cec93","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/use-new-workspace-runtime-context.test.ts","sha256":"be40d3378a0f143f8293ad8bb3a41d908003330c9423336bec2b8c5e3e30cca4","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/components/use-new-workspace-setup-script.test.ts","sha256":"40c323f4ab4cebf013905ead8d5293afc5dad57c408263292ed9bc4e47c54ca8","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
@@ -1406,7 +1419,7 @@
{"path":"mobile/src/session/mobile-native-chat-diff.test.ts","sha256":"8dbeb008e994e4b008aeba5b3b2171281112a3473a6a209771e984f16f3d3c13","declarations":7,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-draft-reconcile.test.ts","sha256":"0965ca42be1dcbed154dd5be9d6b23c29d60e65fe5a85730331eb68edb7c618e","declarations":11,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-draft-store.test.ts","sha256":"0149955f594b541db1a8186ccf43c07929923d93cf5e6b9582668f4daa4ce323","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-eligibility.test.ts","sha256":"309e80fa5a3900b6e9848b39df2faa4cebfcd3b61ac417625ca9a4009fc2e245","declarations":17,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-eligibility.test.ts","sha256":"789269957289203b364bd3d5b323065f49706deca1c722d281e36e19e011fcf3","declarations":22,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-file-attachment.test.ts","sha256":"633103433f42a834c142891e90b3bcbd0c0d347f174e644ee9a07ab716d47be5","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-host-journal-frames.test-fixture.ts","sha256":"b09c9f41ba29e40ef6856b8f37565f76c9eba1333f4bed1bb370476c4f6724d5","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"mobile/src/session/mobile-native-chat-image-attachment.test.ts","sha256":"50a46ee739bd29b8d7a5777cf144e90e3ee888289fc9790b396ac2801b7df2a2","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
@@ -1568,7 +1581,7 @@
{"path":"mobile/src/session/use-mobile-send-completion-generation.test.ts","sha256":"1bef91e220695d5023130049c444365323dd3d4202fc91533a7502a0e783b632","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-close-actions.test.tsx","sha256":"5e4ab6ac4747ff17011c095c20fd6d8b01e16fc86835238a0d62fefa949c935f","declarations":2,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-document-readers.test.ts","sha256":"a4340a9b9bdfc42df3047beabea72669f987733aa13f1756d6eec00d40331767","declarations":15,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-image-attachments.test.tsx","sha256":"456c35a6b4c6d74bd6c34114c5449b1487ed110a273d0fcf1c28f84050ba1ac0","declarations":3,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-image-attachments.test.tsx","sha256":"bb5d939b223c5b34a3cf4af24f89b6e3a99abfb33476bbd0e8fd4fc9f986df24","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-keyboard-state.test.tsx","sha256":"21a7a8e830b4f9c6f6c2fbf7f32552892b8bb4b2acc13a6639473a90f8e35534","declarations":4,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-tab-application-launch.test.ts","sha256":"bc456c5b84c5631e9b9ad415bd12cb0cf3d7752cb8f4db02da36f2b709254fed","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"mobile/src/session/use-mobile-session-tab-switching.test.ts","sha256":"805f51ed2b097a9a54f8c147d999fe5e5258540db1f6fc1ecfe1dc30bd67c2b3","declarations":5,"signals":["named","declarations"],"status":"unreviewed"}
@@ -3267,7 +3280,7 @@
{"path":"src/main/claude/claude-fold-steer-receipt.test.ts","sha256":"bc1e6f1be1d311cbdda567d0ae5de1bd0a15ff759c62780852d0687656d4b281","declarations":15,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/main/claude/claude-folder-trust-file-wsl-guest.test.ts","sha256":"0d874f043e5ed11679cccd18a6e7b14738db276666517515d4c0cd123350a3e1","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/main/claude/claude-folder-trust-file.test.ts","sha256":"cd8818c337efea76ce12c8793c27835dc652affd7fb2ed56401965a5e5cf1d6e","declarations":23,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/main/claude/claude-history-window-source-budget.test.ts","sha256":"be03c827e7cfba7dc2bf73737ec333b58fedfa977c0ddf80884af11cce554539","declarations":9,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/main/claude/claude-history-window-source-budget.test.ts","sha256":"9b0cce04e523d73270911fdbb1a2446c5208d0f1d218352432d77d876b768f5c","declarations":9,"signals":["named","declarations","ci-unit"],"status":"reviewed","review":"reviews/root-0011.jsonl"}
{"path":"src/main/claude/claude-hook-event-install.test.ts","sha256":"5e99ab3b15fbfa6eeb4297076c89dd2cae94e4c882591c4629a4a4248d416c82","declarations":11,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/main/claude/claude-hook-event-versions.test.ts","sha256":"0acae89aedeb754e10e16023e83a3dd2ff190da298aef8e661649c884dcd26bb","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/main/claude/claude-informational-row.test.ts","sha256":"12014238c626e618d29e8a426bda4731d7093f931f6e4056ccf98ee93bb3cb5d","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -11749,7 +11762,6 @@
{"path":"src/renderer/src/components/task-page-localized-options.test.ts","sha256":"7689a8b3d1e92b05d286fc911e6f8be4433402267570356fe07a417549f9120d","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page-mutation-page-allocation.test.ts","sha256":"efddd3e60d4cfb5e548da9fe5f9e5feb0e06020d0784cbccd8b948b9494d887f","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page-new-issue-draft.test.ts","sha256":"f2ffe87feda0072a6ddb00f48208f3ae432acba8a451128a977337ff960e36b7","declarations":15,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page-pagination-page-numbers.test.ts","sha256":"ef5991ee15aaa93b3bb0498c4989509afe282fbd072ca1c8ba3de52fe7b2cff1","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page-pr-check-summary.test.ts","sha256":"74001de9ebe4c7689c1325d91feb750aaf9a8a00793f7d8bbdc42614bb26aed2","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page-repo-source-context.test.ts","sha256":"4aeef219f9b74b2628e5573cb237c9c7195a6a00885f9170d44345c11747ed6d","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page-repo-source-divergence.test.ts","sha256":"333020d9b97c3e0bd620a6ea645f21afa306e0eed4f91b2d34858fa3862c594c","declarations":6,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -11765,6 +11777,7 @@
{"path":"src/renderer/src/components/task-page/linear/task-page-linear-issue-empty-state.test.ts","sha256":"6a9ffaec987043a216bf36ca9c7db0f8ca311355833c58ac4f2edae0152b6081","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page/linear/task-page-linear-issue-request.test.ts","sha256":"bb8770a06644992b0d311d6fef7eab89f1ebf88cd959ed92cc11ad1ba314d9ef","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page/linear/task-page-linear-team-selection.test.ts","sha256":"3550496ebbc1e298fe76428ef8532b8fdcde0b9058523a02fa30fec4947a82e7","declarations":9,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-page/task-page-pagination-page-numbers.test.ts","sha256":"ef5991ee15aaa93b3bb0498c4989509afe282fbd072ca1c8ba3de52fe7b2cff1","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-source-context-summary.test.ts","sha256":"77b94fb8df85ffe40176b44fe2295a3e633459f82e4c9ababb23323ea8411c0b","declarations":13,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/task-source-provider-availability.test.ts","sha256":"e79d953eaa54648d353e3f9d8e0fc6cc783cc2565785b8c82364ad2e0f1d2614","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-agent-tab-shortcut.test.ts","sha256":"0af4d15017d38e643c0a05b4f7be3194d19c47483740593ee3d7a41e87e3ae44","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -11910,7 +11923,7 @@
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hibernation-wake.spec.ts","sha256":"b5bbaee3ab45e0a1c4aad90aff30d4976d73c51e18cf4b225ec566880a12de17","declarations":14,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-atlas-recovery.spec.ts","sha256":"59f820c0103e41a14ef38b64861083012abc5fdb2bb820ca5273e90c126deffd","declarations":16,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-backlog-reconciliation.spec.ts","sha256":"824622ccd39d7647891e155c8ac48c2459f40a4e17024b484e9b667f0da3b490","declarations":11,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-backlog-snapshot.test.ts","sha256":"b0e537d8ee1ead1d4bddfee6307b76e914521093a0c25c2faa0175c004b11deb","declarations":11,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-backlog-snapshot.test.ts","sha256":"9ba8ac4ca3d1a824ffa7e4a65fed21fd56d6d50bdb801c11cc2c5ea06786d942","declarations":11,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-codex-queries.spec.ts","sha256":"e46c5db8e0560118d2525bbe8ed284f7c519f670050b40740b78f38598714887","declarations":14,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-delivery-gate.spec.ts","sha256":"5d3c647877d0358ec112aa2fdd18d33a1784abaafee3f2ae3c22e4b41483d77c","declarations":17,"signals":["named","declarations"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/pty-connection-hidden-output-restore.spec.ts","sha256":"2c9577e50860e15fa460199ffc91516d32c39e57f3344bfe3e316f4e3b986f13","declarations":6,"signals":["named","declarations"],"status":"unreviewed"}
@@ -12355,7 +12368,7 @@
{"path":"src/renderer/src/components/terminal-pane/terminal-url-link-hit-testing.test.ts","sha256":"5fedafd2ed8a39b3e00ab16fadde2644b1d44e83a7f40c2af9c35f64cbd4aa40","declarations":4,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-user-input-signal.test.ts","sha256":"c325425bb36a6482d9d2840d872d9e82d3543bae8055557e37fab9a65b25f125","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-view-attributes-publisher.test.ts","sha256":"7f6e318b0e19cffe385a2fbd5c4a5acd26f092748639dea55036854e7d0eb506","declarations":11,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-visibility-resume.test.ts","sha256":"e9e795f52d02a658f4147b6ca1b52903c0394c43ac6d1032d3a16664391e4601","declarations":23,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-visibility-resume.test.ts","sha256":"a7b87edaa34f5fbd0dbe7bab5b0675098b195ce3fc27655f31d6b999a6876fc7","declarations":23,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-webgl-atlas-recovery.test.ts","sha256":"648ed0ba7649fb34b73e31f591bb720dfcfd23404dbfe673c9d828f6e052fda3","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-webgl-diagnostics-breadcrumbs.test.ts","sha256":"269d49df9d5760d7f10cea3ba28e632ac59117a1fd0c8d3c771aeb2a258fb470","declarations":4,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/components/terminal-pane/terminal-windows-shift-enter.test.ts","sha256":"1deb46ab55b4d3f5cfd56685e12a6d1d5e6f90c04ce18bcefb2e1a1c98663706","declarations":19,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -13083,7 +13096,7 @@
{"path":"src/renderer/src/lib/pane-manager/pane-layout-change-notify.test.ts","sha256":"3ef293188a1951f1604501da2eb2529172a6f82db9e504197f7d0770428ece9b","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-layout-geometry-apply.test.ts","sha256":"4a9c1793c868b7f3e62d271b8a5fd21f951ff761cb3da992825340fadd22f3dc","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-lifecycle.test.ts","sha256":"fb71d9df5701cb54bad5c308f92b37e6ad7aacd7513ecf9756a28b9a2f01a2b1","declarations":34,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-manager-registry.test.ts","sha256":"7a256e23e77ee76ad7692b5d9f39290f1e96aca7814a8b6a179d836c204baddd","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-manager-registry.test.ts","sha256":"bf137119e8e517a44b5334e5e49c25fdd635367f22ccb30ef2cb904d2e44a0d4","declarations":14,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-manager-spawn-placement.test.ts","sha256":"ca5449f6bafc3ccca89dc01a7feb13f0075b9049377073d461ce1a7c4828cf31","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-metric-options-deferral.test.ts","sha256":"b145cc410e93dd496e999ce6709a016d93bccf86150364339f810009fa541799","declarations":17,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-overlay-focus.test.ts","sha256":"8fa6814234c5eb9323b3aa85af4c808e6d1874cf623c3cd01ee82f292957510c","declarations":11,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -13112,10 +13125,11 @@
{"path":"src/renderer/src/lib/pane-manager/pane-tree-match-moves.test.ts","sha256":"8b124d334f38016d9a6311e64b9b5b9a4d5188a263440451a8d0081ef2c11ed0","declarations":4,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-tree-ops.test.ts","sha256":"2e28b990cdc65540fdb81533a0b626839acd50d30bcee7ad4b1bc9e5edeae72e","declarations":27,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-tree-reparent-frame.test.ts","sha256":"3437d30481fde5717ff0897b42d8dc0b0eef5ac426c5da62be0bea4ae4737833","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-viewport-present-lifetime.test.ts","sha256":"df546d3fd38823a84a59b6f8005d045c9b62b5500345072bc816f25301ff4fe9","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-viewport-present-lifetime.test.ts","sha256":"d871a557e91aedff237ed86c7b2475a5aef837d57939fb3dc566bf8de6e809a9","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-viewport-present-synchronized-output.test.ts","sha256":"1107a808fdb49e4732dd19f4a9ca37feaf8eb26e3fc8692e39321a4e2d6b6fe4","declarations":2,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-webgl-context-recovery.test.ts","sha256":"d1b382f2756a06878f032241d5856db5798a992551c9bdd330409f2b0cde5512","declarations":10,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-webgl-refresh-lifecycle.test.ts","sha256":"c1b987034ed9b15c150885db4c9618ce770f4087dc6f86727e079ee78b9bfbd8","declarations":5,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-webgl-renderer.test.ts","sha256":"fd138d5ebbdbe99c3d8c6d0af0ae25f14d8c6df91b6b43b34000650599b38212","declarations":24,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/pane-webgl-renderer.test.ts","sha256":"579bc79e5cbc78c37c84a071f03cbc90edd2e93903eec4b1a804a4f097f7e13c","declarations":24,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-arabic-shaping-joiner.test.ts","sha256":"5b01b22d1fdfc5a06f48b6bbec20a9680502319afbc748a54c97d6f20e0c9189","declarations":34,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-canvas-dpr-repair.test.ts","sha256":"8c10017c88c55d99add31525e227c10237d1d91af20a9a9a3fadca7ff456c0dc","declarations":10,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-complex-script.test.ts","sha256":"b4ec16f12239100f5b07202b38b91a15163ae8ead4d30b9d78b573186abd2f08","declarations":33,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -13142,7 +13156,7 @@
{"path":"src/renderer/src/lib/pane-manager/terminal-scroll-intent.test.ts","sha256":"c4d888f46606e0fedc32de6b5c0c598193ee559094571b73311c2fd3224c4a8a","declarations":37,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-stable-cell-fit-addon.test.ts","sha256":"d1ad6b6694d986dceb8f4128e11c9f8eb4ca14f07536681b434373f931d3f3df","declarations":3,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-structural-replay-coordinator.test.ts","sha256":"a0fbf9dfa4b5d73e2cd53301db8119e9087c2d4e0ae411ed3f5229454e6eaf33","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-structural-replay-presentation.test.ts","sha256":"a54cb1fc8263c78ed81dee99e425c9adf67640a9a2b54a4434e25cb87fd17752","declarations":20,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-structural-replay-presentation.test.ts","sha256":"db16912bc21700ecd5929bf2e749acdee494eb7ef244fb01769e0e7f3b97dcf4","declarations":21,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-webgl-auto-policy.test.ts","sha256":"df9700b967168dac4333b7895445a0e3071f2c042dd1eeb7d8f349aeebddddb3","declarations":7,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-webgl-hidden-retention.test.ts","sha256":"b424af4aa10b4c4f399462e16a46fd55d6422e3eb3524262b8dfd1b91c1d72eb","declarations":12,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
{"path":"src/renderer/src/lib/pane-manager/terminal-windows-ctrl-alt-chord-classification.test.ts","sha256":"11a884ada373dfca36b4ff0e49e79804f05305a120985c05fb37dd4af37104ed","declarations":8,"signals":["named","declarations","ci-unit"],"status":"unreviewed"}
@@ -16667,7 +16681,7 @@
{"path":"tests/e2e/terminal-replay-presentation.spec.ts","sha256":"f02d3e612fdd2f75c605d66619d6edd765aaad7a3de36145de2c757e1f86990f","declarations":1,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-reset-input-modes.spec.ts","sha256":"d9fc41975a9f3e7431573379ae6e2056541bb9339ccd30814b1853469fc30bf7","declarations":1,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-restart-persistence.spec.ts","sha256":"1eccd8be16862048bde7e1f9cfa02df3591cacc07ae0fd1ecd3014b548fbbd23","declarations":6,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-reveal-paused-render-repro.spec.ts","sha256":"a99be3886b4f8f981f7f25792a12df82033df972ab9b1f4514cdd6772e2863bc","declarations":4,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-reveal-paused-render-repro.spec.ts","sha256":"152de244eca4463f37e77dcba6277f7f755eaf896fcae18b2b143a61056254da","declarations":4,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-reveal-stale-pty-resize-repro.spec.ts","sha256":"adb87ef6a0e11a0ef617d85feb6967e99acc82e189213e12f977d389a13bd76f","declarations":3,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-screenshot-diff.ts","sha256":"830dae4e534caf3cdeb3a627ebe79821006f6d9a1da1a5fd7894659337c4d416","declarations":0,"signals":["auxiliary"],"status":"unreviewed"}
{"path":"tests/e2e/terminal-scroll-intent-follow.spec.ts","sha256":"c0d7a20c26679827c86e2415fca06eb3825763180981c5e820535f8770ac3ae2","declarations":5,"signals":["named","declarations","auxiliary"],"status":"unreviewed"}
@@ -16888,6 +16902,8 @@
{"path":"tests/tools/windows-pty-native-capability-smoke/run.test.mjs","sha256":"26789f8bcbbbcf9f049d5ec5979dd5d038a345cdac063dbac3efa04583cfece0","declarations":2,"signals":["named","declarations","auxiliary","ci-unit"],"status":"unreviewed"}
{"path":"mobile/src/components/codex-reset-credit-reply-schema.test.ts","sha256":"c678af60248984e43ba07037b775583d1413bdad43616d3b684754af9b17c0aa","status":"removed","review":"reviews/mobile-0002.jsonl"}
{"path":"mobile/src/components/inline-text-selection.test.ts","sha256":"c69c59b5a0a30f8dfc868e3291177cfdbd38e8eef137b44f36fc39f717387352","status":"removed","review":"reviews/mobile-0002.jsonl"}
{"path":"mobile/src/components/mobile-agent-icon-assets.test.ts","sha256":"d9e53f844ce508d4c2954fece2a086b1be78a5d349b702c7210828b664da8c15","status":"removed","review":"reviews/mobile-0003.jsonl"}
{"path":"mobile/src/components/mobile-agent-icon-gradient.test.ts","sha256":"8ebced6d92fcdaebdead9268a61ee3e139c04ddaca7c513767fe9af321c30343","status":"removed","review":"reviews/mobile-0003.jsonl"}
{"path":"src/preload/preload-file-drop-absence.test.ts","sha256":"02e6e092193b66f4e7b7fe2431dac658ef262685c61c9c8fd117c14cb6e6fdd8","status":"removed","review":"reviews/root-0002.jsonl"}
{"path":"native/computer-use-macos/Tests/OrcaComputerUseMacOSTests/AgentEntrypointSourceSafetyTests.swift","sha256":"9a80bb0e559f62ef20db9786ae59a774b69c95114548865a7a577c61f056750b","status":"removed","review":"reviews/root-0004.jsonl"}
{"path":"native/computer-use-macos/Tests/OrcaComputerUseMacOSTests/ScreenCapturePermissionPreflightSafetyTests.swift","sha256":"5f30e4af3f0ed2e760326309002260aa05fc7eec2dd3895bd993ee3718da861d","status":"removed","review":"reviews/root-0004.jsonl"}
+26 -26
View File
@@ -1,45 +1,45 @@
{
"source_commit": "80d4fe99e344f49727eb12d32f2aa20b64e3701d",
"scanned_source_files": 37078,
"source_commit": "533df41f73db3827e0d2d33a82df53b0cdfe47f8",
"scanned_source_files": 37080,
"counts": {
"files": 16888,
"declarations": 119046,
"reviewed": 310,
"files": 16902,
"declarations": 119009,
"reviewed": 488,
"stale": 0,
"unreviewed": 16578,
"removed": 5
"unreviewed": 16414,
"removed": 7
},
"reviewed_original_declarations": 2202,
"reviewed_original_declarations": 3390,
"areas": {
".github": {
"files": 2,
"reviewed": 1,
"reviewed": 2,
"stale": 0,
"unreviewed": 1
"unreviewed": 0
},
"cloud": {
"files": 227,
"reviewed": 85,
"files": 228,
"reviewed": 138,
"stale": 0,
"unreviewed": 142
"unreviewed": 90
},
"config": {
"files": 607,
"reviewed": 85,
"files": 608,
"reviewed": 135,
"stale": 0,
"unreviewed": 522
"unreviewed": 473
},
"docs": {
"files": 52,
"reviewed": 0,
"files": 65,
"reviewed": 25,
"stale": 0,
"unreviewed": 52
"unreviewed": 40
},
"mobile": {
"files": 1269,
"reviewed": 83,
"files": 1267,
"reviewed": 131,
"stale": 0,
"unreviewed": 1186
"unreviewed": 1136
},
"native": {
"files": 17,
@@ -55,9 +55,9 @@
},
"src/main": {
"files": 6617,
"reviewed": 0,
"reviewed": 1,
"stale": 0,
"unreviewed": 6617
"unreviewed": 6616
},
"src/packages": {
"files": 16,
@@ -72,10 +72,10 @@
"unreviewed": 0
},
"src/renderer": {
"files": 5403,
"files": 5404,
"reviewed": 0,
"stale": 0,
"unreviewed": 5403
"unreviewed": 5404
},
"src/shared": {
"files": 1300,
@@ -0,0 +1,43 @@
{
"batch": "batch-0003",
"base_commit": "92dfb4fda69e746e96786ea7af417813ac441394",
"implementation_commit": "533df41f73db3827e0d2d33a82df53b0cdfe47f8",
"new_original_files_reviewed": 180,
"new_case_records": 1188,
"re_reviewed_upstream_files": 1,
"changed_test_files": 70,
"net_test_lines": -318,
"production_changes": false,
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 pnpm run check:code-quality:changed -- origin/main",
"result": "Passed after rebase.",
"log": "/tmp/orca-audit-3-quality-rebased.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node config/scripts/check-react-doctor-changed.mjs origin/main",
"result": "Passed after rebase.",
"log": "/tmp/orca-audit-3-react-doctor-rebased.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node --test .github/actions/cloud-sql-rollout-lease/action-contract.test.mjs .github/actions/cloud-sql-rollout-lease/storage-lease.test.mjs docs/site/tests/docs-package.test.mjs docs/site/tests/search-excerpt.test.mjs",
"result": "28 passed, zero failures/skips, after rebase.",
"log": "/tmp/orca-root-0007-tests-rebased.log"
}
],
"tracker": {
"unique_original_files": 495,
"present_reviewed": 488,
"removed": 7,
"stale": 0,
"unreviewed": 16414,
"case_records": 3390,
"original_rows_hash_verified": 496,
"errors": []
},
"notes": [
"Each original content hash and latest retained content hash independently verified. Case-level coverage checked by refresh.mjs against original AST declarations.",
"Rebase onto merged predecessor imported all completed earlier records. One upstream build-cli suite changed, reread and all seven tests passed; new root-0013 record supersedes its old review.",
"Archived source/dependency drift and environment-specific skips remain explicit in per-batch records. Comprehensive audit remains in progress."
]
}
@@ -0,0 +1,423 @@
{
"batch": "cloud-0003",
"reviewer": "audit_cloud",
"checkout": "/home/neil/orca/workspaces/orca/comprehensive-test-audit-3",
"source_commit": "6d473f4bea1d190cb3649af97e04f1cdde170c5f",
"implementation_base": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"original_hash_reconciliation": "All 50 selected original file contents and all 3 encountered support files match the implementation checkout; no upstream source differences required reconciliation.",
"reviewed_files": 50,
"support_files": 3,
"original_declarations": 400,
"final_declarations": 392,
"decisions": {
"keep": 312,
"fix": 80,
"remove": 8
},
"parameterized_declarations": 25,
"review_scope": "Read every original body/table and relevant production implementation; each parameter table row and additional body-loop matrix is recorded individually. Fixture/setup/workload repetition is distinguished from behavioral subcases.",
"checks": [
{
"command": [
"pnpm",
"exec",
"vitest",
"run",
"--maxWorkers=1",
"src/cell-seat-feed.test.ts",
"src/cell-seat-log.test.ts",
"src/config.test.ts",
"src/connection-reservation-debt-retention.test.ts",
"src/control-accept-cell-row-lock-postgres.test.ts",
"src/control-accept-cell-row-lock.test.ts",
"src/control-lease-recovery-postgres.test.ts",
"src/control-rebind-inventory-lock-postgres.test.ts",
"src/control-renewal-batch-store.test.ts",
"src/control-renewal-batch.test.ts",
"src/control-renewal-postgres.test.ts",
"src/control-reservation-reconnect-claim.test.ts",
"src/credential-cleanup-sweep-postgres.test.ts",
"src/credential-store-cleanup.test.ts",
"src/credential-store.test.ts",
"src/database-connect-stall-postgres.test.ts",
"src/database-postgres-timeout.test.ts",
"src/database-statement-timeout-postgres.test.ts",
"src/database-transient-error.test.ts",
"src/database.test.ts",
"src/dead-cell-evacuation-precheck.test.ts",
"src/dead-relay-tables-postgres.test.ts",
"src/director-reserve-placement-status.test.ts",
"src/drain-migration-row-lookup.test.ts",
"src/drain-migration-row-scaling.test.ts",
"src/drain-release-cell-row-contention-postgres.test.ts",
"src/drain-return-admission.test.ts",
"src/floating-promise-census.test.ts",
"src/host-close-reason-memory.test.ts",
"src/host-control-proof-cleanup.test.ts",
"src/host-control-resume-identity.test.ts",
"src/host-session-client-accept.test.ts",
"src/host-session-drain-release-order.test.ts",
"src/host-session-preauth-latency.test.ts",
"src/host-session-registry.test.ts",
"src/host-signed-out-rejection.test.ts",
"src/host-whereabouts-app.test.ts",
"src/idle-regional-rehome-reconciliation.test.ts",
"src/idle-regional-rehome-store.test.ts",
"src/idle-regional-rehome-window.test.ts",
"src/idle-regional-rehome-worker.test.ts",
"src/migration-recovery-postgres.test.ts",
"src/placement-load-band.test.ts",
"src/post-proof-close-log.test.ts",
"src/postgres-checked-out-client-error.test.ts",
"src/postgres-commit-with-final-write-postgres.test.ts",
"src/postgres-drain-send-locking.test.ts",
"src/postgres-idle-client-error.test.ts",
"src/postgres-lock-wait-sample-postgres.test.ts",
"src/postgres-lock-wait-sample.test.ts"
],
"cwd": "cloud/apps/relay",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1",
"ORCA_RELAY_TEST_POSTGRES_URL": "fresh localhost:55440 database orca_audit_cloud_0003_final",
"ORCA_IDLE_REHOME_POSTGRES_URL": "same database; unique disposable schema per case"
},
"result": "50 suites passed; 453 runtime tests passed, including real PostgreSQL SQL/lock/timeout/planner/transaction/recovery checks and all 11 real paced contention scenarios.",
"log": "/tmp/orca-cloud3-postgres-final.log"
},
{
"command": [
"pnpm",
"exec",
"vitest",
"run",
"--maxWorkers=2",
"src/cell-seat-feed.test.ts",
"src/cell-seat-log.test.ts",
"src/config.test.ts",
"src/connection-reservation-debt-retention.test.ts",
"src/control-accept-cell-row-lock-postgres.test.ts",
"src/control-accept-cell-row-lock.test.ts",
"src/control-lease-recovery-postgres.test.ts",
"src/control-rebind-inventory-lock-postgres.test.ts",
"src/control-renewal-batch-store.test.ts",
"src/control-renewal-batch.test.ts",
"src/control-renewal-postgres.test.ts",
"src/control-reservation-reconnect-claim.test.ts",
"src/credential-cleanup-sweep-postgres.test.ts",
"src/credential-store-cleanup.test.ts",
"src/credential-store.test.ts",
"src/database-connect-stall-postgres.test.ts",
"src/database-postgres-timeout.test.ts",
"src/database-statement-timeout-postgres.test.ts",
"src/database-transient-error.test.ts",
"src/database.test.ts",
"src/dead-cell-evacuation-precheck.test.ts",
"src/dead-relay-tables-postgres.test.ts",
"src/director-reserve-placement-status.test.ts",
"src/drain-migration-row-lookup.test.ts",
"src/drain-migration-row-scaling.test.ts",
"src/drain-release-cell-row-contention-postgres.test.ts",
"src/drain-return-admission.test.ts",
"src/floating-promise-census.test.ts",
"src/host-close-reason-memory.test.ts",
"src/host-control-proof-cleanup.test.ts",
"src/host-control-resume-identity.test.ts",
"src/host-session-client-accept.test.ts",
"src/host-session-drain-release-order.test.ts",
"src/host-session-preauth-latency.test.ts",
"src/host-session-registry.test.ts",
"src/host-signed-out-rejection.test.ts",
"src/host-whereabouts-app.test.ts",
"src/idle-regional-rehome-reconciliation.test.ts",
"src/idle-regional-rehome-store.test.ts",
"src/idle-regional-rehome-window.test.ts",
"src/idle-regional-rehome-worker.test.ts",
"src/migration-recovery-postgres.test.ts",
"src/placement-load-band.test.ts",
"src/post-proof-close-log.test.ts",
"src/postgres-checked-out-client-error.test.ts",
"src/postgres-commit-with-final-write-postgres.test.ts",
"src/postgres-drain-send-locking.test.ts",
"src/postgres-idle-client-error.test.ts",
"src/postgres-lock-wait-sample-postgres.test.ts",
"src/postgres-lock-wait-sample.test.ts"
],
"cwd": "cloud/apps/relay",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"result": "38 suites passed, 12 PostgreSQL-only suites skipped; 377 runtime tests passed and 72 PostgreSQL-only cases skipped.",
"log": "/tmp/orca-cloud3-sqlite-final.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 pnpm --dir cloud typecheck",
"result": "All cloud package and app typechecks passed after building cloud contract/schema packages.",
"log": "/tmp/orca-cloud3-typecheck-final.log"
},
{
"command": "pnpm run check:code-quality:changed",
"result": "Passed; root gate explicitly excludes cloud/.",
"log": "/tmp/orca-cloud3-quality.log"
},
{
"command": "pnpm run check:react-doctor:changed",
"result": "Passed, 0 changed-line errors; this independent gate includes cloud/.",
"log": "/tmp/orca-cloud3-react-doctor-final.log"
},
{
"command": "git diff --check -- cloud",
"result": "Passed"
},
{
"command": "pnpm exec oxfmt --config=/tmp/orca-cloud3-oxfmt.json --ignore-path=/dev/null --write <33 changed test files>",
"result": "Formatted changed code, retaining original unchanged statement/case formatting to avoid unrelated churn; cloud/ is excluded from the root formatter configuration.",
"log": "/tmp/orca-cloud3-format.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 pnpm --dir cloud/apps/relay exec vitest run src/host-session-registry.test.ts",
"result": "91 tests passed after preserving the intentionally partial, never-read fixture in the existing mid-cutover rejection case.",
"log": "/tmp/orca-cloud3-registry-final.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 ORCA_RELAY_TEST_POSTGRES_URL=<fresh isolated mutation database> pnpm --dir cloud/apps/relay exec vitest run src/control-rebind-inventory-lock-postgres.test.ts",
"result": "2 tests passed after final cleanup formatting.",
"log": "/tmp/orca-cloud3-rebind-final.log"
},
{
"command": "Scoped pg_stat_activity check after test processes completed",
"result": "Zero remaining client sessions in the three batch databases; all four temporary mutation configs deleted."
}
],
"initial_validation_findings": [
"Initial run exposed fixture book.clear missing during unconditional drain; supplied that actual cleanup surface.",
"The strict identity request schema excludes command-only fields; retained independent full wire-body assertions and complete typed safety snapshot rather than using the wrong schema.",
"Initial cloud typecheck required building cloud contract/schema packages.",
"Changed-line React Doctor findings were fixed; no rule suppressions added."
],
"mutations": [
{
"id": "refresh-recency",
"source": "host-close-reason-memory.ts",
"needle": " this.entries.delete(key)\n this.entries.set(key,",
"replacement": " this.entries.set(key,",
"test": "host-close-reason-memory.test.ts",
"title": "re-recording refreshes recency",
"command": [
"pnpm",
"exec",
"vitest",
"run",
"--config=/tmp/orca-cloud3-refresh-recency.vitest.mjs",
"-t",
"re-recording refreshes recency"
],
"exit": 1,
"log": "/tmp/orca-cloud3-mutation-refresh-recency.log",
"result": "targeted retained test failed with mutation applied; source file unchanged on disk"
},
{
"id": "pool-wrong-event",
"source": "database.ts",
"needle": " pool.on('error', () => {",
"replacement": " pool.on('connect', () => {",
"test": "postgres-idle-client-error.test.ts",
"title": "absorbs the pool error",
"command": [
"pnpm",
"exec",
"vitest",
"run",
"--config=/tmp/orca-cloud3-pool-wrong-event.vitest.mjs",
"-t",
"absorbs the pool error"
],
"exit": 1,
"log": "/tmp/orca-cloud3-mutation-pool-wrong-event.log",
"result": "targeted retained test failed with mutation applied; source file unchanged on disk"
},
{
"id": "cleanup-expiry-index",
"source": "credential-store.ts",
"needle": "WHERE expires_at <= ? AND state IN (?, ?, ?)",
"replacement": "WHERE expires_at <= ? AND LOWER(state) IN (?, ?, ?)",
"test": "credential-cleanup-sweep-postgres.test.ts",
"title": "plans both invite sweeps",
"command": [
"pnpm",
"exec",
"vitest",
"run",
"--config=/tmp/orca-cloud3-cleanup-expiry-index.vitest.mjs",
"-t",
"plans both invite sweeps"
],
"exit": 1,
"log": "/tmp/orca-cloud3-mutation-cleanup-expiry-index.log",
"result": "targeted retained test failed with mutation applied; source file unchanged on disk"
},
{
"id": "fused-deadlock-retry",
"source": "database.ts",
"needle": "return code === '40P01' || code === '40001' || code === '55P03' || code === '57014'",
"replacement": "return code === '40001' || code === '55P03' || code === '57014'",
"test": "postgres-commit-with-final-write-postgres.test.ts",
"title": "retries a deadlock raised by the fused message",
"command": [
"pnpm",
"exec",
"vitest",
"run",
"--config=/tmp/orca-cloud3-fused-deadlock-retry.vitest.mjs",
"-t",
"retries a deadlock raised by the fused message"
],
"exit": 1,
"log": "/tmp/orca-cloud3-mutation-fused-deadlock-retry.log",
"result": "targeted retained test failed with mutation applied; source file unchanged on disk"
}
],
"mutation_method": "Four isolated Vitest Vite transforms altered the actual loaded production module in the test process only. Each targeted test failed at its intended boundary, each applied-transform marker was observed, source bytes were checked unchanged, and each temporary configuration was deleted. PostgreSQL mutations used a separate fresh database. Production files remained unchanged on disk throughout.",
"implementation_reconciliations": [
"Whole-host candidate pages intentionally retain every target fallback, so this three-target fixture has an independently asserted maximum of 102 candidates rather than truncating at 100.",
"Idle-client test uses the actual pg.Pool EventEmitter without opening a connection, so subscribing to the wrong event cannot pass.",
"The final fused-message deadlock test uses an actual PostgreSQL trigger raising 40P01 on the first update, driven by a nontransactional sequence, so the transaction under test must retry rather than relying on the server choosing a particular deadlock victim."
],
"changed_files": [
{
"path": "cloud/apps/relay/src/cell-seat-feed.test.ts",
"sha256": "d95676c889380ac05e56c75c51c4fcff1ba6635f856772b86d475c0ce466dc12"
},
{
"path": "cloud/apps/relay/src/control-accept-cell-row-lock.test.ts",
"sha256": "3ab794c308aeb1f2c738f0c8439999dd3c79442351bf1802834d485ec4fdf1a1"
},
{
"path": "cloud/apps/relay/src/control-rebind-inventory-lock-postgres.test.ts",
"sha256": "90d3e5a930b567e88bad1c5b372ce2d46917a209057f5f91252494c3eb2611f5"
},
{
"path": "cloud/apps/relay/src/control-renewal-batch-store.test.ts",
"sha256": "856bce7b93b3ca0fb9aed7bd59ff0fc4d6909b5b13345e7e897eaae8d40c3797"
},
{
"path": "cloud/apps/relay/src/control-renewal-postgres.test.ts",
"sha256": "1c5032198245240fbdfdba935a9214116cd8798c71e85dceed930050c6fe9e9a"
},
{
"path": "cloud/apps/relay/src/credential-cleanup-sweep-postgres.test.ts",
"sha256": "5129a0dbd975ad12bee655675582c4898ced0df8dabf8e73f5130b9dde146131"
},
{
"path": "cloud/apps/relay/src/credential-store-cleanup.test.ts",
"sha256": "8274533789ba4332d233507bd17c2c83156aa30421deb3bc1dd5ccbb398a8306"
},
{
"path": "cloud/apps/relay/src/credential-store.test.ts",
"sha256": "12570ddac3ae51f4ea015c4effd70c95bdd6830ce9084c1f602af0e74775fc3d"
},
{
"path": "cloud/apps/relay/src/database-connect-stall-postgres.test.ts",
"sha256": "f2e196714898b1a51b10b659de90d2c0095284f1a45f155a3795d5bc074c744b"
},
{
"path": "cloud/apps/relay/src/database-postgres-timeout.test.ts",
"sha256": "910caabb96ac8a196c182df07322b589a74645e35463663928926738a5df3a32"
},
{
"path": "cloud/apps/relay/src/database-statement-timeout-postgres.test.ts",
"sha256": "8a767423720af5eea5f35e0bd0fce73a9849c47a105659f7688bdbf22c8bf362"
},
{
"path": "cloud/apps/relay/src/database.test.ts",
"sha256": "e12b26f76368231c088b786be743102a166591da866c311aedec693489d4f41a"
},
{
"path": "cloud/apps/relay/src/dead-relay-tables-postgres.test.ts",
"sha256": "956a752584134198451aa2c11f2470bab4d2a360487b909e57b61c4cda876758"
},
{
"path": "cloud/apps/relay/src/director-reserve-placement-status.test.ts",
"sha256": "7c3bab48bcbdfa90e3db6fb4a22537322aaaf7a54e1c12e499225ccd3dd1f770"
},
{
"path": "cloud/apps/relay/src/drain-release-cell-row-contention-postgres.test.ts",
"sha256": "e45ed3017e70377493a84776e8b3f3e80a14ea468df320c164514d25fc2e0166"
},
{
"path": "cloud/apps/relay/src/floating-promise-census.test.ts",
"sha256": "a863b2eb430294bd4846bc02759000cda99e3701eed66ba07be52805968e6664"
},
{
"path": "cloud/apps/relay/src/host-close-reason-memory.test.ts",
"sha256": "92da427416a1f2d55121eacfed26027e18e8bdb44e8f5b297801edb4ffad6e9e"
},
{
"path": "cloud/apps/relay/src/host-control-resume-identity.test.ts",
"sha256": "ac29bd21d656e17c6722a27b01e8b48be26d02ed0a4195ccf151d1741f2e04ae"
},
{
"path": "cloud/apps/relay/src/host-session-client-accept.test.ts",
"sha256": "22c7e48886aea21ab072762d4b2b8a2e0e9003709ecb09b63885c692192d9df9"
},
{
"path": "cloud/apps/relay/src/host-session-preauth-latency.test.ts",
"sha256": "a48b9c7035700f1436b66dd2341d7880f530b3be9a9141cda9cb46101c0fe9a4"
},
{
"path": "cloud/apps/relay/src/host-session-registry.test.ts",
"sha256": "f285b3724340fe47f09640ab65375fc640f88f14c6f09b08d093865e307a64bf"
},
{
"path": "cloud/apps/relay/src/host-whereabouts-app.test.ts",
"sha256": "3bf9908dfa2fb9d01d555851b2694520c540f8a5283bea62208e1f6ed5c684da"
},
{
"path": "cloud/apps/relay/src/idle-regional-rehome-reconciliation.test.ts",
"sha256": "fa3bc53d0a5a2f37df623867d09d3d479c4744783e6ada51accdf4c7e204a2ca"
},
{
"path": "cloud/apps/relay/src/idle-regional-rehome-store.test.ts",
"sha256": "5df06920367ee17690f0f5446dc2240567e8ad4fc3e806a471b8bff59c5c0b86"
},
{
"path": "cloud/apps/relay/src/idle-regional-rehome-window.test.ts",
"sha256": "ae3e946a75587a7387c5403abb790e51716f61dfae0b5bf5b1c18c57a1cb673f"
},
{
"path": "cloud/apps/relay/src/idle-regional-rehome-worker.test.ts",
"sha256": "6c4d6339e6a960dbf3523af84a1ba64cbc45c798049a5e0454cb74bbbd08f770"
},
{
"path": "cloud/apps/relay/src/migration-recovery-postgres.test.ts",
"sha256": "8a61b80052eac264d4e92f3b8c181130a2117b0e9648a1050f05e3d7b001ed33"
},
{
"path": "cloud/apps/relay/src/placement-load-band.test.ts",
"sha256": "f8aba58bbb49fb869e8db1f43e224432fb8074e9cc041865fe58b484fb64dbf9"
},
{
"path": "cloud/apps/relay/src/postgres-checked-out-client-error.test.ts",
"sha256": "0b7da794a86f39ffb6c583f70803e3a6a1755ebdfbaa0e4c25c8a79f0b891581"
},
{
"path": "cloud/apps/relay/src/postgres-commit-with-final-write-postgres.test.ts",
"sha256": "8dd628f605cc2c94a75f7612b831aca9bb522ad68bbd136935460ac418f4896c"
},
{
"path": "cloud/apps/relay/src/postgres-drain-send-locking.test.ts",
"sha256": "b0ecdbafdff311bfd70f98ed11626a13c4dbf80a555108e3c59c50fe587ab1c0"
},
{
"path": "cloud/apps/relay/src/postgres-idle-client-error.test.ts",
"sha256": "57d81afc1b9dfbcf275b7f814c9c2dbb634fbf51fc23f48c11ac5883da32eccf"
},
{
"path": "cloud/apps/relay/src/postgres-lock-wait-sample-postgres.test.ts",
"sha256": "e2830bcfa3bae572dd31bc2c4178248ab534ea87b9a72de4b6030993d036e0c8"
}
],
"production_changes": [],
"staging": "Uncommitted and unstaged; parent owns staging, inventory refresh and PR coordination.",
"remaining_concerns": [],
"log_note": "Local log paths are session evidence pointers; commands, results, mutation descriptions and content hashes are retained here for durable review."
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,300 @@
{
"batch": "config-0003",
"reviewer": "audit_config",
"platform": "Linux",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"upstream_reconciliation": "All 50 saved original hashes match the new audit-3 checkout and Git bytes at the source commit; no upstream candidate changes required reconciliation.",
"reviewed_files": 50,
"standard_suite_files": 42,
"standalone_or_support_files": 8,
"original_declarations": 328,
"final_declarations": 317,
"case_decisions": {
"keep": 301,
"fix": 16,
"consolidate": 7,
"remove": 4
},
"changed_test_files": [
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/counterbalanced-benchmark-schedule.test.mjs",
"config/scripts/create-draft-release.test.mjs",
"config/scripts/daily-build-version.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs",
"config/scripts/dev-electron-bundle-identity.test.ts",
"config/scripts/electron-builder-config.test.mjs",
"config/scripts/ensure-native-runtime-job-ownership.test.mjs",
"config/scripts/generate-bundled-skill-guides.test.mjs",
"config/scripts/generate-runtime-required-english-catalog.test.mjs",
"config/scripts/generated-artifact-line-ending-pin.test.mjs",
"config/scripts/happy-dom-mutation-observer-retention.test.ts",
"config/scripts/happy-dom-offscreen-canvas.test.ts"
],
"test_diff": {
"added": 87,
"deleted": 167,
"net": -80
},
"checks": [
{
"command": [
"node",
"config/scripts/run-vitest.mjs",
"run",
"--config",
"config/vitest.config.ts",
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/counterbalanced-benchmark-schedule.test.mjs",
"config/scripts/create-draft-release.test.mjs",
"config/scripts/daemon-protocol-facts.test.mjs",
"config/scripts/daily-build-version.test.mjs",
"config/scripts/dark-build-switches.test.mjs",
"config/scripts/dependency-security-audit.test.mjs",
"config/scripts/dependency-security-patches.test.mjs",
"config/scripts/dependency-security-release.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs",
"config/scripts/dev-channel-orcad-template-workflow.test.mjs",
"config/scripts/dev-channel-windows-staging.test.mjs",
"config/scripts/dev-cli-terminal-wrapper.test.mjs",
"config/scripts/dev-electron-bundle-cache.test.ts",
"config/scripts/dev-electron-bundle-identity.test.ts",
"config/scripts/dev-storage-reclaim.test.mjs",
"config/scripts/dev-web-client-freshness.test.mjs",
"config/scripts/e2e-cli-artifact-capability.test.mjs",
"config/scripts/electron-builder-config.test.mjs",
"config/scripts/electron-builder-mac-channel-config.test.mjs",
"config/scripts/electron-builder-native-rebuild.test.mjs",
"config/scripts/electron-builder-runtime-resources.test.mjs",
"config/scripts/electron-builder-speech-config.test.mjs",
"config/scripts/electron-runtime-floor.test.ts",
"config/scripts/electron-vite-development-config.test.ts",
"config/scripts/electron-vite-output-contract.test.ts",
"config/scripts/ensure-native-runtime-job-ownership.test.mjs",
"config/scripts/ensure-native-runtime.test.mjs",
"config/scripts/ephemeral-vm-runtime-store-cross-version.test.ts",
"config/scripts/foreign-sqlite-reader-worker-smoke.test.mjs",
"config/scripts/generate-bundled-skill-guides.test.mjs",
"config/scripts/generate-monaco-associations.test.mjs",
"config/scripts/generate-runtime-required-english-catalog.test.mjs",
"config/scripts/generate-skill-bundle-manifest.test.mjs",
"config/scripts/generate-terminal-perf-html-report.test.mjs",
"config/scripts/generated-artifact-line-ending-pin.test.mjs",
"config/scripts/git-pull-request-diff-base.test.mjs",
"config/scripts/github-opened-issue-repository.test.ts",
"config/scripts/github-pr-assignee-repository.test.ts",
"config/scripts/hang-watchdog-process-metrics.test.mjs",
"config/scripts/happy-dom-mutation-observer-retention.test.ts",
"config/scripts/happy-dom-offscreen-canvas.test.ts"
],
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"exit_code": 0,
"elapsed_seconds": 12.52,
"log": "/tmp/orca-config-0003-tests.log",
"result": "41 suites passed, 1 intentionally disabled suite skipped; 378 tests passed, 6 skipped"
},
{
"command": [
"node",
"config/scripts/run-vitest.mjs",
"run",
"--config",
"config/vitest.config.ts",
"config/scripts/electron-builder-config.test.mjs"
],
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"result": "Final compact FileMatcher fixture: 37 tests passed, 1 Windows-only test skipped",
"exit_code": 0,
"log": "/tmp/orca-config-0003-builder-final.log"
},
{
"command": [
"node",
"config/scripts/run-vitest.mjs",
"run",
"--config",
"config/vitest.config.ts",
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs"
],
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1",
"ORCA_COMPUTER_SMOKE_APPS": "ambient-override-must-not-select-any-app",
"ORCA_PUBLISHED_VERSIONS": "v99.0.0 v98.0.0"
},
"result": "15 tests passed despite unrelated ambient values; actual default smoke targets and environment parser defaults are isolated",
"exit_code": 0,
"log": "/tmp/orca-config-0003-ambient-env-final.log"
},
{
"command": [
"pnpm",
"run",
"check:code-quality:changed",
"--",
"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b"
],
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"result": "Passed; every code-quality/casting/plugins/type-aware/React Doctor/design-system/SAFETY scan reported 0 new findings across 22 changed files at that concurrent-worktree snapshot",
"exit_code": 0,
"log": "/tmp/orca-config-0003-code-quality-final.log"
},
{
"command": [
"pnpm",
"run",
"check:react-doctor:changed",
"--",
"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b"
],
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"result": "Passed; 0 changed-line errors",
"exit_code": 0,
"log": "/tmp/orca-config-0003-react-doctor-final.log"
},
{
"command": [
"pnpm",
"exec",
"oxlint",
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/counterbalanced-benchmark-schedule.test.mjs",
"config/scripts/create-draft-release.test.mjs",
"config/scripts/daily-build-version.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs",
"config/scripts/dev-electron-bundle-identity.test.ts",
"config/scripts/electron-builder-config.test.mjs",
"config/scripts/ensure-native-runtime-job-ownership.test.mjs",
"config/scripts/generate-bundled-skill-guides.test.mjs",
"config/scripts/generate-runtime-required-english-catalog.test.mjs",
"config/scripts/generated-artifact-line-ending-pin.test.mjs",
"config/scripts/happy-dom-mutation-observer-retention.test.ts",
"config/scripts/happy-dom-offscreen-canvas.test.ts"
],
"exit_code": 0,
"stdout": "",
"stderr": "",
"result": "passed"
},
{
"command": [
"pnpm",
"exec",
"oxfmt",
"--check",
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/counterbalanced-benchmark-schedule.test.mjs",
"config/scripts/create-draft-release.test.mjs",
"config/scripts/daily-build-version.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs",
"config/scripts/dev-electron-bundle-identity.test.ts",
"config/scripts/electron-builder-config.test.mjs",
"config/scripts/ensure-native-runtime-job-ownership.test.mjs",
"config/scripts/generate-bundled-skill-guides.test.mjs",
"config/scripts/generate-runtime-required-english-catalog.test.mjs",
"config/scripts/generated-artifact-line-ending-pin.test.mjs",
"config/scripts/happy-dom-mutation-observer-retention.test.ts",
"config/scripts/happy-dom-offscreen-canvas.test.ts"
],
"exit_code": 0,
"stdout": "Checking formatting...\n\nAll matched files use the correct format.\nFinished in 19ms on 13 files using 24 threads.\n",
"stderr": "",
"result": "passed"
},
{
"command": [
"git",
"diff",
"--check",
"--",
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/counterbalanced-benchmark-schedule.test.mjs",
"config/scripts/create-draft-release.test.mjs",
"config/scripts/daily-build-version.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs",
"config/scripts/dev-electron-bundle-identity.test.ts",
"config/scripts/electron-builder-config.test.mjs",
"config/scripts/ensure-native-runtime-job-ownership.test.mjs",
"config/scripts/generate-bundled-skill-guides.test.mjs",
"config/scripts/generate-runtime-required-english-catalog.test.mjs",
"config/scripts/generated-artifact-line-ending-pin.test.mjs",
"config/scripts/happy-dom-mutation-observer-retention.test.ts",
"config/scripts/happy-dom-offscreen-canvas.test.ts"
],
"exit_code": 0,
"stdout": "",
"stderr": "",
"result": "passed"
},
{
"command": "Parse original/final candidates using the actual refresh.mjs declaration parser without running inventory refresh; verify original Git SHA-256, all original line/title decisions, retained consolidation destinations, and final filesystem SHA-256",
"result": "50 original and 50 final hashes match; 328 original declarations have decisions; 317 remain after 7 consolidations and 4 removals; all retained destination declarations exist",
"exit_code": 0,
"artifacts": [
"/tmp/orca-config-0003-final-cases.json",
"docs/audits/test-value/reviews/config-0003.jsonl"
]
}
],
"intentional_skips": [
"Four Windows TrackFileAccess rebuild table rows in ensure-native-runtime.test.mjs",
"One Windows-only foreign-architecture workspace-addon case in electron-builder-config.test.mjs",
"One environment-driven ephemeral VM cross-version driver; the external version-sequencing harness was reviewed, not executed"
],
"standalone_execution": "Unchanged standalone daemon smokes and manual benchmarks were classified/read, not executed. The foreign SQLite smoke support is exercised by its actual built-worker suite. Prototype tree-projection timings do not constitute production validation; daemon PTY health remains advisory.",
"coverage_preserved": [
"Release predecessor policy, publication race and rollback safeguards, pagination, and tag/commit identity",
"Security severity/exact exceptions/integrity and trusted release data extraction",
"Real FileMatcher/copy/prune/staged module/native/runtime/ASAR boundaries",
"ARM64 missing-rebuild fallback diagnostic, PE machine and malformed-binary distinction, real C++ patch marker encoding",
"Byte-stable dev signatures and independent safeStorage display identity",
"Actual generated daily ordering, January/July Pacific offsets, and max-based history numbering",
"Guide generation/reference/alias and real Git autocrlf byte behavior",
"Actual post-GC MutationObserver delivery and OffscreenCanvas/xterm integration",
"Mixed-version runtime-store persistence driver, actual SQLite workers, and actual component-to-gh repository routing"
],
"changes": [
"Remove copied obsolete benchmark/RC comparator demonstrations",
"Consolidate stable-release predecessor and repeated native diagnostic scenarios",
"Remove fixture-only identity restoration and duplicate plural/stable-floor/title checks",
"Use generated daily versions, isolated ambient environments, and actual FileMatcher filtering",
"Move five guide EOL path classes into actual Git checkout coverage",
"Require actual GC and OffscreenCanvas instead of silently bypassing the intended regression"
],
"resolved_validation_issue": {
"command": [
"pnpm",
"exec",
"oxlint",
"config/scripts/computer-use-smoke.test.mjs",
"config/scripts/counterbalanced-benchmark-schedule.test.mjs",
"config/scripts/create-draft-release.test.mjs",
"config/scripts/daily-build-version.test.mjs",
"config/scripts/dev-channel-base-version.test.mjs",
"config/scripts/dev-electron-bundle-identity.test.ts",
"config/scripts/electron-builder-config.test.mjs",
"config/scripts/ensure-native-runtime-job-ownership.test.mjs",
"config/scripts/generate-bundled-skill-guides.test.mjs",
"config/scripts/generate-runtime-required-english-catalog.test.mjs",
"config/scripts/generated-artifact-line-ending-pin.test.mjs",
"config/scripts/happy-dom-mutation-observer-retention.test.ts",
"config/scripts/happy-dom-offscreen-canvas.test.ts"
],
"initial_result": "Actual matcher fixture initially brought electron-builder-config.test.mjs to 607 counted lines versus its 600-line limit.",
"resolution": "Reuse the existing local packs adapter pattern and direct positive path assertions; the final raw lint, formatter, builder tests and both changed-line gates passed.",
"initial_log": "/tmp/orca-config-0003-static-checks.json"
},
"production_changes": "none",
"temporary_production_mutations": "none; actual behavioral fixtures exercise retained boundaries",
"commits_or_branch_changes": "none by audit_config",
"inventory_or_readme_edits": "none by audit_config",
"next_pending_path": "config/scripts/headless-detector-compiler-cache.test.mjs",
"log_note": "Exact commands/results and limitations are durable here; /tmp paths point to session evidence. Root coordinates force-add, global validation, inventory refresh, commits and PRs."
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,425 @@
{
"batch": "mobile-0003",
"reviewer": "audit_mobile",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"validation_worktree": "/home/neil/orca/workspaces/orca/comprehensive-test-audit-3",
"scope": {
"files_reviewed": 50,
"original_declarations_reviewed": 315,
"case_decisions": {
"keep": 279,
"remove": 17,
"fix": 11,
"consolidate": 8
},
"first_path": "mobile/src/components/keyed-bottom-drawer.test.tsx",
"last_path": "mobile/src/components/use-html-preview-link-grant.web.test.tsx",
"next_path": "mobile/src/components/use-new-workspace-execution-target.test.tsx"
},
"changes": {
"modified_test_files": [
"mobile/src/components/mobile-diff-review-send-sheet-stacking.test.ts",
"mobile/src/components/mobile-markdown-preview-placeholder.test.ts",
"mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"mobile/src/components/new-workspace-reply-schema.test.ts",
"mobile/src/components/new-worktree-form-sheet-visibility.test.ts",
"mobile/src/components/pr-sidebar/markdown-blocks.test.ts",
"mobile/src/components/pr-sidebar/pr-checks-presentation.test.ts",
"mobile/src/components/pr-sidebar/pr-conflict-presentation.test.ts",
"mobile/src/components/pr-state-token.test.ts",
"mobile/src/components/rich-markdown/document-lifecycle.test.ts",
"mobile/src/components/rich-markdown/editor-content.test.ts",
"mobile/src/components/rich-markdown/markdown-round-trip.test.ts",
"mobile/src/components/rich-markdown/page-stylesheet.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-web-document-mount.test.ts",
"mobile/src/components/right-drawer-hardware-back.test.tsx",
"mobile/src/components/use-html-preview-link-grant.web.test.tsx"
],
"removed_test_files": [
"mobile/src/components/mobile-agent-icon-assets.test.ts",
"mobile/src/components/mobile-agent-icon-gradient.test.ts"
],
"added_test_lines": 140,
"deleted_test_lines": 425,
"net_test_lines": -285,
"supporting_test_config_changes": [
{
"path": "mobile/tests-typecheck-baseline.txt",
"change": "Remove only the stale src/components/mobile-agent-icon-gradient.test.ts grandfather entry after deleting its test file; authorized by the coordinating agent.",
"sha256": "b77d1c5a6409b09345aa82135382ae9b1b0c96c12591eba337781f08f65c9e0b",
"reviewed_sha256": "97153d7ba88d3607bb02f82684440ced08befe42d85e8295e306e1c1100f1120"
}
],
"total_added_lines": 140,
"total_deleted_lines": 426,
"total_net_lines": -286,
"production_files_modified": []
},
"baseline": {
"result": "not-run",
"note": "No pre-edit baseline test run was performed for batch 0003. Saved original sources and hashes were preserved before editing. All 50 originals were checked byte-for-byte against the new checkout source commit; no upstream differences required reconciliation. Passing post-edit results are not represented as a baseline."
},
"checks": [
{
"id": "initial-targeted-repairs",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"test",
"src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"src/components/mobile-diff-review-send-sheet-stacking.test.ts",
"src/components/pr-sidebar/pr-checks-presentation.test.ts",
"src/components/pr-sidebar/markdown-blocks.test.ts",
"src/components/rich-markdown/markdown-round-trip.test.ts",
"src/components/right-drawer-hardware-back.test.tsx"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-initial-validation.log",
"test_files": 6,
"tests": 61
},
{
"id": "retained-batch-final",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"test",
"src/components/keyed-bottom-drawer.test.tsx",
"src/components/markdown-file-path-detection.test.ts",
"src/components/markdown-href-routing.test.ts",
"src/components/markdown-inline-matcher.test.ts",
"src/components/mobile-diff-review-send-sheet-stacking.test.ts",
"src/components/mobile-markdown-android-selection.test.tsx",
"src/components/mobile-markdown-mermaid-routing.test.ts",
"src/components/mobile-markdown-preview-placeholder.test.ts",
"src/components/mobile-markdown-selectable.test.tsx",
"src/components/mobile-markdown-table.test.tsx",
"src/components/mobile-markdown-visual-lines.test.ts",
"src/components/mobile-pr-sidebar-presentation.test.ts",
"src/components/mobile-rich-markdown-editor-keyboard-inset.test.ts",
"src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"src/components/mounted-bottom-drawer-keyboard-seam.test.tsx",
"src/components/mounted-bottom-drawer-page-keyboard.web.test.tsx",
"src/components/new-workspace-project-targets.test.ts",
"src/components/new-workspace-reply-schema.test.ts",
"src/components/new-worktree-agent-selection.test.ts",
"src/components/new-worktree-form-sheet-visibility.test.ts",
"src/components/pr-sidebar/PRCommentsSection.test.ts",
"src/components/pr-sidebar/PRConflictingFilesSection.test.ts",
"src/components/pr-sidebar/markdown-blocks.test.ts",
"src/components/pr-sidebar/markdown-link-scheme.test.ts",
"src/components/pr-sidebar/markdown-table-delimiter-performance.test.ts",
"src/components/pr-sidebar/markdown-tag-stripping-performance.test.ts",
"src/components/pr-sidebar/pr-actions-state.test.ts",
"src/components/pr-sidebar/pr-check-detail-content.test.ts",
"src/components/pr-sidebar/pr-checks-presentation.test.ts",
"src/components/pr-sidebar/pr-comment-card-web-avatar.test.tsx",
"src/components/pr-sidebar/pr-conflict-presentation.test.ts",
"src/components/pr-state-token.test.ts",
"src/components/rich-markdown/document-host-root.test.ts",
"src/components/rich-markdown/document-lifecycle.test.ts",
"src/components/rich-markdown/editor-content.test.ts",
"src/components/rich-markdown/editor-selection.test.ts",
"src/components/rich-markdown/markdown-code-fence-allocation.test.ts",
"src/components/rich-markdown/markdown-round-trip.test.ts",
"src/components/rich-markdown/page-stylesheet.test.ts",
"src/components/rich-markdown/rich-markdown-document-parse-time.test.ts",
"src/components/rich-markdown/rich-markdown-host-seams.test.ts",
"src/components/rich-markdown/rich-markdown-web-document-mount.test.ts",
"src/components/right-drawer-hardware-back.test.tsx",
"src/components/right-drawer-panel-width.test.ts",
"src/components/terminal-shortcut-settings-custom-keys.test.tsx",
"src/components/use-bottom-drawer-follow-up.test.tsx",
"src/components/use-connected-host-picker.test.ts",
"src/components/use-html-preview-link-grant.web.test.tsx"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-final-validation.log",
"test_files": 48,
"tests": 310,
"note": "After this full batch run, the only test changes were a void act callback block and removal of an unused import; both affected suites passed the final-cleanup run."
},
{
"id": "existing-consolidation-coverage",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"test",
"src/components/html-preview-link-affordance.test.tsx",
"src/components/MobileRichMarkdownToolbar.test.tsx",
"src/components/use-new-worktree-drawer-navigation.test.ts",
"src/style-scoping/document-style-scoping.test.ts"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-existing-coverage.log",
"test_files": 4,
"tests": 12
},
{
"id": "final-cleanup-tests",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"test",
"src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"src/components/use-html-preview-link-grant.web.test.tsx"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-final-cleanup-tests.log",
"test_files": 2,
"tests": 9
},
{
"id": "mobile-tests-typecheck",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": ["pnpm", "run", "check:tests-typecheck"],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-typecheck-final.log",
"test_files_in_program": 1110,
"grandfathered_files": 115,
"intentionally_excluded_files": 5
},
{
"id": "changed-test-lint",
"working_directory": ".",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"exec",
"oxlint",
"mobile/src/components/mobile-diff-review-send-sheet-stacking.test.ts",
"mobile/src/components/mobile-markdown-preview-placeholder.test.ts",
"mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"mobile/src/components/new-workspace-reply-schema.test.ts",
"mobile/src/components/new-worktree-form-sheet-visibility.test.ts",
"mobile/src/components/pr-sidebar/markdown-blocks.test.ts",
"mobile/src/components/pr-sidebar/pr-checks-presentation.test.ts",
"mobile/src/components/pr-sidebar/pr-conflict-presentation.test.ts",
"mobile/src/components/pr-state-token.test.ts",
"mobile/src/components/rich-markdown/document-lifecycle.test.ts",
"mobile/src/components/rich-markdown/editor-content.test.ts",
"mobile/src/components/rich-markdown/markdown-round-trip.test.ts",
"mobile/src/components/rich-markdown/page-stylesheet.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-web-document-mount.test.ts",
"mobile/src/components/right-drawer-hardware-back.test.tsx",
"mobile/src/components/use-html-preview-link-grant.web.test.tsx"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-lint-final.log"
},
{
"id": "changed-test-format",
"working_directory": ".",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"exec",
"oxfmt",
"--check",
"mobile/src/components/mobile-diff-review-send-sheet-stacking.test.ts",
"mobile/src/components/mobile-markdown-preview-placeholder.test.ts",
"mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"mobile/src/components/new-workspace-reply-schema.test.ts",
"mobile/src/components/new-worktree-form-sheet-visibility.test.ts",
"mobile/src/components/pr-sidebar/markdown-blocks.test.ts",
"mobile/src/components/pr-sidebar/pr-checks-presentation.test.ts",
"mobile/src/components/pr-sidebar/pr-conflict-presentation.test.ts",
"mobile/src/components/pr-state-token.test.ts",
"mobile/src/components/rich-markdown/document-lifecycle.test.ts",
"mobile/src/components/rich-markdown/editor-content.test.ts",
"mobile/src/components/rich-markdown/markdown-round-trip.test.ts",
"mobile/src/components/rich-markdown/page-stylesheet.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-web-document-mount.test.ts",
"mobile/src/components/right-drawer-hardware-back.test.tsx",
"mobile/src/components/use-html-preview-link-grant.web.test.tsx",
"mobile/tests-typecheck-baseline.txt"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-format-final.log",
"note": "oxfmt matched the 18 surviving modified test files; the baseline text file has no supported formatter."
},
{
"id": "changed-code-quality",
"working_directory": ".",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"run",
"check:code-quality:changed",
"--",
"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-code-quality-changed-final.log",
"note": "Checks the combined worktree diff; all categories reported zero new findings across 22 analyzed files."
},
{
"id": "changed-react-doctor",
"working_directory": ".",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"run",
"check:react-doctor:changed",
"--",
"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-react-doctor-changed-final.log",
"note": "Checks the combined worktree diff; zero errors."
},
{
"id": "diff-whitespace",
"working_directory": ".",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"git",
"diff",
"--check",
"--",
"mobile",
"docs/audits/test-value/reviews/mobile-0003.jsonl",
"docs/audits/test-value/reviews/mobile-0003-validation.json"
],
"result": "passed",
"exit_code": 0,
"log": "/tmp/orca-mobile-0003-diff-check-final.log"
}
],
"preliminary_checks_resolved": [
{
"id": "initial-changed-test-lint",
"working_directory": ".",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"exec",
"oxlint",
"mobile/src/components/mobile-diff-review-send-sheet-stacking.test.ts",
"mobile/src/components/mobile-markdown-preview-placeholder.test.ts",
"mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx",
"mobile/src/components/new-workspace-reply-schema.test.ts",
"mobile/src/components/new-worktree-form-sheet-visibility.test.ts",
"mobile/src/components/pr-sidebar/markdown-blocks.test.ts",
"mobile/src/components/pr-sidebar/pr-checks-presentation.test.ts",
"mobile/src/components/pr-sidebar/pr-conflict-presentation.test.ts",
"mobile/src/components/pr-state-token.test.ts",
"mobile/src/components/rich-markdown/document-lifecycle.test.ts",
"mobile/src/components/rich-markdown/editor-content.test.ts",
"mobile/src/components/rich-markdown/markdown-round-trip.test.ts",
"mobile/src/components/rich-markdown/page-stylesheet.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts",
"mobile/src/components/rich-markdown/rich-markdown-web-document-mount.test.ts",
"mobile/src/components/right-drawer-hardware-back.test.tsx",
"mobile/src/components/use-html-preview-link-grant.web.test.tsx"
],
"result": "failed",
"log": "/tmp/orca-mobile-0003-lint.log",
"issue": "Removing the native constant-return grant case left an unused native hook import.",
"resolution": "Removed the import; final targeted oxlint passed."
},
{
"id": "initial-mobile-tests-typecheck",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": ["pnpm", "run", "check:tests-typecheck"],
"result": "failed",
"log": "/tmp/orca-mobile-0003-typecheck.log",
"issues": [
"The fallback test act callback returned dispatchEvent boolean instead of void.",
"The deleted gradient test remained in the grandfather baseline."
],
"resolution": "Used a void callback block and pruned exactly that baseline entry; final ratchet passed."
},
{
"id": "diagnostic-mobile-test-compiler",
"working_directory": "mobile",
"environment": {
"ORCA_BACKGROUND_LAUNCH": "1"
},
"command": [
"pnpm",
"exec",
"tsc",
"--noEmit",
"-p",
"tsconfig.test.json",
"--pretty",
"false"
],
"result": "failed",
"exit_code": 2,
"log": "/tmp/orca-mobile-0003-tsc-errors.log",
"note": "Diagnostic run exposed the act callback error plus existing grandfathered diagnostics. The ratchet is the repository gate; final ratchet passed after the callback fix and baseline shrink."
}
],
"review_evidence": {
"source_snapshot": "Every original sha256 matches git show at source_commit. Every original declaration location/title matches the preserved extraction, including table declarations and removed cases.",
"final_content": "Every retained file reviewed_sha256 matches final formatted contents; deleted files use null. Unchanged retained files have equal original/final hashes.",
"implementation_review": "Read all 50 actual test files and relevant production implementations. Preserved independent parser oracles, hostile-input VM deadlines, actual callback/bridge/DOM behavior, asynchronous stale-answer guards and positive/negative AST ownership controls.",
"consolidation_coverage": [
"mobile/src/components/html-preview-link-affordance.test.tsx",
"mobile/src/components/MobileRichMarkdownToolbar.test.tsx",
"mobile/src/components/use-new-worktree-drawer-navigation.test.ts",
"mobile/src/style-scoping/document-style-scoping.test.ts"
],
"mutation_checks": "None. The repaired discard fixture presents src/a.ts, moves the controller selection to src/b.ts and verifies the real RPC still targets src/a.ts; it directly distinguishes presented target ownership from current selection.",
"scope_guard": "Only the owned mobile test files, one stale test-typecheck baseline entry and these two review records changed for this batch. No production changes, commits, branch changes or inventory refresh were performed by this reviewer."
},
"production_findings": [
{
"finding": "Dormant editor timer plumbing is speculative: inputTimer initializes to null and is only reset to null; production never schedules a pending edit timer. The removed lifecycle case planted that state itself.",
"evidence": [
"mobile/src/components/rich-markdown/document-scope.ts",
"mobile/src/components/rich-markdown/editor-content.ts",
"mobile/src/components/rich-markdown/create-rich-markdown-editor-document.ts"
],
"action": "Finding only. Production timer fields, seams and cleanup remain untouched per the coordinating agent scope."
}
]
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,55 @@
{
"batch": "root-0007",
"reviewer": "root",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"platform": "Linux",
"reviewed_files": 3,
"original_declaration_sites": 22,
"case_decisions": {
"keep": 8,
"remove": 8,
"fix": 6
},
"review_scope": "Read all original bodies and tables in the action contract and both docs suites, plus the action modules, docs build/routing/layout/media/formatting paths. Source-regex inventories were assessed separately from actual externally interpreted Actions metadata.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node --test .github/actions/cloud-sql-rollout-lease/action-contract.test.mjs .github/actions/cloud-sql-rollout-lease/storage-lease.test.mjs docs/site/tests/docs-package.test.mjs docs/site/tests/search-excerpt.test.mjs",
"result": "28 tests passed; zero failures/skips. Includes the existing 14 storage lease tests retained in root-0006.",
"log": "/tmp/orca-root-0007-tests.log"
},
{
"command": "pnpm exec oxfmt --write .github/actions/cloud-sql-rollout-lease/action-contract.test.mjs .github/actions/cloud-sql-rollout-lease/README.md docs/site/tests/docs-package.test.mjs docs/site/tests/search-excerpt.test.mjs",
"result": "Passed for files included by repository formatter configuration. Explicitly removed trailing blank EOF lines from edited tests."
},
{
"command": "pnpm exec oxlint --no-ignore --format json .github/actions/cloud-sql-rollout-lease/action-contract.test.mjs docs/site/tests/docs-package.test.mjs docs/site/tests/search-excerpt.test.mjs",
"result": "Zero diagnostics across 2 files. The hidden .github action file is excluded by the linter even with this invocation; it is exercised by the actual node:test run."
},
{
"command": "git diff --check -- .github/actions/cloud-sql-rollout-lease docs/site/tests",
"result": "Passed."
}
],
"mutations": [
{
"method": "Import each mutated formatter through a data URL in a temporary copy of the actual revised test module, then run the matching retained test under node --test. No repository production file was modified.",
"cases": [
"Replace linkedText.includes('>') with true: unclosed angle test fails with ERR_SCRIPT_EXECUTION_TIMEOUT.",
"Replace protectedCode.includes(']') with true: unclosed bracket test fails with ERR_SCRIPT_EXECUTION_TIMEOUT."
],
"result": "Both independent guard-removal mutations caught; each child exits 1.",
"log": "/tmp/orca-root-0007-mutations.log"
}
],
"important_retained_boundaries": [
"Shipped Actions node24/main/post/always metadata and caller inputs determine external runner behavior, so these metadata contract tests remain.",
"Docs media links are discovered from current content and checked against actual public assets. GIF helpers return independently expected URLs with matching files. Required fonts and licensing notices remain checked.",
"Formatter tables preserve escapes, malformed tags/brackets, highlighted matches and code. Long malformed inputs run the actual function under a VM deadline."
],
"limitations": [
"No product runtime or wire behavior changes. macOS/Windows native paths are not involved in this batch; VM deadlines and path operations use Node cross-platform APIs.",
"Action source self-containment and one metadata-host literal scan were removed; README no longer claims the test enforces artifact independence.",
"Docs source-text, layout/style and historical filename blacklists were removed. Passing retained unit tests does not establish every deployed route or visual behavior. Real docs build is covered by CI; no new UI validation is claimed.",
"This is a completed three-file batch; archived proof files are separately reviewed and recorded in later batches. Supporting reads here do not establish their completion."
]
}
@@ -0,0 +1,3 @@
{"path":".github/actions/cloud-sql-rollout-lease/action-contract.test.mjs","sha256":"854ccd6d3fd2f71e230368c584df88c1a1393fdc5505fe2a4d4f0c666499bb88","reviewer":"root","evidence":[".github/actions/cloud-sql-rollout-lease/action.yml",".github/actions/cloud-sql-rollout-lease/main.mjs",".github/actions/cloud-sql-rollout-lease/post.mjs",".github/actions/cloud-sql-rollout-lease/gcloud-access-token.mjs",".github/actions/cloud-sql-rollout-lease/storage-lease.test.mjs"],"cases":[{"line":10,"title":"is a node24 JavaScript action with an always-run post step","decision":"keep","reason":"Actions interprets this shipped metadata: the entrypoint and unconditional post lifecycle determine whether owned leases are released on failure/cancel."},{"line":19,"title":"declares the inputs the wave-chain callers depend on","decision":"keep","reason":"The external action input contract supplies run identity and default release behavior to independent workflow callers."},{"line":27,"title":"stays self-contained so it can be duplicated into the public repo","decision":"remove","reason":"Shallow regex import and directory inventories do not establish runnable artifact independence; dynamic imports and runtime resolution escape the scan."},{"line":46,"title":"never reaches for the GCE metadata server","decision":"remove","reason":"Scanning for one host literal does not establish the authentication path; actual token-source behavior is covered by the separately reviewed storage suite."}],"source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewed_sha256":"711d8a6d0afc2dcaaf8f233c2894685bb3e72481d62722be05ccc8261372e324","status":"reviewed","decision":"consolidate","rationale":"Retain Actions lifecycle/input metadata while removing shallow import/host source scans."}
{"path":"docs/site/tests/docs-package.test.mjs","sha256":"6bf5305dbf19474175c2e6d9918c257616ba45525f74e25ccb0cdbd0893d1559","reviewer":"root","evidence":["docs/site/package.json","docs/site/source.config.ts","docs/site/src/lib/source.ts","docs/site/src/lib/demoMedia.mjs","docs/site/src/lib/docs-og-image.tsx","docs/site/THIRD_PARTY_NOTICES.md","docs/site/next.config.ts","docs/site/versioning.config.ts"],"cases":[{"line":43,"title":"docs package has an isolated, reproducible app contract","decision":"remove","reason":"Copied manifest, dependency and pinned version inventory is already exercised by frozen dependency installation and the real docs build."},{"line":68,"title":"all customer-facing docs pages and navigation metadata are present","decision":"fix","reason":"Retain nonempty content/navigation discovery and per-file metadata validation; remove minimum counts and copied page inventory that reject intentional content changes."},{"line":104,"title":"every local media URL referenced by docs resolves in public assets","decision":"keep","reason":"Discover actual referenced media from current docs and check the published asset tree, catching broken customer URLs independently of a copied list."},{"line":125,"title":"docs content does not link to routes that only exist on the marketing site","decision":"fix","reason":"Retain deployment-boundary link checks and require nonempty discovery so missing content cannot pass vacuously."},{"line":135,"title":"published docs do not retain private source provenance","decision":"remove","reason":"Historical provenance strings are a small source blacklist rather than a general publication boundary; arbitrary renamed material passes."},{"line":151,"title":"reviewed private demo media stays outside the publication boundary","decision":"remove","reason":"Three copied historical filenames do not establish whether current published assets are private; intentional content changes otherwise need test edits."},{"line":161,"title":"docs routes stay namespaced and the generated source uses /docs as its base URL","decision":"remove","reason":"Large source-regex and file inventories mix routing, styling and layout implementation; actual namespaced behavior belongs to the built app verification."},{"line":211,"title":"GIF media helpers use the shared poster and video variants","decision":"fix","reason":"Retain helper output and real referenced asset checks; remove unrelated whats-new directory absence inventory."},{"line":225,"title":"versioning seam keeps current docs stable without claiming live versioned routes","decision":"remove","reason":"Checks future scaffold literals and README phrasing instead of calling the version path function or resolving deployed routes."},{"line":239,"title":"OG image fonts ship with their required third-party notice","decision":"fix","reason":"Retain required binary font and license publication assets; remove source-style regex unrelated to font availability."},{"line":254,"title":"docs app has no marketing-only route or analytics dependency","decision":"remove","reason":"Scanning source imports and two directory names is an incomplete dependency/route blacklist rather than observed behavior."}],"source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewed_sha256":"9bd380102a154119728c1c4a1fbbcc877b6fd4a1f22fdc307dcdad3f8ce26c31","status":"reviewed","decision":"consolidate","rationale":"Retain discovered content, deployment links, media helper outputs and font/license assets; trim copied manifest/page/source/style inventories and add nonempty discovery guards."}
{"path":"docs/site/tests/search-excerpt.test.mjs","sha256":"0f0fe3753174cf76f27e443dcb710a67cadf388a6bead9b0c926a974d01abbc5","reviewer":"root","evidence":["docs/site/src/components/docs/search-excerpt.mjs","docs/site/src/components/docs/SearchDialog.tsx"],"cases":[{"line":6,"title":"unterminated escaped link destinations do not backtrack exponentially","decision":"keep","reason":"The real formatter runs on long malformed link destinations under a VM deadline, with independent expected text."},{"line":20,"title":"link destinations retain escaped closing parentheses and literal escapes","decision":"keep","reason":"Input/output tables protect distinct escaping and destination-parsing cases."},{"line":30,"title":"search excerpts omit inline Markdown syntax","decision":"keep","reason":"Observed formatter output protects customer excerpt rendering for common Markdown syntax."},{"line":39,"title":"search excerpts preserve highlighted matches inside Markdown","decision":"keep","reason":"Actual mixed code/highlight/link outputs protect token preservation and nested stripping order."},{"line":63,"title":"unclosed angles avoid the HTML matcher without changing excerpt text","decision":"fix","reason":"Replace global replace monkeypatch and exact regex-source spy with bounded execution of a long unclosed-angle input; disabling the production guard must time out."},{"line":81,"title":"tag guards preserve malformed markup, protected code and highlighted matches","decision":"keep","reason":"Distinct malformed markup, code, highlight and link tables specify actual output independently."},{"line":111,"title":"unclosed brackets avoid link matchers without changing excerpt text","decision":"fix","reason":"Replace internal regex spy with bounded actual formatter execution on long unclosed brackets; disabling the production guard must time out."}],"source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewed_sha256":"331358ef182ec591c9502f760c73ac87f7d0554924785ab1b1c30d7308b49984","status":"reviewed","decision":"fix","rationale":"Replace implementation spies with bounded actual formatter execution."}
@@ -0,0 +1,33 @@
{
"batch": "root-0008",
"reviewer": "root",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"platform": "Linux",
"reviewed_files": 5,
"original_declaration_sites": 0,
"manual_assertion_groups": 5,
"production_changes": false,
"review_scope": "Read all five original scripts/support modules and relevant actual auth operation/waiter, CDP writer/queue and task tracker/frame/retention/string-owner bodies. Narrow batch from earlier pending archive notes; other archive candidates remain unreviewed.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node --expose-gc docs/audits/claude-task-retention/reproduce.cjs",
"result": "Passed all 36 before/after GC arms with baseline sensitivity and fixed/cleanup thresholds.",
"log": "/tmp/orca-root-0008-task-proof.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node docs/audits/cdp-stream-retention/reproduce.mjs",
"result": "Completed 128 MiB manual measurement with eight samples and cleanup. No assertion-bearing test pass is claimed.",
"log": "/tmp/orca-root-0008-cdp-measurement.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node --expose-gc docs/audits/auth-filesystem-wait-retention/reproduce.cjs /tmp/orca-root-0008-auth-results.json",
"result": "Exit 1 before phases: intentional reverse-patch source guard rejects evolved promise-settlement-waiters.ts. Retained as archived proof, not a current-head passing suite.",
"log": "/tmp/orca-root-0008-auth-proof.log"
}
],
"limitations": [
"No production, UI, wire or platform behavior changes. These measurements ran on Linux Node; no Electron or cross-platform memory result is claimed.",
"Archived auth proof requires its matching source graph; old before/after results are historical evidence. It was not rewritten to accept a different graph.",
"This review classifies five standalone/support files only. Other root-0008 pending-note candidates still require full review and records."
]
}
@@ -0,0 +1,5 @@
{"path":"docs/audits/auth-filesystem-wait-retention/reproduce.cjs","sha256":"2208bd827a1a0777b9686b18d36ae0af4a34897479fd07187e239a91af54bff2","reviewed_sha256":"2208bd827a1a0777b9686b18d36ae0af4a34897479fd07187e239a91af54bff2","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-manual-before-after-gc-proof","rationale":"Preserve historical assertion-bearing proof and its deliberate source fences. It bundles actual before/after auth operations and verifies retained references, cancellation and settlement semantics; it is not a current-head CI suite. Current execution correctly rejects upstream source drift, which must not be disguised as a pass or bypassed.","evidence":["docs/audits/auth-filesystem-wait-retention/sources.cjs","docs/audits/auth-filesystem-wait-retention/settlement-order.cjs","src/main/rate-limits/auth-filesystem-operation.ts","src/shared/promise-settlement-waiters.ts"],"cases":[{"line":52,"title":"retention(false/true): 128 abandoned waits at unresolved, settled and dropped stages","decision":"keep","reason":"Weak references, actual abort listener counts and late raw settlement distinguish detached caller objects from an unresolved shared operation. Plain/amplified arms assert candidate reason retention, settled one-reason retention and complete release after owner drop. Controller/payload counts before drop are measurements, not extra collection guarantees.","expanded_arms_per_phase":2},{"line":84,"title":"controls: result delivery, cancellation reasons, admission and sibling survival","decision":"keep","reason":"Actual operation calls and promise settlements verify one raw call, late/settled delivery, raw rejection identity, pre-aborted refusal, four falsy/custom reasons, abort listener removal and a surviving live waiter. Controlled raw promises model an already-started local operation; no natural filesystem stall is claimed."},{"line":217,"title":"before/after settlement-order parity and source provenance","decision":"keep","reason":"The imported settlement-order table uses two wait-start positions, two raw outcomes and six microtask positions (24 per phase); compares full outcomes from independently bundled source variants, records imported hashes, and enforces an outer 15-second deadline.","settlement_order_arms_per_phase":24}],"execution":"Rejected source drift in src/shared/promise-settlement-waiters.ts before phases ran; no current proof pass claimed."}
{"path":"docs/audits/auth-filesystem-wait-retention/sources.cjs","sha256":"115aced3091797efe36bb8814faf88c0822d4168b317473f4867128a59e6dd16","reviewed_sha256":"115aced3091797efe36bb8814faf88c0822d4168b317473f4867128a59e6dd16","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-proof-source-loader","rationale":"Exact reverse patch and recorded baseline SHA-256 bind an archive comparison to its documented source. Its failure on evolved source is an intentional provenance guard; retain without weakening it.","evidence":["docs/audits/auth-filesystem-wait-retention/fix.patch","docs/audits/auth-filesystem-wait-retention/source-versions.json"],"cases":[],"execution":"Source-fence rejection observed from the real proof entrypoint."}
{"path":"docs/audits/auth-filesystem-wait-retention/settlement-order.cjs","sha256":"7648792560e1840df44da64bfd15ec88a4ce38b9c70f686a965788ae014956c9","reviewed_sha256":"7648792560e1840df44da64bfd15ec88a4ce38b9c70f686a965788ae014956c9","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"manual-proof-parameter-table","rationale":"Support table executes real shared-operation waits with controlled raw settlement and abort scheduling; caller compares returned outcomes across old/new sources. It does not implement production settlement selection.","evidence":["docs/audits/auth-filesystem-wait-retention/reproduce.cjs","src/main/rate-limits/auth-filesystem-operation.ts"],"cases":[{"line":3,"title":"2 wait positions x 2 raw outcomes x 6 microtask delays","decision":"keep","reason":"Each of 24 combinations creates its own actual operation and attaches fulfillment/rejection observers, then records the actual winner. Keep as archival parity support; current source fence prevents execution.","expanded_rows":24}]}
{"path":"docs/audits/cdp-stream-retention/reproduce.mjs","sha256":"f9e5f6c91d19427f959ed3cce60fe1d186b534d933e7dbf38cbc4d218a044379","reviewed_sha256":"f9e5f6c91d19427f959ed3cce60fe1d186b534d933e7dbf38cbc4d218a044379","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"manual-measurement-benchmark","rationale":"Preserve useful manual measurements from the real bundled CDP writer and a real paused loopback WebSocket. It emits socket/RSS samples without behavioral assertions or a bound, so successful exit is a completed measurement and not an automated test pass. Automated behavior lives in cdp-client-response-writer.test.ts.","evidence":["src/main/browser/cdp-client-response-writer.ts","src/shared/ws-outbound-backpressure-queue.ts","src/main/browser/cdp-client-response-writer.test.ts"],"cases":[],"execution":"Completed Linux Node v26.8.1 measurement: 128 x 1 MiB events, eight samples; writer terminated stalled socket at queue cap. No RSS threshold or natural incident attribution claimed.","automated_test_cases":0}
{"path":"docs/audits/claude-task-retention/reproduce.cjs","sha256":"a06b6373a26ff3faee61068aa60bce4dbcd358c2fa5adc5864063a77ee7720e7","reviewed_sha256":"a06b6373a26ff3faee61068aa60bce4dbcd358c2fa5adc5864063a77ee7720e7","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"manual-before-after-gc-proof","rationale":"Keep actual task tracker/reader GC proof: the baseline removes only the production retained-string copy, not a copied tracker implementation. Covers live, settled and recently-removed task ownership under three ingress shapes, and verifies cleanup. This is a manual Node/V8 memory proof rather than routine unit CI.","evidence":["src/main/claude/claude-background-task-tracker.ts","src/main/claude/claude-background-task-frames.ts","src/main/claude/claude-settled-background-tasks.ts","src/shared/own-retained-string.ts"],"cases":[{"line":126,"title":"2 count/size choices x 3 ingress shapes x 3 retention states x before/after","decision":"keep","reason":"All 36 arms use actual producer frames. Baseline must retain at least 75% of the parent bytes; fixed owner must retain under 1 MiB, and every arm must release under 1 MiB after clear. Description field only; visibleTextChars is measured and does not assert content parity or coverage of other fields.","expanded_arms":36}],"execution":"All 36 asserted arms passed on Linux Node v26.8.1 with --expose-gc. Max fixed retained heap 88,664 bytes; min baseline retained heap 2,108,136 bytes; max after-clear delta 42,744 bytes."}
@@ -0,0 +1,33 @@
{
"batch": "root-0009",
"reviewer": "root",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"reviewed_files": 5,
"original_declaration_sites": 4,
"manual_driver_groups": 2,
"production_changes": false,
"review_scope": "Read all original three proof candidates plus source loader/config. Cross-check actual permanent destroyed-guest suite/fixture, registration-ownership suite, session/recovery/registry, dispatcher/cache and composition/native ownership boundaries. Permanent suite reads are evidence only and are not separately promoted to reviewed by this batch.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node docs/audits/browser-registration-reply-retention/reproduce.mjs",
"result": "Exit 1 at intentional reverse-patch fence: production browser-page-webview-guest-session.ts changed. No phases ran.",
"log": "/tmp/orca-root-0009-registration-proof.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node docs/audits/browser-destroyed-guest-retention/reproduce.mjs",
"result": "Exit 1 during esbuild launcher setup: historical run-process.ts module was removed upstream. No phases ran.",
"log": "/tmp/orca-root-0009-destroyed-proof.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node -e 'require(\"./docs/audits/browser-closed-result-retention/sources.cjs\").loadSources()'",
"result": "Exit 1: actual loader rejects changed browser-client-host-command-state.ts caller hash. Hash-fenced suite not executed.",
"log": "/tmp/orca-root-0009-closed-source.log"
}
],
"limitations": [
"These are explicitly archived source-bound proofs/support, preserved unchanged. Their historical results do not establish current-head runtime behavior.",
"No UI, native guest, subprocess proof phase, external host or app window was launched. No cross-platform/native memory result is claimed.",
"Current-head permanent suites remain separate audit candidates even where read as evidence.",
"Acknowledged-tab, branch/history and editor lifetime files in pending archive notes remain unreviewed."
]
}
@@ -0,0 +1,5 @@
{"path":"docs/audits/browser-closed-result-retention/scenario.test.mjs","sha256":"93a44e2b2583f397d5c08d29d9de3e1413a9185b893264bf4d468276d8d13ed5","reviewed_sha256":"93a44e2b2583f397d5c08d29d9de3e1413a9185b893264bf4d468276d8d13ed5","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-hash-fenced-gc-suite","rationale":"Preserve a bounded historical actual-source proof with four meaningful lifecycle/source-portability cases. Uses real dispatcher, executor, automation descriptor, native-navigation wrapper and composition, with controlled native promises. Its exact caller/source graph has evolved; source loader currently rejects drift before any cases run. No current test pass or natural incident attribution claimed.","evidence":["docs/audits/browser-closed-result-retention/sources.cjs","docs/audits/browser-closed-result-retention/vitest.config.mjs","src/main/browser/browser-client-host-command-dispatcher.ts","src/main/browser/browser-client-host-command-result-cache.ts","src/main/browser/browser-client-page-command-executor-test-harness.ts","src/main/browser/browser-client-page-automation-runtime.ts","src/main/browser/browser-route-guest-lifecycle.ts","src/main/browser/paired-runtime-browser-client-host-teardown.ts"],"cases":[{"line":93,"title":"keeps completed actual automation results behind one pending native navigation after close timeout","decision":"keep","reason":"Thirty-two real automation result objects observed only by WeakRef distinguish closed result-cache retention from native handler custody. Checks canceled queued input, abort/closed admission, repeat close and pending whenClosed, then resolves native port in finally and verifies actual route/session release. The 15ms join is intentional timed-boundary coverage, not an arbitrary sleep."},{"line":234,"title":"does not retain late completed cancellation records while a sibling native handler remains owned","decision":"keep","reason":"Settles one actual controlled handler after close while another remains pending; checks late record/cache eviction and unsettled dispatcher, then rejects sibling and checks final cleanup. Covers a distinct late-settlement retaining path."},{"line":282,"title":"preserves open replay and generation fencing independently of closed cache release","decision":"keep","reason":"Observes actual Promise identity, one handler invocation, stale-generation refusal and explicit forget release; it does not infer duplicate delivery from a capability flag."},{"line":318,"title":"loads identical canonical hashes from synthetic CRLF source and patch reads","decision":"keep","reason":"Injected filesystem reads supply actual CRLF source/patch bytes to the real loader, comparing reconstructed before/after graphs and canonical hashes. This tests archive portability rather than copied production text."}],"execution":"Not run: actual source loader rejects changed browser-client-host-command-state.ts caller hash before suite setup. Existing recorded results are historical."}
{"path":"docs/audits/browser-closed-result-retention/sources.cjs","sha256":"9d05c182b2052265dae299ae328d1db039168bbd84608a1a6f8ad5f9df75fbbc","reviewed_sha256":"9d05c182b2052265dae299ae328d1db039168bbd84608a1a6f8ad5f9df75fbbc","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-proof-source-loader","rationale":"Keep canonical-LF reverse patch plus before/fixed/caller hash fences. The four-case suite includes a real CRLF read control. Changed caller hashes must be reviewed against the archived graph rather than silently accepted.","evidence":["docs/audits/browser-closed-result-retention/fix.patch","docs/audits/browser-closed-result-retention/source-versions.json","docs/audits/browser-closed-result-retention/scenario.test.mjs"],"cases":[]}
{"path":"docs/audits/browser-closed-result-retention/vitest.config.mjs","sha256":"b85dd0f517b27434995e63088fab1ff22f0e8815791fc4fa440f2d6ab298ef06","reviewed_sha256":"b85dd0f517b27434995e63088fab1ff22f0e8815791fc4fa440f2d6ab298ef06","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-proof-runner-configuration","rationale":"Non-test support loads the hash-fenced source variants at actual production module IDs and restricts suites/workers. Source transforms do not duplicate production semantics. Preserve with its matching historical graph; current caller drift prevents startup.","evidence":["docs/audits/browser-closed-result-retention/sources.cjs","config/vitest.config.ts"],"cases":[]}
{"path":"docs/audits/browser-destroyed-guest-retention/reproduce.mjs","sha256":"8a9b3316089cdae9409a6375b29a0a9f51742e2f78cd4558b4ab6a9027cf2752","reviewed_sha256":"8a9b3316089cdae9409a6375b29a0a9f51742e2f78cd4558b4ab6a9027cf2752","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-manual-before-after-driver","rationale":"Keep the historical exact-boundary mutation runner. It transforms the real destruction guard and augments the actual nine-case regression suite with map-count observations, with bounded child work and finally cleanup. Main has since removed the referenced run-process.ts launcher, so it is not a current-head runnable validation command. Do not replace the historical source graph or claim pass.","evidence":["src/main/browser/browser-manager-destroyed-guest.test.ts","src/main/browser/browser-manager-destroyed-guest-test-fixture.ts","src/main/browser/browser-manager-guest-navigation-policy.ts","src/main/browser/browser-manager-state.ts","src/main/browser/browser-manager-registration.ts","src/main/browser/browser-manager-download-lifecycle.ts"],"cases":[{"line":132,"title":"before/after destruction-guard mutation with 1000-guest callback observations","decision":"keep","reason":"Actual manager regressions require expected baseline failures and fixed successes plus callback retention counts. EventEmitter guest ports control lifecycle only; manager registration/cleanup maps own observations. Script records child exit codes but its pass expression checks reports/counts, so no stronger exit/timeout guarantee is asserted here."}],"execution":"Exit 1 during bundle setup: historical src/shared/child-process/run-process.ts no longer exists; no before/after cases ran."}
{"path":"docs/audits/browser-registration-reply-retention/reproduce.mjs","sha256":"7dcc15e63d1fdc16866240e0dbf96ab0532ebc7115cda78399d879c11f7d0221","reviewed_sha256":"7dcc15e63d1fdc16866240e0dbf96ab0532ebc7115cda78399d879c11f7d0221","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-manual-before-after-driver","rationale":"Keep the historical in-memory reverse-patch driver and actual registration-ownership regressions. It compares retained closed IDs and unregister accounting under deferred IPC replies. Production session source has changed, and its explicit patch fence currently rejects that drift; rewriting the archive to a different source graph would erase its provenance.","evidence":["src/renderer/src/components/browser-pane/host-guest/browser-page-registration-ownership.test.ts","src/renderer/src/components/browser-pane/host-guest/browser-page-webview-guest-session.ts","src/renderer/src/components/browser-pane/host-guest/browser-page-guest-recovery.ts","src/renderer/src/components/browser-pane/host-guest/webview-registry.ts","docs/audits/browser-registration-reply-retention/fix.patch"],"cases":[{"line":119,"title":"before/after late-registration mutation with 1000 closed guest IDs","decision":"keep","reason":"Real session/recovery/registry suite covers closed owners, replacements, same-element remounts, current hidden/inconclusive replies and repair ownership. Count observer augments its existing assertion rather than implementing registry behavior. Pass expression checks expected report/counts, while exit codes are observations only."}],"execution":"Exit 1 at reverse-patch fence for browser-page-webview-guest-session.ts before child setup; no current-head proof pass claimed."}
@@ -0,0 +1,23 @@
{
"batch": "root-0010",
"reviewer": "root",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"reviewed_files": 4,
"original_declaration_sites": 4,
"manual_control_groups": 2,
"production_changes": false,
"review_scope": "Read every lifecycle case, fixture/table, loader control and source-overlay body. Cross-check actual current model bridge, shell cleanup hook, disposal controller and legacy surface. The archived graph is intentionally different from evolved current product behavior.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 ORCA_CLOSED_MODEL_LOADER_OUTPUT=/tmp/orca-root-0010-loader-results.json node docs/audits/closed-editor-model-lifetime/loader-controls.cjs",
"result": "Exit 1 at intentional dependency hash fence for node_modules/zustand/package.json. No controls or lifecycle cases ran; no current-head pass claimed.",
"log": "/tmp/orca-root-0010-loader.log"
}
],
"limitations": [
"Files retained unchanged as explicitly archived actual-source proofs/support. Historical Node/Electron results are not new validation.",
"The source/dependency graph must match its manifest to reproduce. No hash weakening, dependency downgrade, app window, native Monaco widget or rendered UI check was performed.",
"Monaco logical character counts and disposal identities do not establish native allocation size or incident memory growth.",
"Permanent current-head editor tests remain separate audit candidates."
]
}
@@ -0,0 +1,4 @@
{"path":"docs/audits/closed-editor-model-lifetime/lifecycle.test.mjs","sha256":"afc0b7e45e056d1f730ac58f266094471b58187646c91b4436b909544a3a4e29","reviewed_sha256":"afc0b7e45e056d1f730ac58f266094471b58187646c91b4436b909544a3a4e29","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-hash-fenced-lifecycle-suite","rationale":"Preserve four meaningful actual-store/model lifetime scenarios from a named historical source graph. Installed Monaco creates real models; shell/panel bodies are explicit ports and cleanup uses actual surface/store/hook paths. This is model disposal identity evidence, not native editor behavior or heap/RSS. Current dependency/source fences prevent startup against evolved code; no current-head pass claimed.","evidence":["docs/audits/closed-editor-model-lifetime/sources.cjs","docs/audits/closed-editor-model-lifetime/vitest.config.mjs","src/renderer/src/lib/editor-model-registry.ts","src/renderer/src/components/editor/useClosedEditorTabCleanup.ts","src/renderer/src/components/editor/closed-editor-tab-controller.ts","src/renderer/src/components/editor/closed-editor-tab-disposal.ts","src/renderer/src/components/TerminalLegacyEditorSurface.tsx","src/renderer/src/store/slices/store-test-helpers.ts"],"cases":[{"line":142,"title":"measures distinct last-file closes when the final editor removes the panel","decision":"keep","reason":"Eight distinct actual Monaco models and real Store close actions expose the last-editor panel-unmount lifetime. Asserts both panel/store removal and remaining model count after a microtask; seeded paths/256KiB content are bounded fixtures, not field measurements."},{"line":163,"title":"disposes a closed model while another file keeps the panel mounted","decision":"keep","reason":"Actual model identities distinguish closed-model disposal from the independent live sibling that keeps the panel mounted. Positive sibling control rules out disposing all models."},{"line":180,"title":"measures a close while hidden followed by another editor remount","decision":"keep","reason":"Hides the real legacy surface before actual file close, then opens another model and remounts; checks old model disposal and total current models. Exercises hidden cleanup without equating a normal unmount with closure."},{"line":202,"title":"preserves a still-open model across a normal panel unmount and remount","decision":"keep","reason":"Checks the same actual open model survives hiding and remains the registry instance after remount. It controls the false repair of unconditional model disposal."}]}
{"path":"docs/audits/closed-editor-model-lifetime/loader-controls.cjs","sha256":"4cdcf0309ff0acce00cff5f5b17ce91236f5eaa27245de65c651dd4c6535a352","reviewed_sha256":"4cdcf0309ff0acce00cff5f5b17ce91236f5eaa27245de65c651dd4c6535a352","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-manual-source-loader-controls","rationale":"Keep explicit source-graph portability and drift controls for this historical proof. They test loader reconstruction rather than copied editor behavior. Current installed Zustand package hash differs from the recorded manifest, so loader rejects before these controls run; do not rewrite the manifest to bypass provenance.","evidence":["docs/audits/closed-editor-model-lifetime/sources.cjs","docs/audits/closed-editor-model-lifetime/source-versions.json","docs/audits/closed-editor-model-lifetime/main-context.patch"],"cases":[{"line":15,"title":"2 historical graphs x 2 variants with LF/CRLF/publication read ports","decision":"keep","reason":"Compares actual loader-reconstructed hashes for normal reads, CRLF source reads and a virtual published checkout, across all four graph/variant combinations. Keep as archive reconstruction support."},{"line":43,"title":"reject a deliberately changed fixed source graph","decision":"keep","reason":"Injects actual changed setup bytes and requires loader rejection. The adjacent alias string check establishes historical context composition only; it is not an editor-alias runtime test."}]}
{"path":"docs/audits/closed-editor-model-lifetime/sources.cjs","sha256":"d5914770eb9db3c75b153b55d7f2f94415d3ab1850bc5b021be1165d104828be","reviewed_sha256":"d5914770eb9db3c75b153b55d7f2f94415d3ab1850bc5b021be1165d104828be","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-proof-source-loader","rationale":"Non-test support validates dependencies, source variants, exact forward/reverse patches and historical main/worktree context before yielding module contents. Canonical LF permits CRLF checkouts while all hashes stay fenced. Retain as archive provenance rather than adapt old source hashes to current behavior.","evidence":["docs/audits/closed-editor-model-lifetime/source-versions.json","docs/audits/closed-editor-model-lifetime/fix.patch","docs/audits/closed-editor-model-lifetime/main-context.patch","docs/audits/closed-editor-model-lifetime/loader-controls.cjs"],"cases":[]}
{"path":"docs/audits/closed-editor-model-lifetime/vitest.config.mjs","sha256":"bfe98cdc66445e31801a9b64f698f158110dc7a8b1ec8f92ef7f99a5fb296444","reviewed_sha256":"bfe98cdc66445e31801a9b64f698f158110dc7a8b1ec8f92ef7f99a5fb296444","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-proof-runner-configuration","rationale":"Non-test support resolves named source overlays and rejects unfenced repository imports, then runs only the historical four-case headless DOM suite with one worker. This source closure prevents accidental current-source mixing. Current dependency drift correctly stops it before tests.","evidence":["docs/audits/closed-editor-model-lifetime/sources.cjs","docs/audits/closed-editor-model-lifetime/lifecycle.test.mjs","config/vitest.config.ts"],"cases":[]}
@@ -0,0 +1,39 @@
{
"batch": "root-0011",
"reviewer": "root",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"reviewed_files": 2,
"original_declaration_sites": 9,
"manual_driver_groups": 1,
"case_decisions": {
"keep": 9,
"fix": 1
},
"production_changes": false,
"review_scope": "Read complete permanent source-budget fixture and all nine bodies, archival driver, actual current history collector/reader, branch proof/replay and bounded-file reader. Current history uses two streaming ancestry passes; archival proof describes the earlier one-read contract.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node config/scripts/run-vitest.mjs run --config config/vitest.config.ts src/main/claude/claude-history-window-source-budget.test.ts",
"result": "9 tests passed, zero skips/failures.",
"log": "/tmp/orca-root-0011-history-suite.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node docs/audits/claude-history-window-budget/reproduce.mjs",
"result": "Exit 1 at intentional reverse-patch source fence for claude-structured-history-window.ts; archival phases not run.",
"log": "/tmp/orca-root-0011-history-proof.log"
},
{
"command": "pnpm exec oxfmt --check src/main/claude/claude-history-window-source-budget.test.ts",
"result": "Passed."
},
{
"command": "pnpm exec oxlint src/main/claude/claude-history-window-source-budget.test.ts",
"result": "Passed, no diagnostics."
}
],
"limitations": [
"Only test wording/comment changed; no assertion, file/protocol/runtime behavior changed. Shared Node path/file APIs preserve cross-platform scope; local validation was Linux.",
"Largest stream chunk is not a retained-memory, heap, RSS or leak measurement. Existing real source/descriptor/prompt/growth/error assertions are retained.",
"Branch-proof streaming archives remain unreviewed and are excluded from this batch, even though their entrypoint drift was inspected."
]
}
@@ -0,0 +1,2 @@
{"path":"src/main/claude/claude-history-window-source-budget.test.ts","sha256":"be03c827e7cfba7dc2bf73737ec333b58fedfa977c0ddf80884af11cce554539","reviewed_sha256":"9b0cce04e523d73270911fdbb1a2446c5208d0f1d218352432d77d876b768f5c","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"fix","classification":"current-unit-regression-suite","rationale":"Retain actual file/stream/proof/replay boundary coverage and correct one unsupported resident-memory claim to the measured chunk-size property. No assertion or production behavior changed.","evidence":["src/main/claude/claude-structured-history-window.ts","src/main/claude/claude-transcript-branch-proof.ts","src/shared/node-bounded-file-reader.ts"],"cases":[{"line":152,"title":"reads a stable history without changing prompt evidence","decision":"keep","reason":"Actual transcript file and actual history reader retain the expected latest provider item and consistent boundary."},{"line":158,"title":"streams two passes over one descriptor rather than one whole-file read","decision":"keep","reason":"Real FileHandle/stream wrappers observe one open, two stream passes and twice the source bytes. The fixture does not implement history selection or replay."},{"line":166,"title":"opens no second pass when nothing followed the anchor","decision":"keep","reason":"Retains the valid anchor marker while removing only the later record, so empty output is a proven consistent boundary rather than a torn/unprovable transcript."},{"line":184,"title":"resolves a source past the legacy whole-file limit instead of refusing it","decision":"keep","reason":"Actual valid JSONL larger than 16 MiB must return the latest history item and read beyond the old total-file bound."},{"line":197,"title":"keeps resident bytes bounded by the chunk size, not the file size","decision":"fix","reason":"Rename to the actual observed property: reads a large history in chunks smaller than 1 MiB. peakChunkBytes measures individual stream chunks, not resident or retained heap; preserve the assertion and correct the comment rather than claiming a memory bound it cannot prove."},{"line":204,"title":"refuses a single record too large to frame","decision":"keep","reason":"A real oversized JSONL record exercises the per-record framer bound independently of the accepted large total file."},{"line":212,"title":"replays a concurrent repair at the grown size, not the pinned one","decision":"keep","reason":"Injects real file growth after descriptor stat, completing a torn record. Latest+grown item identities, three passes and one descriptor establish the retried proof and replay observe the same repaired snapshot."},{"line":237,"title":"preserves the inconsistent result on a read error","decision":"keep","reason":"The actual opened read stream is destroyed with a controlled error; result must remain inconsistent, with afterEach checking every opened handle closes."},{"line":242,"title":"does not open a source without an anchor","decision":"keep","reason":"Actual reader must reject the unproven boundary before opening/reading any transcript; this is an admission property with observed filesystem effects."}]}
{"path":"docs/audits/claude-history-window-budget/reproduce.mjs","sha256":"f7ce76164924bc9272af0d199f5698f44030252768f4287ae839f0c6b7d42630","reviewed_sha256":"f7ce76164924bc9272af0d199f5698f44030252768f4287ae839f0c6b7d42630","source_commit":"8d94ed06570adb2b7300cf16fe9f43b4680e3f2b","reviewer":"root","status":"reviewed","decision":"keep","classification":"archived-manual-before-after-driver","rationale":"Preserve historical reverse-patch proof with real files, post-stat growth injection, original seven-case source-budget suite, process outcome checks and finally cleanup. Production history now uses two streaming ancestry passes and the permanent suite has nine cases; current exact patch fence correctly rejects the old graph. Historical evidence is not a current-head passing validation.","evidence":["docs/audits/claude-history-window-budget/fix.patch","src/main/claude/claude-history-window-source-budget.test.ts","src/main/claude/claude-structured-history-window.ts","src/shared/node-bounded-file-reader.ts","src/main/claude/claude-transcript-branch-proof.ts"],"cases":[{"line":128,"title":"historical source-budget before/after comparison","decision":"keep","reason":"Checks exactly one expected baseline failure, six baseline controls and seven fixed successes, both child exit codes and no timeouts. Source transforms run actual reader modules; current source drift prevents phases and must not be bypassed."}]}
@@ -0,0 +1,32 @@
{
"batch": "root-0012",
"reviewer": "root",
"source_commit": "8d94ed06570adb2b7300cf16fe9f43b4680e3f2b",
"reviewed_files": 8,
"original_declaration_sites": 0,
"manual_case_records": 96,
"production_changes": false,
"review_scope": "Read complete eight archive source/driver/support files, every static fixture and expanded table, transform/provenance and actual current branch graph/reader/framer. Read current resolver, recovery and history suites as supporting evidence; do not mark those permanent files reviewed here. Historical rewind suite and verifier module are absent from current source.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node --expose-gc docs/audits/claude-branch-proof-streaming/reproduce.cjs /tmp/orca-root-0012-branch-proof-results.json",
"result": "Exit 1 at exact reverse-patch source fence before all phases. No current proof pass.",
"log": "/tmp/orca-root-0012-branch-proof.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node docs/audits/claude-branch-proof-streaming/regressions.mjs /tmp/orca-root-0012-regression-results.json",
"result": "Exit 1 at exact reverse-patch source fence before runner startup. No suites ran.",
"log": "/tmp/orca-root-0012-regressions.log"
},
{
"command": "node parityCases() enumeration; original/final SHA-256 reconciliation",
"result": "51 table fixtures enumerated, all eight original/final files match source commit. Enumeration is not test execution."
}
],
"limitations": [
"Archived historical graph retained unchanged; no dependency downgrade, source fence weakening, production mutation or app window.",
"No current-head parity/allocation/growth/duration/verifier/regression passes claimed. Static declaration hints are zero; explicit manual case records classify standalone assertions.",
"Archived regressor asserts report success, not exact file/case totals; verifier injection flag is not asserted. Scope claims reflect those limits.",
"Memory samples and synthetic timing do not identify incident causes or guarantee a total memory cap."
]
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,26 @@
{
"batch": "root-0013",
"reviewer": "root",
"source_commit": "533df41f73db3827e0d2d33a82df53b0cdfe47f8",
"reviewed_files": 1,
"original_declaration_sites": 7,
"repeat_review": true,
"production_changes": false,
"review_scope": "Reconcile sole stale inventory file after rebasing onto merged main. Read complete seven test bodies, fixture and actual build/tsrs command/selection support. Existing source hash and case records remain as history; new row supersedes them.",
"checks": [
{
"command": "ORCA_BACKGROUND_LAUNCH=1 node config/scripts/run-vitest.mjs run --config config/vitest.config.ts config/scripts/build-cli.test.mjs",
"result": "7 tests passed, zero skips. Includes actual installed TypeScript/Bun/tsrs output and type-error behavior on Linux x64.",
"log": "/tmp/orca-root-0013-build-cli.log"
},
{
"command": "ORCA_BACKGROUND_LAUNCH=1 pnpm install --frozen-lockfile",
"result": "Passed after rebase; installed updated pinned Bun 1.4.4 and tsrs 0.18.0.",
"log": "/tmp/orca-audit-3-post-rebase-install.log"
}
],
"limitations": [
"Suite unchanged by this batch; upstream platform-gate reuse preserves original behavior. Local validation covers Linux x64, not separate macOS/Windows hosts.",
"Seven declaration records include explicitly recorded multiple-negative and compiler/error body arms; runtime declarations are not multiplied in aggregate."
]
}
@@ -0,0 +1 @@
{"path":"config/scripts/build-cli.test.mjs","sha256":"3e609e5b2b405f6906f23f6ba2cde8f4996b28ab434dde2a6c5e36b5e5fbd8fc","cases":[{"line":65,"title":"checks the emit project first, retains all CPU cores and preserves the TypeScript emitter","decision":"keep","reason":"Compile invocation checks typecheck-before-emission and the project, CPU and emitter options affecting output."},{"line":104,"title":"does not emit when checking fails or the pinned Bun is missing","decision":"keep","reason":"Failed checking or missing pinned Bun must suppress emission.","subcases":["typecheck failure suppresses emitter","missing pinned Bun suppresses emitter"]},{"line":119,"title":"propagates emitter failures","decision":"keep","reason":"Signal failure from the emitter must propagate to the build."},{"line":129,"title":"rejects unknown compiler selections before emission","decision":"keep","reason":"Unknown compiler selection fails before any emitted output."},{"line":137,"title":"produces byte-identical JavaScript, declarations and maps with the real compilers","decision":"keep","reason":"Actual compiler outputs, declarations and maps match an independently invoked TypeScript baseline."},{"line":169,"title":"blocks output for real type errors and rejects compiler version drift","decision":"keep","reason":"Real type errors block emission and incompatible installed compiler versions fail.","subcases":["real invalid TypeScript prevents emitter","incompatible installed TypeScript version prevents emitter"]},{"line":195,"title":"the optional compiler preserves emitted bytes and blocks output on type errors","decision":"keep","reason":"Optional Rust compiler emits identical real artifacts and refuses a new output directory after type errors.","subcases":["optional actual compiler produces same artifacts as actual Bun plus TypeScript baseline","real invalid TypeScript produces no new failed output directory"]}],"reviewer":"root","status":"reviewed","decision":"keep","rationale":"Reread all seven complete bodies and actual build/compiler selection. Upstream replaces a copied platform predicate with production supportsTsrs(), which retains the same supported platforms. Keep real emitted artifact comparisons and deliberate error inputs. No new code edits; this row supersedes the stale initial review without counting the file twice.","evidence":["config/scripts/build-cli.mjs","config/scripts/tsrs-typecheck-compiler.mjs","config/scripts/run-typecheck-projects-in-parallel.mjs","config/scripts/pinned-bun-executable.mjs"],"source_commit":"533df41f73db3827e0d2d33a82df53b0cdfe47f8","reviewed_sha256":"3e609e5b2b405f6906f23f6ba2cde8f4996b28ab434dde2a6c5e36b5e5fbd8fc","classification":"current-suite-rereview-after-upstream-change"}
+4 -158
View File
@@ -40,60 +40,12 @@ function isMediaPath(urlPath) {
return /\.(?:gif|jpe?g|png|webp|mp4|svg|ico)$/i.test(urlPath.split(/[?#]/, 1)[0])
}
test('docs package has an isolated, reproducible app contract', async () => {
const packageJson = JSON.parse(await read('package.json'))
assert.equal(packageJson.name, '@orca/docs')
assert.equal(packageJson.private, true)
assert.equal(packageJson.packageManager.split('+')[0], 'pnpm@12.14.0')
assert.equal(packageJson.engines.node, '24.x')
assert.equal(packageJson.scripts.build, 'next build')
assert.equal(packageJson.scripts.postinstall, 'fumadocs-mdx')
assert.equal(packageJson.scripts.prebuild, 'fumadocs-mdx')
for (const dependency of [
'fumadocs-core',
'fumadocs-mdx',
'fumadocs-ui',
'next',
'react',
'react-dom'
]) {
assert.ok(packageJson.dependencies[dependency], `missing runtime dependency: ${dependency}`)
}
assert.ok(packageJson.devDependencies.typescript)
assert.ok(packageJson.devDependencies.vercel)
assert.ok(existsSync(path.join(siteRoot, 'pnpm-lock.yaml')))
})
test('all customer-facing docs pages and navigation metadata are present', async () => {
test('docs content and navigation metadata are discoverable', async () => {
const pages = await walkFiles(contentRoot, '.mdx')
assert.ok(
pages.length >= 57,
`expected at least the current 57 docs pages, found ${pages.length}`
)
for (const relativePath of [
'index.mdx',
'install.mdx',
'first-session.mdx',
'agents/supported.mdx',
'cli/reference.mdx',
'remote-servers.mdx',
'review/github.mdx',
'settings.mdx',
'troubleshooting.mdx'
]) {
assert.ok(
existsSync(path.join(contentRoot, relativePath)),
`missing docs page: ${relativePath}`
)
}
assert.ok(pages.length > 0, 'expected docs content pages')
const navigationFiles = await walkFiles(contentRoot, 'meta.json')
assert.ok(
navigationFiles.length >= 8,
`expected at least the current navigation files, found ${navigationFiles.length}`
)
assert.ok(navigationFiles.length > 0, 'expected navigation metadata')
for (const file of navigationFiles) {
const metadata = JSON.parse(await readFile(file, 'utf8'))
assert.ok(metadata.title, `navigation title missing in ${file}`)
@@ -124,6 +76,7 @@ test('every local media URL referenced by docs resolves in public assets', async
test('docs content does not link to routes that only exist on the marketing site', async () => {
const files = await walkFiles(contentRoot, '.mdx')
assert.ok(files.length > 0, 'expected docs content pages')
for (const file of files) {
const content = await readFile(file, 'utf8')
for (const match of content.matchAll(/\]\((\/(?!docs(?:\/|[)#]))[^)\s]+)\)/g)) {
@@ -132,82 +85,6 @@ test('docs content does not link to routes that only exist on the marketing site
}
})
test('published docs do not retain private source provenance', async () => {
const files = [
...(await walkFiles(contentRoot, '.mdx')),
...(await walkFiles(contentRoot, 'meta.json')),
path.join(siteRoot, 'README.md')
]
for (const file of files) {
const content = await readFile(file, 'utf8')
assert.doesNotMatch(
content,
/orca-(?:internal|marketing-website)|147cdfd|jinwoo@stably\.ai|demo-generation/i,
path.relative(siteRoot, file)
)
}
})
test('reviewed private demo media stays outside the publication boundary', async () => {
const files = await walkFiles(publicRoot)
for (const file of files) {
assert.doesNotMatch(
path.relative(publicRoot, file),
/(?:codex-account-switcher|default-agent-opening|any-cli-agent)/i
)
}
})
test('docs routes stay namespaced and the generated source uses /docs as its base URL', async () => {
const source = await read('src/lib/source.ts')
const sourceConfig = await read('source.config.ts')
const rootPage = await read('src/app/page.tsx')
const nextConfig = await read('next.config.ts')
const searchDialog = await read('src/components/docs/SearchDialog.tsx')
const appLayout = await read('src/app/layout.tsx')
const docsLayout = await read('src/app/docs/layout.tsx')
const ogImage = await read('src/lib/docs-og-image.tsx')
const header = await read('src/components/layout/DocsHeader.tsx')
const footer = await read('src/components/layout/DocsFooter.tsx')
const appFiles = await walkFiles(path.join(siteRoot, 'src', 'app'))
assert.match(source, /baseUrl:\s*['"]\/docs['"]+/)
assert.match(
sourceConfig,
/dir:\s*['"]content\/docs['"]|dir:\s*docsVersioning\.current\.sourceDir/
)
assert.match(sourceConfig, /light:\s*['"]github-light['"]+/)
assert.match(sourceConfig, /dark:\s*['"]github-dark-high-contrast['"]+/)
assert.match(rootPage, /redirect\(['"]\/docs['"]\)/)
assert.match(nextConfig, /assetPrefix:\s*['"]\/docs-static['"]+/)
assert.match(searchDialog, /api:\s*['"]\/docs\/api\/search['"]+/)
assert.doesNotMatch(appLayout, /forcedTheme|className=['"][^'"]*\bdark\b/)
assert.match(docsLayout, /<main\b/)
assert.match(docsLayout, /themeSwitch=\{\{\s*enabled:\s*false\s*\}\}/)
assert.match(header, /<ThemeSwitch\b/)
assert.match(footer, /<h2\b/)
assert.match(appLayout, /(?:icon|shortcut):\s*['"]\/docs\/favicon\.ico['"]+/)
assert.match(ogImage, /public\/docs\/logo\.svg/)
assert.match(header, /src="\/docs\/logo\.svg"/)
assert.match(footer, /src="\/docs\/logo\.svg"/)
assert.ok(existsSync(path.join(publicRoot, 'docs', 'logo.svg')))
assert.ok(existsSync(path.join(publicRoot, 'docs', 'favicon.ico')))
assert.equal(existsSync(path.join(publicRoot, 'logo.svg')), false)
assert.equal(existsSync(path.join(publicRoot, 'favicon.ico')), false)
assert.ok(existsSync(path.join(siteRoot, 'src', 'app', 'docs', 'api', 'search', 'route.ts')))
assert.equal(existsSync(path.join(siteRoot, 'src', 'app', 'api')), false)
assert.ok(appFiles.some((file) => file.endsWith(path.join('docs', '[[...slug]]', 'page.tsx'))))
assert.ok(
appFiles.every((file) => {
const relative = path.relative(path.join(siteRoot, 'src', 'app'), file)
return (
relative.startsWith(`docs${path.sep}`) ||
['globals.css', 'layout.tsx', 'page.tsx'].includes(relative)
)
})
)
})
test('GIF media helpers use the shared poster and video variants', async () => {
const media = await import(pathToFileURL(path.join(siteRoot, 'src', 'lib', 'demoMedia.mjs')).href)
assert.equal(media.posterFor('/docs/orca-design-mode.gif'), '/docs/posters/orca-design-mode.jpg')
@@ -219,21 +96,6 @@ test('GIF media helpers use the shared poster and video variants', async () => {
assert.ok(existsSync(path.join(publicRoot, 'docs', 'posters', `${name}.jpg`)))
assert.ok(existsSync(path.join(publicRoot, 'docs', 'videos', `${name}.mp4`)))
}
assert.equal(existsSync(path.join(publicRoot, 'whats-new')), false)
})
test('versioning seam keeps current docs stable without claiming live versioned routes', async () => {
const versioning = await read('versioning.config.ts')
const readme = await read('README.md')
assert.match(
versioning,
/sourceDir:\s*['"]content\/docs['"]|sourceDir:\s*docsVersioning\.current\.sourceDir/
)
assert.match(versioning, /urlPrefix:\s*['"]\/docs['"]/)
assert.match(versioning, /versionsDir:\s*['"]content\/versions['"]+/)
assert.match(readme, /future snapshots|future versioned|versioned/i)
assert.doesNotMatch(readme, /packages\/docs/)
})
test('OG image fonts ship with their required third-party notice', async () => {
@@ -245,22 +107,6 @@ test('OG image fonts ship with their required third-party notice', async () => {
}
const notice = await read('THIRD_PARTY_NOTICES.md')
const ogImage = await read('src/lib/docs-og-image.tsx')
assert.match(notice, /SIL OPEN FONT LICENSE Version 1\.1/)
assert.match(notice, /Copyright \(c\) 2023 Vercel/)
assert.doesNotMatch(ogImage, /linear-gradient|boxShadow/)
})
test('docs app has no marketing-only route or analytics dependency', async () => {
const sourceFiles = await walkFiles(path.join(siteRoot, 'src'))
for (const file of sourceFiles) {
const content = await readFile(file, 'utf8')
assert.doesNotMatch(
content,
/(?:from|import)\s+['"`][^'"`]*(?:posthog|plausible|segment)|marketing-website/i,
file
)
}
assert.equal(existsSync(path.join(siteRoot, 'src', 'app', 'download')), false)
assert.equal(existsSync(path.join(siteRoot, 'src', 'app', 'pricing')), false)
})
+16 -36
View File
@@ -60,22 +60,14 @@ test('search excerpts preserve highlighted matches inside Markdown', () => {
)
})
test('unclosed angles avoid the HTML matcher without changing excerpt text', () => {
const input = '<'.repeat(8192)
const replace = String.prototype.replace
let tagMatcherCalls = 0
String.prototype.replace = function (pattern, ...args) {
if (pattern instanceof RegExp && pattern.source === '<[^>]+>' && pattern.flags === 'g') {
tagMatcherCalls += 1
}
return Reflect.apply(replace, this, [pattern, ...args])
}
try {
assert.equal(stripSearchExcerptMarkdown(input), input)
} finally {
String.prototype.replace = replace
}
assert.equal(tagMatcherCalls, 0)
test('unclosed angles finish within the excerpt budget without changing text', () => {
const input = '<'.repeat(131_072)
const result = runInNewContext(
'strip(input)',
{ strip: stripSearchExcerptMarkdown, input },
{ timeout: 250 }
)
assert.equal(result, input)
})
test('tag guards preserve malformed markup, protected code and highlighted matches', () => {
@@ -108,24 +100,12 @@ test('tag guards preserve malformed markup, protected code and highlighted match
}
})
test('unclosed brackets avoid link matchers without changing excerpt text', () => {
const input = '['.repeat(4096)
const replace = String.prototype.replace
let linkMatcherCalls = 0
String.prototype.replace = function (pattern, ...args) {
if (
pattern instanceof RegExp &&
pattern.source.includes('\\[') &&
pattern.source.includes('\\]')
) {
linkMatcherCalls += 1
}
return Reflect.apply(replace, this, [pattern, ...args])
}
try {
assert.equal(stripSearchExcerptMarkdown(input), input)
} finally {
String.prototype.replace = replace
}
assert.equal(linkMatcherCalls, 0)
test('unclosed brackets finish within the excerpt budget without changing text', () => {
const input = '['.repeat(131_072)
const result = runInNewContext(
'strip(input)',
{ strip: stripSearchExcerptMarkdown, input },
{ timeout: 250 }
)
assert.equal(result, input)
})
@@ -1,36 +0,0 @@
import { existsSync } from 'node:fs'
import path from 'node:path'
import { describe, expect, it } from 'vitest'
import type { TuiAgent } from '../../../src/shared/tui-agent'
import { MOBILE_TUI_AGENT_FAVICON_DOMAINS } from '../tasks/mobile-tui-agents'
// Agents that render a hand-authored glyph in MobileAgentIcon and therefore
// never reach the favicon/bundled-asset path.
const GLYPH_AGENT_IDS = new Set<TuiAgent>([
'claude',
'claude-agent-teams',
'codex',
'pi',
'omp',
'aider'
])
const dirname = import.meta.dirname
const assetsDir = path.resolve(dirname, '../../../src/shared/agent-icons')
// Why: these agents previously loaded from Google's favicon service, which is
// unreachable in some regions/offline (#8451). Every one that lacks a glyph
// must ship a bundled PNG so the icon renders without a network request.
const agentsNeedingBundledIcon = Object.keys(MOBILE_TUI_AGENT_FAVICON_DOMAINS).filter(
(id): id is TuiAgent => !GLYPH_AGENT_IDS.has(id as TuiAgent)
)
describe('mobile bundled agent icons', () => {
it('ships a bundled PNG on disk for every favicon-path agent', () => {
for (const id of agentsNeedingBundledIcon) {
expect(existsSync(path.join(assetsDir, `${id}.png`)), `missing bundled icon for ${id}`).toBe(
true
)
}
})
})
@@ -1,61 +0,0 @@
import { createElement } from 'react'
import { act, create, type ReactTestRenderer } from 'react-test-renderer'
import { afterEach, describe, expect, it, vi } from 'vitest'
import { MobileAgentIcon } from './MobileAgentIcon'
vi.mock('react-native', () => ({
Image: 'Image',
StyleSheet: { create: (styles: unknown) => styles },
Text: 'Text',
View: 'View'
}))
vi.mock('lucide-react-native', () => ({
Terminal: 'Terminal'
}))
vi.mock('react-native-svg', () => ({
default: 'Svg',
Defs: 'Defs',
G: 'G',
LinearGradient: 'LinearGradient',
Path: 'Path',
Stop: 'Stop'
}))
vi.mock('./mobile-agent-icon-assets', () => ({
MOBILE_AGENT_ICON_ASSETS: {}
}))
vi.mock('./AgentIcons', () => ({
ClaudeIcon: 'ClaudeIcon',
OpenAIIcon: 'OpenAIIcon'
}))
describe('MobileAgentIcon OMP gradient', () => {
let renderer: ReactTestRenderer | null = null
afterEach(() => {
act(() => renderer?.unmount())
renderer = null
vi.restoreAllMocks()
})
it('uses valid SVG gradient stop offsets', async () => {
const consoleError = vi.spyOn(console, 'error').mockImplementation((...args) => {
if (typeof args[0] !== 'string' || !args[0].includes('react-test-renderer is deprecated')) {
throw new Error(String(args[0]))
}
})
await act(async () => {
renderer = create(createElement(MobileAgentIcon, { agentId: 'omp' }))
})
consoleError.mockRestore()
expect(renderer.root.findAllByType('Stop').map((stop) => stop.props.offset)).toEqual([
'0',
'0.5',
'1'
])
})
})
@@ -103,6 +103,7 @@ const SAVE_REPLY = { id: 'save', ok: true, result: {}, _meta: { runtimeId: 'runt
let renderer: ReactTestRenderer | null = null
let controller: Controller
let replies: Map<string, Deferred>
let requests: { method: string; params: unknown }[]
function Screen({ client }: { client: RpcClient }) {
controller = useMobileDiffReviewController({
@@ -123,14 +124,16 @@ function Screen({ client }: { client: RpcClient }) {
}
/** Every RPC waits until the test answers it, so each case controls when a load or save lands. */
async function mountScreen(): Promise<void> {
async function mountScreen(snapshot: ReviewScreenState = SNAPSHOT): Promise<void> {
replies = new Map()
const sendRequest = vi.fn((method: string) => {
requests = []
const sendRequest = vi.fn((method: string, params: unknown) => {
requests.push({ method, params })
const reply = deferred()
replies.set(method, reply)
return reply.promise
})
loadSnapshot.mockResolvedValue(SNAPSHOT)
loadSnapshot.mockResolvedValue(snapshot)
await act(async () => {
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the operations under test only call `sendRequest`.
renderer = create(createElement(Screen, { client: { sendRequest } as unknown as RpcClient }))
@@ -300,12 +303,25 @@ describe('review screen sheets never stack', () => {
})
it('Discard keeps its file through the close and discards the file it showed', async () => {
await mountScreen()
await mountScreen({
...SNAPSHOT,
status: {
...SNAPSHOT.status,
entries: [
...SNAPSHOT.status.entries,
{ path: 'src/b.ts', status: 'modified', area: 'unstaged' }
]
}
})
const target = controller.currentItem!
act(() => controller.openSheet({ kind: 'discard', target }))
act(() => controller.moveFile('next'))
expect(controller.currentItem?.filePath).toBe('src/b.ts')
press(drawer('Discard File'), 'Discard')
expect(shownSheets()).toEqual([])
expect(textOf(drawer('Discard File')).join(' ')).toContain(target.filePath)
expect(replies.has('git.discard')).toBe(true)
expect(requests.filter((request) => request.method === 'git.discard')).toEqual([
{ method: 'git.discard', params: { worktree: 'id:wt-1', filePath: 'src/a.ts' } }
])
})
})
@@ -17,17 +17,4 @@ describe('mobile Markdown code placeholder collisions', () => {
`${literal} and \`<div>\``
)
})
it('preserves authored markers across generated suffix orders and HTML islands', () => {
let seed = 173
for (let sample = 0; sample < 500; sample++) {
const literals: string[] = []
for (let index = 0; index < 8; index++) {
seed = (Math.imul(seed, 1664525) + 1013904223) >>> 0
literals.push(`${marker}${'_'.repeat(seed % 32)}${index}${suffix}`)
}
const text = literals.join(' ') + ' and `Array<string>`'
expect(normalizeMobileMarkdownPreviewHtml(`<p>${text}</p>`)).toBe(text)
}
})
})
@@ -1,20 +1,4 @@
/**
* The two `react-native-webview` consumers on the page, pinned through the test renderer.
*
* Both native components put their surface inside a `WebView`, which has no browser counterpart:
* importing it runs a codegen lookup that throws, and the route manifest imports every route, so
* one such import takes the whole bundle down rather than one editor.
*
* Ruling 26 makes C7.6's fallbacks debt rather than done, and both are paid now. The preview
* renders the artifact in a sealed `srcdoc` frame with the toggle intact; the rich Markdown editor
* mounts the same document program the WebView runs, under the same fifteen-command toolbar. What a
* browser does with either — the frame's sandbox, the editor's commands, its listeners across a
* remount — is not a question this renderer can answer, and is measured in
* `mobile-web-app-html-preview-render.test.mjs` and
* `mobile-web-app-rich-markdown-render.test.mjs` instead. What is pinned here is the shape above
* the document: that the plain field is gone, that the toolbar is the one both siblings render, and
* that the two props the page answers differently are answered differently.
*/
// @vitest-environment happy-dom
import { createElement } from 'react'
import { act, create, type ReactTestRenderer } from 'react-test-renderer'
import { afterEach, describe, expect, it, vi } from 'vitest'
@@ -24,11 +8,6 @@ vi.mock('react-native', async () => {
(name: string) =>
({ children, ...props }: { children?: React.ReactNode }) =>
React.createElement(name, props, children)
// The one mock that forwards a ref: the editor's `dismissKeyboard` blurs through it, and a
// function component would have swallowed it.
const TextInput = React.forwardRef<unknown, { children?: React.ReactNode }>(
({ children, ...props }, ref) => React.createElement('TextInput', { ...props, ref }, children)
)
return {
// The native preview's external-link opener reaches for this at module load, and a named import
// missing from a mocked module throws before any case runs.
@@ -37,7 +16,7 @@ vi.mock('react-native', async () => {
ScrollView: host('ScrollView'),
StyleSheet: { create: (styles: unknown) => styles, hairlineWidth: 1 },
Text: host('Text'),
TextInput,
TextInput: host('TextInput'),
View: host('View')
}
})
@@ -64,8 +43,6 @@ vi.mock('lucide-react-native', () => ({
Strikethrough: () => null
}))
// The modal is a bottom drawer with an animation and a portal, none of which this file is about:
// what it pins is that the editor carries one and that it is shut.
vi.mock('./TextInputModal', async () => {
const React = await import('react')
return {
@@ -84,12 +61,14 @@ function findHosts(renderer: ReactTestRenderer, type: string) {
return renderer.root.findAll((node) => node.type === type)
}
/** `createNodeMock` is how a ref to a host element gets anything at all under this renderer, and
* the editor's `dismissKeyboard` reaches the field through one. */
function render(element: React.ReactElement, node?: unknown): ReactTestRenderer {
function render(
element: React.ReactElement,
node: HTMLElement = document.createElement('div')
): ReactTestRenderer {
let renderer: ReactTestRenderer | null = null
document.body.appendChild(node)
act(() => {
renderer = create(element, node === undefined ? undefined : { createNodeMock: () => node })
renderer = create(element, { createNodeMock: () => node })
})
if (renderer === null) {
throw new Error('nothing mounted')
@@ -102,76 +81,66 @@ afterEach(() => {
for (const renderer of renderers.splice(0)) {
act(() => renderer.unmount())
}
document.body.innerHTML = ''
document.head.innerHTML = ''
})
describe('the rich markdown editor on the page', () => {
it('renders no plain field, because the document it degraded to is gone', () => {
it('mounts the editor document with its content and reports edits to the host', () => {
const host = document.createElement('div')
const onChange = vi.fn()
const renderer = render(
createElement(MobileRichMarkdownEditor, {
content: '# Title\n\nbody',
editable: true,
onChange: vi.fn()
})
onChange
}),
host
)
// The whole of C7.6's sibling: one `TextInput` holding the Markdown source, and a notice bar
// over it saying so. Both go, because the page runs the real document now.
const surface = host.querySelector<HTMLElement>('#editor')!
expect(surface.querySelector('h1')?.textContent).toBe('Title')
expect(surface.querySelector('p')?.textContent).toBe('body')
expect(surface.getAttribute('contenteditable')).toBe('true')
expect(onChange).not.toHaveBeenCalled()
expect(findHosts(renderer, 'TextInput')).toEqual([])
act(() => {
surface.innerHTML = '<p>edited</p>'
surface.dispatchEvent(new Event('input', { bubbles: true }))
})
expect(onChange.mock.calls).toEqual([['edited']])
})
it('renders the fifteen-command toolbar the phone renders', () => {
const renderer = render(
it('keeps the document and toolbar read-only until editing is enabled', () => {
const host = document.createElement('div')
const onChange = vi.fn()
const editor = (editable: boolean) =>
createElement(MobileRichMarkdownEditor, {
content: 'body',
editable: true,
onChange: vi.fn()
editable,
onChange
})
)
const renderer = render(editor(false), host)
const surface = host.querySelector<HTMLElement>('#editor')!
const buttons = findHosts(renderer, 'Pressable')
expect(buttons).toHaveLength(15)
expect(buttons.map((node) => node.props.accessibilityLabel)).toContain('Image')
expect(buttons.filter((node) => node.props.disabled === true)).toEqual([])
})
it('disables every command against a document that cannot be edited', () => {
const renderer = render(
createElement(MobileRichMarkdownEditor, {
content: 'body',
editable: false,
onChange: vi.fn()
})
)
const buttons = findHosts(renderer, 'Pressable')
expect(buttons).toHaveLength(15)
expect(buttons.length).toBeGreaterThan(0)
expect(buttons.filter((node) => node.props.disabled !== true)).toEqual([])
})
expect(surface.getAttribute('contenteditable')).toBe('false')
act(() => {
surface.dispatchEvent(new Event('input', { bubbles: true }))
})
expect(onChange).not.toHaveBeenCalled()
it('keeps the URL modal mounted and closed until a command asks for one', () => {
// The seam `window.prompt` could not be: both shells cancel the dialog without showing it, so
// Link and Image did nothing at all on the phone. Whether the modal opens on a command is the
// render check's to measure; that the page carries one, shut, is this file's.
const renderer = render(
createElement(MobileRichMarkdownEditor, {
content: 'body',
editable: true,
onChange: vi.fn()
})
)
const modals = findHosts(renderer, 'TextInputModal')
expect(modals).toHaveLength(1)
expect(modals[0]?.props.visible).toBe(false)
})
it('never calls onKeyboardInsetChange, because the screen measures the same viewport', () => {
const onKeyboardInsetChange = vi.fn()
render(
createElement(MobileRichMarkdownEditor, {
content: 'body',
editable: true,
onChange: vi.fn(),
onKeyboardInsetChange
})
)
expect(onKeyboardInsetChange).not.toHaveBeenCalled()
act(() => renderer.update(editor(true)))
const enabled = findHosts(renderer, 'Pressable')
expect(enabled).toHaveLength(buttons.length)
expect(enabled.filter((node) => node.props.disabled === true)).toEqual([])
expect(surface.getAttribute('contenteditable')).toBe('true')
act(() => {
surface.innerHTML = '<p>accepted</p>'
surface.dispatchEvent(new Event('input', { bubbles: true }))
})
expect(onChange.mock.calls).toEqual([['accepted']])
})
})
@@ -194,23 +163,6 @@ describe('the html preview on the page', () => {
expect(findHosts(renderer, 'Pressable')).toHaveLength(2)
})
it('shows the source when the toggle is flipped, and takes the frame away with it', () => {
const renderSource = vi.fn(renderSourceMarker)
const renderer = render(createElement(MobileHtmlPreview, { html: '<h1>hi</h1>', renderSource }))
expect(findHosts(renderer, 'SourceView')).toHaveLength(0)
const toSource = findHosts(renderer, 'Pressable').find(
(node) => node.props.accessibilityLabel === 'View HTML source'
)
expect(toSource).toBeDefined()
act(() => toSource?.props.onPress())
expect(findHosts(renderer, 'SourceView')).toHaveLength(1)
expect(renderSource).toHaveBeenCalled()
// The artifact is not parsed anywhere while Source is showing.
expect(findHosts(renderer, 'iframe')).toHaveLength(0)
})
it('says which side of the toggle is showing', () => {
const renderer = render(
createElement(MobileHtmlPreview, { html: '<h1>hi</h1>', renderSource: renderSourceMarker })
@@ -2,8 +2,7 @@ import { describe, expect, it } from 'vitest'
import type { z } from 'zod'
import {
newWorkspaceRepoHooksSchema,
newWorkspaceUiTrustSchema,
SETUP_RUN_POLICIES
newWorkspaceUiTrustSchema
} from './new-workspace-reply-schema'
function reads<T>(schema: z.ZodType<T, unknown>, value: unknown): T {
@@ -45,15 +44,6 @@ describe('the drawer requires only what it reads unguarded', () => {
})
describe('the setup run policy is a closed enum with the call site defaulting it', () => {
// The arm list is pinned to SetupRunPolicy in the schema module, where tsc looks.
it('keeps each arm the drawer compares against', () => {
for (const policy of SETUP_RUN_POLICIES) {
expect(
reads(newWorkspaceRepoHooksSchema, { source: null, setupRunPolicy: policy }).setupRunPolicy
).toBe(policy)
}
})
it('drops an arm this build does not know, which behaves as run-by-default did', () => {
expect(
reads(newWorkspaceRepoHooksSchema, { source: null, setupRunPolicy: 'on-tuesdays' })
@@ -8,15 +8,6 @@ describe('resolveNewWorktreeFormSheetVisible', () => {
)
})
// The host Modal stays mounted across every drawer swap, so a transition that
// renders no sheet is a transparent tap-swallowing screen with no way out if
// the queued transition never lands.
it('never leaves the mounted modal without a sheet during a drawer swap', () => {
expect(
resolveNewWorktreeFormSheetVisible({ modalVisible: true, drawerView: 'transition' })
).toBe(true)
})
it('yields the window to the content-sized pickers and the trust prompt', () => {
for (const drawerView of ['project', 'runTarget', 'agent', 'trust']) {
expect(resolveNewWorktreeFormSheetVisible({ modalVisible: true, drawerView })).toBe(false)
@@ -60,7 +60,7 @@ describe('parseMarkdownBlocks', () => {
])
})
it('keeps text around an HTML block in order and strips stray inline tags', () => {
it('keeps text around HTML blocks in order and leaves inline tags for inline parsing', () => {
const blocks = parseMarkdownBlocks('Before.\n<blockquote>q</blockquote>\nAfter <kbd>X</kbd>.')
expect(blocks).toEqual([
{ kind: 'paragraph', text: 'Before.' },
@@ -71,7 +71,7 @@ describe('parseMarkdownBlocks', () => {
it('is total — never throws on empty, whitespace, or an unterminated fence', () => {
expect(parseMarkdownBlocks('')).toEqual([])
expect(() => parseMarkdownBlocks(' \n\n ')).not.toThrow()
expect(parseMarkdownBlocks(' \n\n ')).toEqual([])
const open = parseMarkdownBlocks('```\nunterminated')
expect(open).toEqual([{ kind: 'code', text: 'unterminated', lang: '' }])
})
@@ -171,10 +171,18 @@ describe('parseMarkdownBlocks tables', () => {
expect(headerOnly).toEqual([
{ kind: 'table', headers: ['A', 'B'], align: ['left', 'left'], rows: [] }
])
// Ragged rows (fewer/more cells than headers) must not throw.
const ragged = ['| A | B | C |', '| --- | --- | --- |', '| 1 |', '| 1 | 2 | 3 | 4 |']
expect(() => parseMarkdownBlocks(ragged.join('\n'))).not.toThrow()
expect(() => parseMarkdownBlocks('|||\n|:-:|')).not.toThrow()
expect(parseMarkdownBlocks(ragged.join('\n'))).toEqual([
{
kind: 'table',
headers: ['A', 'B', 'C'],
align: ['left', 'left', 'left'],
rows: [['1'], ['1', '2', '3', '4']]
}
])
expect(parseMarkdownBlocks('|||\n|:-:|')).toEqual([
{ kind: 'table', headers: ['', ''], align: ['center'], rows: [] }
])
})
})
@@ -1,7 +1,6 @@
import { describe, expect, it } from 'vitest'
import type { PRCheckDetail } from '../../../../src/shared/github/check-types'
import {
checkOutcome,
firstFailingCheckKey,
getPRReviewerRows,
prCheckKey,
@@ -21,36 +20,32 @@ function check(over: Partial<PRCheckDetail>): PRCheckDetail {
}
}
describe('checkOutcome', () => {
it('treats a completed null-conclusion check as neutral, not failure', () => {
expect(checkOutcome(check({ status: 'completed', conclusion: null }))).toBe('neutral')
})
it('treats queued/in_progress as pending', () => {
expect(checkOutcome(check({ status: 'queued', conclusion: null }))).toBe('pending')
expect(checkOutcome(check({ status: 'in_progress', conclusion: null }))).toBe('pending')
})
it('maps failure/cancelled/timed_out to failure', () => {
expect(checkOutcome(check({ conclusion: 'failure' }))).toBe('failure')
expect(checkOutcome(check({ conclusion: 'cancelled' }))).toBe('failure')
expect(checkOutcome(check({ conclusion: 'timed_out' }))).toBe('failure')
})
it('maps a merge-blocking action_required gate to failure', () => {
expect(checkOutcome(check({ conclusion: 'action_required' }))).toBe('failure')
})
it('maps skipped to success and neutral to neutral (desktop parity)', () => {
expect(checkOutcome(check({ conclusion: 'skipped' }))).toBe('success')
expect(checkOutcome(check({ conclusion: 'neutral' }))).toBe('neutral')
})
})
describe('sortPRChecks', () => {
it('orders failures first, then pending, then success', () => {
it('orders actionable failures, pending work, neutral checks, then successes', () => {
const checks = [
check({ name: 'ok', conclusion: 'success' }),
check({ name: 'pending', status: 'in_progress', conclusion: null }),
check({ name: 'broke', conclusion: 'failure' })
check({ name: 'completed-without-conclusion', conclusion: null }),
check({ name: 'skipped', conclusion: 'skipped' }),
check({ name: 'broke', conclusion: 'failure' }),
check({ name: 'queued', status: 'queued', conclusion: null }),
check({ name: 'cancelled', conclusion: 'cancelled' }),
check({ name: 'neutral', conclusion: 'neutral' }),
check({ name: 'timed-out', conclusion: 'timed_out' }),
check({ name: 'action-required', conclusion: 'action_required' })
]
expect(sortPRChecks(checks).map((c) => c.name)).toEqual(['broke', 'pending', 'ok'])
expect(sortPRChecks(checks).map((c) => c.name)).toEqual([
'broke',
'cancelled',
'timed-out',
'action-required',
'pending',
'queued',
'completed-without-conclusion',
'neutral',
'ok',
'skipped'
])
})
it('is stable within a bucket', () => {
const checks = [
@@ -2,7 +2,6 @@ import { describe, expect, it } from 'vitest'
import type { PRInfo } from '../../../../src/shared/github/pull-request-types'
import {
buildMergeabilityRefreshCommands,
hasMergeConflicts,
resolveConflictDisplay
} from './pr-conflict-presentation'
@@ -19,14 +18,6 @@ function pr(over: Partial<PRInfo>): PRInfo {
}
}
describe('hasMergeConflicts', () => {
it('is true only for CONFLICTING', () => {
expect(hasMergeConflicts(pr({ mergeable: 'CONFLICTING' }))).toBe(true)
expect(hasMergeConflicts(pr({ mergeable: 'MERGEABLE' }))).toBe(false)
expect(hasMergeConflicts(pr({ mergeable: 'UNKNOWN' }))).toBe(false)
})
})
describe('resolveConflictDisplay', () => {
it('builds safe mergeability refresh commands', () => {
expect(buildMergeabilityRefreshCommands()).toBe(
@@ -1,40 +1,10 @@
import { describe, expect, it } from 'vitest'
import { prStateToken } from './pr-state-token'
import { prStateBadge } from './pr-sidebar/pr-checks-presentation'
import { statusColor } from './pr-sidebar/pr-sidebar-status-color'
import { colors } from '../theme/mobile-theme'
describe('prStateToken', () => {
it('maps PR states to the desktop-matching status palette', () => {
expect(prStateToken('merged')).toBe('statusPurple')
expect(prStateToken('open')).toBe('statusGreen')
expect(prStateToken('closed')).toBe('statusRed')
expect(prStateToken('draft')).toBe('textSecondary')
})
it('is case-insensitive and falls back to muted for unknown states', () => {
expect(prStateToken('MERGED')).toBe('statusPurple')
expect(prStateToken('unknown')).toBe('textSecondary')
expect(prStateToken('')).toBe('textSecondary')
})
it('resolves to the expected concrete colors', () => {
expect(statusColor(prStateToken('merged'))).toBe(colors.statusPurple)
expect(statusColor(prStateToken('open'))).toBe(colors.statusGreen)
expect(statusColor(prStateToken('closed'))).toBe(colors.statusRed)
expect(statusColor(prStateToken('draft'))).toBe(colors.textSecondary)
})
})
describe('workspace-list and PR-sidebar palette agreement', () => {
// Both surfaces must resolve the SAME color for the same state so the
// linked-PR badge and the sidebar state badge never drift.
it.each(['open', 'closed', 'merged', 'draft'] as const)(
'sidebar badge and list badge agree for %s',
(state) => {
const listColor = statusColor(prStateToken(state))
const sidebarColor = statusColor(prStateBadge(state).token)
expect(sidebarColor).toBe(listColor)
}
)
})
@@ -1,13 +1,7 @@
// @vitest-environment happy-dom
import { afterEach, describe, expect, it, vi } from 'vitest'
import { afterEach, describe, expect, it } from 'vitest'
import { quietRichMarkdownEditorHost } from './rich-markdown-editor-host.test-support'
import {
createRichMarkdownEditorDocument,
startRichMarkdownEditorDocument,
stopRichMarkdownEditorDocument
} from './create-rich-markdown-editor-document'
import { createRichMarkdownEditorScope } from './document-scope'
import { emitChange, setMarkdown } from './editor-content'
import { createRichMarkdownEditorDocument } from './create-rich-markdown-editor-document'
import { RICH_MARKDOWN_EDITOR_MARKUP } from './document-markup'
import type { MobileRichMarkdownEditorMessage } from '../mobile-rich-markdown-editor-contract'
import type { RichMarkdownEditorDocument } from './document-host-seams'
@@ -127,41 +121,6 @@ describe('an editor document that is stopped', () => {
expect(first).toEqual([{ type: 'change', markdown: 'shared markup', generation: 3 }])
})
it('cancels a change still waiting on a timer, which no listener removal can reach', () => {
// A listener comes off with the element it was on; a scheduled callback holds the scope and
// would fire into a document the host has already unmounted. Nothing schedules the handle
// today, so the pending change is planted here — the seam and the field exist for the day
// something does, and the cancel has to already be in `stop` when it arrives.
const posted: MobileRichMarkdownEditorMessage[] = []
plantMarkup()
vi.useFakeTimers()
try {
const scope = createRichMarkdownEditorScope(
quietRichMarkdownEditorHost({
postToHost: (message) => posted.push(message),
keyboardInsetSource: () => null
})
)
startRichMarkdownEditorDocument(scope)
setMarkdown(scope, 'body', 2)
posted.length = 0
// The control: while the document is running, the pending change is posted.
scope.inputTimer = window.setTimeout(() => emitChange(scope), 0)
vi.runAllTimers()
expect(posted).toEqual([{ type: 'change', markdown: 'body', generation: 2 }])
posted.length = 0
scope.inputTimer = window.setTimeout(() => emitChange(scope), 0)
stopRichMarkdownEditorDocument(scope)
expect(scope.inputTimer).toBe(null)
vi.runAllTimers()
expect(posted).toEqual([])
} finally {
vi.useRealTimers()
}
})
it('drops a command whose dialog answered after the host moved on', async () => {
// `promptForUrl` is a modal on the page, so it is a task boundary: between the toolbar press
// and the URL coming back, the host can replace the content, make the editor read-only or
@@ -19,12 +19,10 @@ const started: RichMarkdownEditorDocument[] = []
function editorDocument() {
document.body.innerHTML = RICH_MARKDOWN_EDITOR_MARKUP
const posted: MobileRichMarkdownEditorMessage[] = []
const cleared: (number | null)[] = []
const document_ = createRichMarkdownEditorDocument(
quietRichMarkdownEditorHost({
postToHost: (message) => posted.push(message),
keyboardInsetSource: () => null,
clearTimer: (handle) => cleared.push(handle)
keyboardInsetSource: () => null
})
)
started.push(document_)
@@ -32,7 +30,6 @@ function editorDocument() {
return {
handle: document_.send,
posted,
cleared,
editor: document.getElementById('editor')!,
type: () => document.getElementById('editor')!.dispatchEvent(new Event('input'))
}
@@ -66,8 +63,6 @@ describe('the editor document content', () => {
})
it('posts the change on the spot, with no timer between the edit and the host', () => {
// There is no debounce, and the pending handle is cleared before every replacement so that
// adding one later cannot leak a change from the content it has already replaced.
const editor = editorDocument()
vi.useFakeTimers()
try {
@@ -78,7 +73,6 @@ describe('the editor document content', () => {
} finally {
vi.useRealTimers()
}
expect(editor.cleared).toEqual([null, null])
})
it('says nothing while it is rewriting itself', () => {
@@ -1,4 +1,5 @@
// @vitest-environment happy-dom
import { runInNewContext } from 'node:vm'
import { describe, expect, it } from 'vitest'
import { quietRichMarkdownEditorHost } from './rich-markdown-editor-host.test-support'
import { createRichMarkdownEditorScope } from './document-scope'
@@ -178,22 +179,22 @@ describe('the editor document, from markdown and back', () => {
// after the hashes and `parseListLine` needs text after the marker, so neither consumed the
// line and the index never moved: `markdownToHtml` looped forever on a one-line source the
// host could hand it from any file. Bare markers are text.
expect(markdownToHtml(createRichMarkdownEditorScope(quietRichMarkdownEditorHost()), '# ')).toBe(
'<p># </p>'
)
expect(markdownToHtml(createRichMarkdownEditorScope(quietRichMarkdownEditorHost()), '- ')).toBe(
'<p>- </p>'
)
expect(
markdownToHtml(createRichMarkdownEditorScope(quietRichMarkdownEditorHost()), '1. ')
).toBe('<p>1. </p>')
const render = (markdown: string) =>
runInNewContext(
'markdownToHtml(scope, markdown)',
{
markdownToHtml,
scope: createRichMarkdownEditorScope(quietRichMarkdownEditorHost()),
markdown
},
{ timeout: 250 }
)
expect(render('# ')).toBe('<p># </p>')
expect(render('- ')).toBe('<p>- </p>')
expect(render('1. ')).toBe('<p>1. </p>')
// The control, so the guard is not swallowing the readers it falls back from.
expect(
markdownToHtml(createRichMarkdownEditorScope(quietRichMarkdownEditorHost()), '# ok')
).toBe('<h1>ok</h1>')
expect(
markdownToHtml(createRichMarkdownEditorScope(quietRichMarkdownEditorHost()), '- ok')
).toBe('<ul><li><p>ok</p></li></ul>')
expect(render('# ok')).toBe('<h1>ok</h1>')
expect(render('- ok')).toBe('<ul><li><p>ok</p></li></ul>')
})
it('renders no link for a javascript: URL, which is the one scheme it filters', () => {
@@ -26,12 +26,6 @@ function selectorsOf(css: string): string[] {
}
describe('the editor stylesheet on the page', () => {
it('reaches nothing outside the host', () => {
const selectors = selectorsOf(scopeDocumentStyleToHost(richMarkdownEditorStyle(), PREFIX))
expect(selectors.length).toBeGreaterThan(40)
expect(selectors.filter((one) => one !== PREFIX && !one.startsWith(`${PREFIX} `))).toEqual([])
})
it('moves the document’s own rules onto the host rather than dropping them', () => {
const scoped = scopeDocumentStyleToHost(richMarkdownEditorStyle(), PREFIX)
// The variables every other rule reads. Dropped, the sheet would render unstyled while every
@@ -76,11 +70,4 @@ describe('the editor stylesheet on the page', () => {
// The bare name is still the host itself, which is the case the sheet actually has.
expect(scopeDocumentStyleToHost(':root { color: red; }', PREFIX)).toContain(`${PREFIX} {`)
})
it('refuses a sheet whose shape it cannot rewrite, as the other half does', () => {
expect(() =>
scopeDocumentStyleToHost('@media (min-width: 1px) { .a { color: red; } }', PREFIX)
).toThrow('at-rules cannot be scoped')
expect(() => scopeDocumentStyleToHost('.a { color: red;', PREFIX)).toThrow('never closes')
})
})
@@ -182,10 +182,4 @@ describe('the rich Markdown editor document at parse time', () => {
)
).toEqual([[], [], []])
})
it('would name a start the sequence forgot, which is what the comparison above is for', () => {
const planted = sequenceCallsTo('startRichMarkdownEditorDocument')
expect(planted).not.toContain('startEditorCommands')
expect([...planted, 'startEditorCommands'].sort()).not.toEqual(planted.slice().sort())
})
})
@@ -2,7 +2,6 @@
import { afterEach, describe, expect, it, vi } from 'vitest'
import { quietRichMarkdownEditorHost } from './rich-markdown-editor-host.test-support'
import { createRichMarkdownEditorDocument } from './create-rich-markdown-editor-document'
import { createRichMarkdownEditorScope } from './document-scope'
import { RICH_MARKDOWN_EDITOR_MARKUP } from './document-markup'
import type { MobileRichMarkdownEditorMessage } from '../mobile-rich-markdown-editor-contract'
import type { RichMarkdownEditorDocument, RichMarkdownEditorHost } from './document-host-seams'
@@ -29,28 +28,6 @@ afterEach(() => {
vi.unstubAllGlobals()
})
describe('the editor document host seams, by default', () => {
it('clears a real timer, and a handle that was never set', () => {
const scope = createRichMarkdownEditorScope(quietRichMarkdownEditorHost())
const fired = vi.fn()
vi.useFakeTimers()
try {
scope.clearTimer(window.setTimeout(fired, 0))
vi.runAllTimers()
expect(fired).not.toHaveBeenCalled()
expect(() => scope.clearTimer(null)).not.toThrow()
} finally {
vi.useRealTimers()
}
})
it('takes the selection and the page from the window the document is running in', () => {
const scope = createRichMarkdownEditorScope(quietRichMarkdownEditorHost())
expect(scope.getDocument()).toBe(document)
expect(scope.getSelection()).toBe(window.getSelection())
})
})
describe('the editor document host seams, once the page sets them', () => {
it('routes every message to the field and nothing to the bridge', () => {
const postMessage = vi.fn<(data: string) => void>()
@@ -69,12 +69,12 @@ describe('the editor document mounted in the page', () => {
const sheets = document.querySelectorAll('#orca-rich-markdown-document-style')
expect(sheets).toHaveLength(1)
const text = sheets[0]!.textContent ?? ''
expect(text.length).toBeGreaterThan(1000)
const selectors = [...text.matchAll(/(?:^|\})\s*([^{}]+)\{/g)].flatMap((match) =>
match[1]!.split(',').map((one) => one.trim())
)
expect(selectors.length).toBeGreaterThan(40)
expect(selectors.filter((one) => !one.startsWith(`.${RICH_MARKDOWN_HOST_CLASS}`))).toEqual([])
expect(selectors.length).toBeGreaterThan(0)
const prefix = `.${RICH_MARKDOWN_HOST_CLASS}`
expect(selectors.filter((one) => one !== prefix && !one.startsWith(`${prefix} `))).toEqual([])
})
it('gives the host back on dispose, so every rule of the sheet matches nothing', () => {
@@ -63,18 +63,18 @@ function DrawerBody(): null {
return null
}
function drawer(visible: boolean): ReactElement {
function drawer(visible: boolean, onClose: () => void = () => {}): ReactElement {
return (
<RightDrawer visible={visible} onClose={() => {}}>
<RightDrawer visible={visible} onClose={onClose}>
<DrawerBody />
</RightDrawer>
)
}
function render(visible: boolean): ReactTestRenderer {
function render(visible: boolean, onClose?: () => void): ReactTestRenderer {
let renderer!: ReactTestRenderer
act(() => {
renderer = create(drawer(visible))
renderer = create(drawer(visible, onClose))
})
return renderer
}
@@ -95,10 +95,15 @@ afterEach(() => {
* `use-back-claim.web.ts` and is tested there.
*/
describe('the right drawer and the phone hardware back button', () => {
it('arms it on iOS while the drawer is open', () => {
const renderer = render(true)
it('consumes an iOS hardware back press and closes the open drawer', () => {
const onClose = vi.fn()
const renderer = render(true, onClose)
expect(native.addEventListener).toHaveBeenCalledTimes(1)
expect(native.addEventListener.mock.calls[0]?.[0]).toBe('hardwareBackPress')
const handler = native.addEventListener.mock.calls[0]![1]
expect(onClose).not.toHaveBeenCalled()
act(() => expect(handler()).toBe(true))
expect(onClose).toHaveBeenCalledTimes(1)
act(() => renderer.unmount())
})
@@ -28,7 +28,6 @@ import {
type BridgePortPair
} from '../mobile-web-shell/bridge/bridge-port-pair-test-harness'
import { useHtmlPreviewLinkGrant } from './use-html-preview-link-grant.web'
import { useHtmlPreviewLinkGrant as useHtmlPreviewLinkGrantNatively } from './use-html-preview-link-grant'
const held: { granted: boolean | null } = { granted: null }
@@ -78,10 +77,6 @@ describe('whether a link in the HTML preview opens, on the web', () => {
expect(await mount(createFakeBridgePortPair({ routeGrants: [] }))).toBe(false)
})
it('is unconditional on native, where the preview is its own WebView', () => {
expect(useHtmlPreviewLinkGrantNatively()).toBe(true)
})
// Checked against the contract rather than by eye: a route naming a grant the manifest refuses
// never reaches a shell, so the preview would hide its links for a reason no screen could report.
it('is a name the bundle manifest will carry, on either lane', () => {
-1
View File
@@ -17,7 +17,6 @@ src/components/agent-monitoring-indicators.test.ts
src/components/bottom-drawer-close-lifecycle.test.ts
src/components/bottom-drawer-window-handback.test.ts
src/components/codex-reset-credit-capability.test.ts
src/components/mobile-agent-icon-gradient.test.ts
src/components/pr-sidebar/PRCommentsSection.test.ts
src/diagnostics/connection-diagnostics-submission.test.ts
src/dictation/mobile-dictation-setup.test.ts
@@ -194,10 +194,10 @@ describe('Claude provider history source budget', () => {
expect(state.bytesRead).toBeGreaterThan(2 * LEGACY_LIMIT)
})
it('keeps resident bytes bounded by the chunk size, not the file size', async () => {
it('reads a large history in chunks smaller than 1 MiB', async () => {
await writeFile(state.path, padTo(LEGACY_LIMIT + 1))
expect((await read()).boundaryConsistent).toBe(true)
// A whole-file read would show one chunk the size of the transcript.
// Bound chunks handed to the framer; this does not measure retained memory.
expect(state.peakChunkBytes).toBeLessThan(1024 * 1024)
})