Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/memory/device-node/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ description: "Device interaction via gRPC: lifecycle, recording, log capture, an
| File | Description |
|------|-------------|
| [android-ios-mirror](android-ios-mirror.md) | The Android/iOS mirror in device-node — platform clients, gRPC setups, recording/log providers, discovery probes: sharing is settled per pair by a measured diff, not parallel shape (`infra/commandFailure.ts`, `device/logWriteStream.ts`, `MAX_DIAGNOSTIC_OUTPUT_CHUNKS`), diagnostic buffers are bounded rings with a consumer, `simctl` plist fields degrade per field, driver recovery replays only an explicit allow-list, and `closeDriverChannel` closes a channel rather than killing a process. |
| [log-capture](log-capture.md) | Per-test device log capture (manager, providers, Device integration) and the write-stream finalization contract: every exit from start/stop ends and flushes the log file's write stream through one shared `LogWriteStreamRegistry`, held per provider instance and keyed on the capture's output file path, so the file the CLI copies next is complete. `open()` attaches a persistent `error` listener that records the first error and never throws, and `finalize` fails the stop on it. |
| [log-capture](log-capture.md) | Per-test device log capture (manager, providers, Device integration) and the write-stream finalization contract: every exit from start/stop ends and flushes the log file's write stream through one shared `LogWriteStreamRegistry`, held per provider instance and keyed on the capture's output file path, so the file the CLI copies next is complete. `open()` records the first stream `error` and never throws; `finalize` decides the stop from the stream's terminal `'close'` state. |
241 changes: 165 additions & 76 deletions docs/memory/device-node/log-capture.md

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions fab/changes/260731-vojm-log-finalize-terminal-state/.history.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{"action":"enter","driver":"fab-new","event":"stage-transition","stage":"intake","ts":"2026-07-31T17:56:32Z"}
{"args":"Fix stream-error reporting defect: finalize rejects unconditionally on recorded entry.error even when the log was fully flushed (writableFinished true); await terminal close/error state, update pinning test per Test Integrity, decide finalizeQuietly-before-finalize consumption behavior","cmd":"fab-new","event":"command","ts":"2026-07-31T17:56:32Z"}
{"delta":"+4.6","event":"confidence","score":4.6,"trigger":"calc-score","ts":"2026-07-31T17:58:43Z"}
{"delta":"+0.0","event":"confidence","score":4.6,"trigger":"calc-score","ts":"2026-07-31T18:00:32Z"}
{"cmd":"fab-fff","event":"command","ts":"2026-07-31T18:01:08Z"}
{"action":"enter","driver":"fab-fff","event":"stage-transition","stage":"apply","ts":"2026-07-31T18:01:13Z"}
{"action":"enter","driver":"fab-fff","event":"stage-transition","stage":"review","ts":"2026-07-31T18:14:48Z"}
{"action":"enter","driver":"fab-fff","event":"stage-transition","stage":"hydrate","ts":"2026-07-31T18:36:00Z"}
{"event":"review","result":"passed","ts":"2026-07-31T18:36:00Z"}
{"action":"enter","driver":"fab-fff","event":"stage-transition","stage":"ship","ts":"2026-07-31T18:44:54Z"}
{"action":"enter","driver":"git-pr","event":"stage-transition","stage":"review-pr","ts":"2026-07-31T18:48:51Z"}
{"event":"review","result":"passed","ts":"2026-07-31T19:06:49Z"}
53 changes: 53 additions & 0 deletions fab/changes/260731-vojm-log-finalize-terminal-state/.status.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
id: vojm
name: 260731-vojm-log-finalize-terminal-state
created: 2026-07-31T17:56:32Z
created_by: ashish-noon
change_type: fix
issues: []
progress:
intake: done
apply: done
review: done
hydrate: done
ship: done
review-pr: done
plan:
generated: true
task_count: 9
acceptance_count: 14
acceptance_completed: 14
confidence:
certain: 2
confident: 3
tentative: 0
unresolved: 0
score: 4.6
fuzzy: true
dimensions:
signal: 80.0
reversibility: 68.0
competence: 83.0
disambiguation: 77.0
stage_metrics:
intake: {started_at: "2026-07-31T17:56:32Z", driver: fab-new, iterations: 1, completed_at: "2026-07-31T18:01:13Z"}
apply: {started_at: "2026-07-31T18:01:13Z", driver: fab-fff, iterations: 1, completed_at: "2026-07-31T18:14:48Z"}
review: {started_at: "2026-07-31T18:14:48Z", driver: fab-fff, iterations: 1, completed_at: "2026-07-31T18:36:00Z"}
hydrate: {started_at: "2026-07-31T18:36:00Z", driver: fab-fff, iterations: 1, completed_at: "2026-07-31T18:44:54Z"}
ship: {started_at: "2026-07-31T18:44:54Z", driver: fab-fff, iterations: 1, completed_at: "2026-07-31T18:48:51Z"}
review-pr: {started_at: "2026-07-31T18:48:51Z", driver: git-pr, iterations: 1, completed_at: "2026-07-31T19:06:49Z"}
prs:
- https://github.com/droid-ash/finalrun-agent/pull/177
change_type_source: explicit
true_impact:
added: 749
deleted: 142
net: 607
tests:
added: 116
deleted: 8
net: 108
computed_at: "2026-07-31T18:48:51Z"
computed_at_stage: ship
summary: Log-stop finalization now decides from the write stream's terminal 'close' state — success iff writableFinished with no stream.errored, warn-and-resolve over a stale non-destroying record, deterministic rejection on a close-time error — superseding the unconditional recorded-error rejection, with registry and both-platform provider tests pinning the new outcomes and the quiet-first failure-response invariant.
# true_impact: lazily created on first stage-finish that computes it (no placeholder here).
last_updated: 2026-07-31T19:06:49Z
Loading
Loading