Skip to content

Add structured OCR telemetry for longitudinal analysis (Fixes #2676) - #2733

Merged
acoliver merged 6 commits into
mainfrom
issue2676
Jul 26, 2026
Merged

Add structured OCR telemetry for longitudinal analysis (Fixes #2676)#2733
acoliver merged 6 commits into
mainfrom
issue2676

Conversation

@acoliver

@acoliver acoliver commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

TLDR

Adds strict, fail-closed OCR telemetry and longitudinal aggregation so each OCR workflow run records trustworthy finding, timing, file, publication, failure, and token metrics. Reviewers should focus on fallback validity, redaction/hash ordering, and preservation of trusted-base workflow execution.

Dive Deeper

  • Emits a versioned telemetry record for successful, degraded, and producer-fallback paths.
  • Preserves truthful unavailable values while capturing run identity, OCR configuration, measured wall-clock duration, preview/review evidence, publication counters, file-read failures, policy/infrastructure state, and token usage.
  • Counts findings by category, severity, and category-by-severity with strict reconciliation and safe-integer overflow checks.
  • Redacts and validates telemetry before adding it to the reviewed-range hash set and gated artifact upload.
  • Uses atomic synchronous writes with unique temporary names and cleanup on rename failure.
  • Renders a compact GitHub Actions step summary with escaped untrusted identity values.
  • Adds a longitudinal aggregator for averages and trends, category/severity totals, wall-clock by concurrency, file-read failure rates, and inline-comment volume.
  • Preserves trusted-base execution, reviewed-range manifest semantics, and hash ordering.
  • Appends later infrastructure diagnostics so earlier failure evidence is not overwritten.

Reviewer Test Plan

  1. Run the focused telemetry/workflow tests:

    npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/aggregate-ocr-telemetry.test.js scripts/tests/ocr-telemetry.test.js scripts/tests/ocr-telemetry-schema.test.js scripts/tests/ocr-telemetry-cli.test.js scripts/tests/ocr-telemetry-lifecycle.test.js scripts/tests/ocr-telemetry-workflow.test.js scripts/tests/ocr-review-workflow.test.js scripts/tests/ocr-review-workflow-behaviors.test.js scripts/tests/ocr-reviewed-range-manifest-wiring.test.js
    
  2. Validate workflow syntax and lint policy:

    actionlint .github/workflows/ocr-review.yml
    npm run lint:eslint-guard
    
  3. Inspect the OCR workflow and verify telemetry is produced from trusted repository scripts, redacted before validation/hashing, and uploaded only after successful validation and hashes.

  4. Exercise the telemetry CLI with malformed metadata, missing context, invalid identity/lifecycle values, and an unwritable destination; confirm it emits a schema-valid fallback when possible and leaves no temporary write artifact.

  5. Run the aggregator over multiple telemetry records and verify deterministic trends and contextual errors for malformed or unreadable files.

Testing Matrix

🍏 🪟 🐧
npm run CI CI
npx CI CI
Docker - - CI
Podman - - -
Seatbelt - - -

Local focused verification passed 275 tests. Actionlint and the ESLint policy guard passed. Full npm verification, build, smoke, and CI results are tracked in the PR checks.

Linked issues / bugs

Fixes #2676

Related to #2658, #2672, and #2673.

Summary by CodeRabbit

  • New Features
    • Added comprehensive OCR telemetry, including processing duration, files reviewed, read failures, preview evidence, and publication status.
    • Added tooling to aggregate OCR telemetry across runs and generate JSON or Markdown summaries with trends and distributions.
  • Bug Fixes
    • Improved preservation and reporting of multiple infrastructure failure reasons.
    • Strengthened artifact validation, redaction, hashing, and conditional uploads to prevent incomplete or unsafe results.
  • Reliability
    • Added clearer final workflow classifications for successful, partial, failed, and no-op reviews.

Emit strict, redacted telemetry for every OCR artifact path and expose compact run summaries without weakening the trusted-base or reviewed-range guarantees.

Add a fail-closed longitudinal aggregator plus behavioral coverage for lifecycle failures, schema reconciliation, artifact hashing, workflow wiring, and CLI operation.
@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a strict OCR telemetry schema and producer, a longitudinal aggregation CLI, atomic redaction and artifact handling, richer workflow evidence and final classification outputs, plus extensive unit, integration, CLI, and workflow tests.

Changes

OCR telemetry pipeline

Layer / File(s) Summary
Telemetry schema and reconciliation contract
scripts/ocr-telemetry-schema.js
Defines strict record shape, lifecycle states, numeric constraints, prototype-safety checks, and cross-field reconciliation rules.
Telemetry production and atomic artifact handling
scripts/ocr-telemetry.js, scripts/ocr-telemetry-io.js
Builds and validates telemetry from OCR artifacts and environment context, renders Markdown, supports fallback records, redaction, and atomic writes.
Longitudinal aggregation CLI
scripts/aggregate-ocr-telemetry.js, package.json
Adds deterministic telemetry discovery, validation, duplicate detection, aggregate statistics, trends, Markdown output, and the telemetry:ocr:aggregate script.
Workflow evidence and final classification
.github/workflows/ocr-review.yml
Records preview evidence, timing, reviewed files, read failures, telemetry states, artifact validity, redaction outcomes, upload states, and final classification outputs.
Telemetry and workflow behavioral coverage
scripts/tests/*
Adds coverage for schema invariants, telemetry construction, aggregation, CLI behavior, atomic redaction, workflow ordering, evidence markers, gating, and final outputs.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

  • vybestack/llxprt-code issue 2675 — Adds changed-file coverage, preview evidence, reviewed-file extraction, and read-failure diagnostics used by this telemetry workflow.
  • vybestack/llxprt-code issue 2658 — Covers the broader OCR completeness, observability, failure-accounting, and publication-evidence foundation extended here.

Possibly related PRs

Suggested labels: maintainer:e2e:ok, ci/cd

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.08% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise, specific, and accurately reflects the main change: adding structured OCR telemetry for longitudinal analysis.
Description check ✅ Passed The description follows the required template and includes TLDR, Dive Deeper, Reviewer Test Plan, Testing Matrix, and Linked issues sections.
Linked Issues check ✅ Passed The changes implement the telemetry fields, artifact/summary storage, and aggregation script required by #2676.
Out of Scope Changes check ✅ Passed The added workflow, scripts, and tests all support OCR telemetry extraction, validation, storage, or aggregation; no unrelated changes stand out.
📋 Issue Planner

Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).

View plan for ticket: #2676

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue2676

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the maintainer:e2e:ok Trusted contributor; maintainer-approved E2E run label Jul 26, 2026
@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Before this PR, the OCR workflow produced review comments and diagnostics, but it left no structured, queryable record of how each run performed over time. There was no standardized schema for capturing findings, timing, token usage, publication routing, file-read failures, or infrastructure state, and artifact uploads were not gated on validation. After this PR, every OCR workflow run emits a versioned, redacted ocr-telemetry.json record from trusted repository scripts; the record is validated against a strict schema, included in the reviewed-range hash set, and uploaded only after successful validation and hashing. A new longitudinal aggregator can then consume these records across runs to produce averages, trends, and distributions, while the workflow preserves trusted-base execution and atomic write semantics.

Release Notes

New Features

  • Emits versioned, structured OCR telemetry for every workflow run, capturing run identity, OCR configuration, wall-clock duration, files reviewed, preview/review evidence, publication counters, file-read failures, policy/infrastructure state, token usage, and findings by category/severity.
  • Adds a longitudinal OCR telemetry aggregator that computes averages, trends, and distributions across runs, including category/severity totals, wall-clock by concurrency, file-read failure rates, and inline-comment volume.
  • Adds a new npm script telemetry:ocr:aggregate to run the aggregator from the command line.

Bug Fixes

  • Artifact upload is now gated on successful telemetry validation and reviewed-range manifest hash checks, preventing incomplete or unsafe telemetry artifacts from being published.
  • Strengthened atomic write semantics for telemetry files, with unique temporary filenames and cleanup on rename failure.
  • Preserves and appends later infrastructure diagnostics so earlier failure evidence is not overwritten.

Tests

  • Added comprehensive behavioral tests for OCR telemetry schema validation, CLI operations, workflow integration, aggregation logic, lifecycle failures, atomic writes, redaction, and reviewed-range manifest wiring.

Documentation

  • PR description includes a detailed reviewer test plan, testing matrix, and dive-deeper notes covering fallback validity, redaction/hash ordering, and trusted-base preservation.

Refactor

  • Centralized OCR telemetry generation, validation, redaction, and I/O into dedicated modules to separate concerns from the main workflow logic.

Chore

  • Updated the OCR workflow to emit, validate, redact, and upload structured telemetry artifacts as part of the standard review pipeline.

Changes

Layer File(s) Summary
ci .github/workflows/ocr-review.yml Adds structured OCR telemetry emission, validation, and artifact gating to the review workflow.
feature package.json, scripts/aggregate-ocr-telemetry.js, scripts/ocr-telemetry-io.js, scripts/ocr-telemetry-schema.js, scripts/ocr-telemetry.js Implements structured OCR telemetry generation, validation, redaction, and longitudinal aggregation for Open Code Review runs.
tests scripts/tests/aggregate-ocr-telemetry.test.js, scripts/tests/ocr-review-incremental-checkpoint.test.js, scripts/tests/ocr-review-workflow-behaviors.test.js, scripts/tests/ocr-review-workflow-features.test.js, scripts/tests/ocr-review-workflow.test.js, scripts/tests/ocr-reviewed-range-manifest-wiring.test.js, scripts/tests/ocr-telemetry-cli.test.js, scripts/tests/ocr-telemetry-lifecycle.test.js, scripts/tests/ocr-telemetry-schema.test.js, scripts/tests/ocr-telemetry-workflow.test.js, scripts/tests/ocr-telemetry.test.js Comprehensive behavioral tests covering OCR telemetry schema validation, CLI operations, workflow integration, and aggregation logic.

Magnitude

🎯 4 (XL)
5086 additions, 227 deletions, 17 changed files across 0 packages, 18 acceptance criteria

Related

Pre-merge Checks

Check Status Note
Title Clear and descriptive title that states what is being added and references the issue being fixed.
Description All required template sections are present: TLDR, Dive Deeper, Reviewer Test Plan, Testing Matrix, and Linked issues / bugs.
Linked Issues The changes fulfill the acceptance criteria of #2676: structured telemetry JSON emission, category/severity distributions, wall-clock/file/failure metrics, artifact upload, step summary rendering, and a longitudinal aggregation script. Related issues #2658, #2672, and #2673 are correctly noted as related but not the primary scope of this PR.
Out of Scope This PR does not implement the publication routing logic from #2672, the concurrency canary from #2673, or the incremental range selection from #2649. Those remain separate work items. The telemetry added here will inform those future decisions but does not itself change routing behavior, concurrency settings, or range selection logic.

Walkthrough generated by LLxprt PR Review. Planner issue: #2256

Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread .github/workflows/ocr-review.yml
Comment thread .github/workflows/ocr-review.yml
Comment thread scripts/ocr-telemetry-io.js Outdated
Comment thread scripts/ocr-telemetry-io.js Outdated
Comment thread scripts/ocr-telemetry-io.js Outdated
Comment thread scripts/ocr-telemetry-io.js
Comment thread scripts/ocr-telemetry-schema.js
Comment thread scripts/ocr-telemetry-schema.js Outdated
Comment thread scripts/ocr-telemetry-schema.js
Comment thread scripts/ocr-telemetry-schema.js
Comment thread scripts/ocr-telemetry-schema.js Outdated
Comment thread scripts/ocr-telemetry.js
Comment thread scripts/ocr-telemetry.js
Comment thread scripts/ocr-telemetry.js Outdated
Comment thread scripts/tests/ocr-telemetry-cli.test.js Outdated
Comment thread scripts/tests/ocr-telemetry-cli.test.js Outdated
Comment thread scripts/tests/ocr-telemetry-cli.test.js
Comment thread scripts/tests/ocr-telemetry-lifecycle.test.js Outdated
Comment thread scripts/tests/ocr-telemetry-workflow.test.js Outdated
Comment thread scripts/tests/ocr-telemetry-workflow.test.js
Comment thread scripts/tests/ocr-telemetry-lifecycle.test.js
@github-actions

Copy link
Copy Markdown
Contributor

OpenCodeReview — PR #2733

  • Reviewed head SHA: c01abc9b2805164be0e1aa996418f6dd8a811543
  • Merge base: 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range: full from 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range fallback: none
  • Scope: selected 15 file(s), +4821/-216; cumulative 15 file(s), +4821/-216
  • Tokens: 1047474 total (774919 input, 272555 output, 406912 cache)
  • OCR version: open-code-review v1.7.16 (a0b49d5b) linux/amd64 built at: 2026-07-24T15:49:28Z https://github.com/alibaba/open-code-review
  • Phase: review
  • Exit code: 0
  • Run: https://github.com/vybestack/llxprt-code/actions/runs/30191237378
  • Partial review: 0 of 15 files completed (1 failed); 24 finding(s) (23 posted inline).
  • Artifacts: ocr-review-output contains raw JSON, stdout, stderr, preview, phase, and exit-code diagnostics.

Findings without a resolvable position

  • .github/workflows/ocr-review.yml: [unknown/unknown] > [bug/medium] The mark_infrastructure_failure helper uses > (overwrite) to write to ocr-infrastructure-failure.txt. If multiple phases call this helper (e.g., preview fails, then later artifact validation fails), only the last reason is preserved. Earlier infrastructure failure evidence is lost, which can mask the true root cause in telemetry and debugging. Consider appending (>>) or aggregating all failure reasons. (line 835-837)

Shadow-mode routing preview (issue #2672)

  • 7 finding(s) would be routed to this summary instead of inline comments.
    • maintainability/low: 6
    • style/low: 1
  • Set repository variable OCR_ROUTING_SHADOW_MODE=false to enable live routing.

@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 59.17% 59.17% 60.54% 82.47%
Core 79.08% 79.08% 76.61% 84.14%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   59.17 |    82.47 |   60.54 |   59.17 |                   
 src               |   83.95 |     80.2 |   94.11 |   83.95 |                   
  cli.tsx          |   85.87 |    77.77 |     100 |   85.87 | ...92-293,340-342 
  ...tBootstrap.ts |   96.77 |    85.71 |     100 |   96.77 | 67                
  cliBootstrap.tsx |   82.31 |     75.6 |     100 |   82.31 | ...46-151,176-181 
  ...oviderInit.ts |   81.63 |    72.13 |     100 |   81.63 | ...52-254,270-273 
  cliSandbox.ts    |    94.3 |    89.47 |     100 |    94.3 | ...56-157,163-165 
  ...nBootstrap.ts |   71.42 |    63.63 |   83.33 |   71.42 | ...54-264,269-270 
  ...nalSession.ts |   52.86 |       60 |   83.33 |   52.86 | ...10,213-217,221 
  ...st-helpers.ts |       0 |        0 |       0 |       0 | 1-50              
  ...ractiveCli.ts |   90.26 |    84.95 |   90.47 |   90.26 | ...28-530,560-561 
  ...liCommands.ts |   97.29 |       70 |     100 |   97.29 | 40-41             
  ...CliSupport.ts |   91.87 |    82.05 |     100 |   91.87 | ...74,392-393,469 
  ...viderGuard.ts |    98.3 |    94.73 |     100 |    98.3 | 106               
  ...activeAuth.ts |     100 |      100 |     100 |     100 |                   
 src/auth          |      75 |    66.66 |     100 |      75 |                   
  ...gs-adapter.ts |      75 |    66.66 |     100 |      75 | 71-73,76,82-91    
 src/commands      |   78.35 |      100 |   44.44 |   78.35 |                   
  extensions.tsx   |   55.88 |      100 |       0 |   55.88 | 25-38,42          
  hooks.ts         |   61.53 |      100 |       0 |   61.53 | 14-17,20          
  mcp.ts           |   94.11 |      100 |      50 |   94.11 | 26                
  skills.tsx       |     100 |      100 |     100 |     100 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...nds/extensions |   74.22 |    93.08 |   67.69 |   74.22 |                   
  config.ts        |   93.93 |    91.83 |     100 |   93.93 | ...72-173,204-209 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |   80.48 |    76.92 |    87.5 |   80.48 | ...63,199,202-209 
  link.ts          |   64.81 |    83.33 |      25 |   64.81 | 31,54-65,67-72    
  list.ts          |      90 |      100 |   33.33 |      90 | 35-37             
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   72.13 |      100 |      70 |   72.13 | 32-80,218-222,225 
  uninstall.ts     |   78.43 |      100 |   66.66 |   78.43 | 54-59,62-66       
  update.ts        |   10.06 |      100 |       0 |   10.06 | ...73-192,194-199 
  utils.ts         |   13.33 |      100 |       0 |   13.33 | 29-60             
  validate.ts      |   90.47 |       90 |      80 |   90.47 | 70-73,80,135-139  
 .../hooks/scripts |       0 |        0 |       0 |       0 |                   
  on-start.js      |       0 |        0 |       0 |       0 | 1-8               
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.js       |       0 |        0 |       0 |       0 | 1-60              
 ...commands/hooks |    7.18 |      100 |       0 |    7.18 |                   
  migrate.ts       |    7.18 |      100 |       0 |    7.18 | ...00-210,212-214 
 src/commands/mcp  |   96.95 |    86.15 |   94.44 |   96.95 |                   
  add.ts           |   99.56 |    93.33 |     100 |   99.56 | 142               
  list.ts          |   90.51 |    82.14 |      80 |   90.51 | ...13-115,148-150 
  remove.ts        |     100 |    71.42 |     100 |     100 | 21-25             
 ...ommands/skills |    60.4 |    96.66 |   31.25 |    60.4 |                   
  disable.ts       |      54 |      100 |   33.33 |      54 | 40-52,54-63       
  enable.ts        |   72.22 |      100 |   33.33 |   72.22 | 33-37,39-43       
  install.ts       |   42.69 |      100 |      25 |   42.69 | ...72-101,103-110 
  list.ts          |   84.84 |    92.85 |   33.33 |   84.84 | 69-70,83-87,89-91 
  uninstall.ts     |   57.89 |      100 |   33.33 |   57.89 | 47-64,66-71       
 src/config        |   86.71 |    84.17 |    91.6 |   86.71 |                   
  ...deResolver.ts |   94.64 |    95.45 |     100 |   94.64 | 47-49             
  auth.ts          |   84.21 |    82.35 |     100 |   84.21 | 17-18,21-22,52-53 
  cliArgParser.ts  |   93.36 |    91.11 |     100 |   93.36 | ...22-223,286-289 
  config.ts        |   97.48 |     91.3 |     100 |   97.48 | 216-217,231-235   
  configBuilder.ts |   92.77 |    95.45 |   81.81 |   92.77 | ...64-265,353-361 
  ...mentLoader.ts |    83.6 |    53.84 |     100 |    83.6 | ...33-135,143-146 
  extension.ts     |   75.45 |    89.93 |   81.81 |   75.45 | ...87-988,991-992 
  ...iveContext.ts |   93.79 |    91.66 |     100 |   93.79 | 78,80,86-91,231   
  ...iateConfig.ts |   97.47 |      100 |     100 |   97.47 | 155-157           
  keyBindings.ts   |     100 |      100 |     100 |     100 |                   
  ...CopyEngine.ts |   70.74 |    55.81 |     100 |   70.74 | ...24,329,338-341 
  ...malization.ts |    77.1 |     61.9 |     100 |    77.1 | ...22-323,332-333 
  ...lFsHelpers.ts |   79.68 |       80 |      90 |   79.68 | ...45,154,163-173 
  ...rverConfig.ts |   83.33 |    94.44 |     100 |   83.33 | 23-39             
  ...nciliation.ts |   84.26 |    78.14 |     100 |   84.26 | ...1072,1110-1114 
  ...ationTypes.ts |       0 |        0 |       0 |       0 | 1                 
  pathMigration.ts |   88.42 |    89.31 |     100 |   88.42 | ...52-759,788-793 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  policy.ts        |   80.76 |      100 |      50 |   80.76 | 45-49             
  ...figRuntime.ts |   90.09 |    89.13 |     100 |   90.09 | ...82-589,600-603 
  ...Ephemerals.ts |   70.27 |    66.66 |      75 |   70.27 | 31-32,44-52       
  ...eBootstrap.ts |   92.25 |    89.14 |     100 |   92.25 | ...01-803,812-813 
  profileRepair.ts |   81.66 |       75 |     100 |   81.66 | 42-49,95-97       
  ...Resolution.ts |   78.66 |    76.74 |     100 |   78.66 | ...87-290,303-311 
  ...pplication.ts |   92.48 |       80 |     100 |   92.48 | ...,95-96,113,183 
  ...elResolver.ts |      96 |    96.87 |     100 |      96 | 58-59,96          
  reconcileLock.ts |   89.07 |    70.37 |     100 |   89.07 | ...49-150,153-154 
  sandboxConfig.ts |   69.81 |    51.48 |   88.46 |   69.81 | ...80-581,593-594 
  ...oxProfiles.ts |    8.53 |      100 |       0 |    8.53 | 47-48,51-129      
  settingPaths.ts  |     100 |      100 |     100 |     100 |                   
  ...validation.ts |   86.99 |    80.62 |     100 |   86.99 | ...02,404,406,408 
  settings.ts      |   83.55 |    86.73 |   69.23 |   83.55 | ...74-475,522-523 
  ...ingsLegacy.ts |    70.9 |    81.81 |     100 |    70.9 | 48-52,56-67       
  ...ingsLoader.ts |   94.11 |    81.39 |     100 |   94.11 | ...78,108-109,137 
  settingsMerge.ts |   99.51 |    95.65 |     100 |   99.51 | 128-129           
  ...Migrations.ts |   95.67 |    91.66 |     100 |   95.67 | 22-24,48-49,55-56 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...Governance.ts |   95.12 |    91.17 |     100 |   95.12 | 46-47,128-131     
  ...tedFolders.ts |   95.58 |       96 |     100 |   95.58 | 93,120-126        
  welcomeConfig.ts |   22.41 |      100 |       0 |   22.41 | ...71,74-79,82-83 
  yargsOptions.ts  |   98.74 |    96.77 |    87.5 |   98.74 | 144,153-156       
 ...fig/extensions |   78.21 |    84.27 |   88.97 |   78.21 |                   
  consent.ts       |   88.03 |    85.71 |     100 |   88.03 | ...77-378,381-382 
  ...ionConsent.ts |   87.38 |    76.66 |     100 |   87.38 | ...,64-67,113-116 
  ...Enablement.ts |   94.05 |       96 |     100 |   94.05 | ...14-220,283-285 
  ...sionLoader.ts |   89.76 |    85.18 |     100 |   89.76 | ...25-526,546-547 
  ...onSettings.ts |     100 |      100 |     100 |     100 |                   
  github.ts        |   61.73 |    81.73 |      68 |   61.73 | ...49-650,660-663 
  hookSchema.ts    |      97 |    91.66 |     100 |      97 | 147-148,210       
  ...reResolver.ts |   80.53 |    80.59 |    90.9 |   80.53 | ...44,347-348,356 
  ...ntegration.ts |   55.31 |    84.78 |      50 |   55.31 | ...61,402,426-427 
  ...ingsPrompt.ts |      73 |    94.73 |      80 |      73 | 92-121            
  ...ngsStorage.ts |   85.57 |    77.19 |     100 |   85.57 | ...05-306,324-327 
  update.ts        |   69.52 |    52.94 |   85.71 |   69.52 | ...73-201,218-226 
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   95.55 |       90 |     100 |   95.55 | 33-34             
 ...ettings-schema |   99.79 |       60 |     100 |   99.79 |                   
  schema-core.ts   |     100 |      100 |     100 |     100 |                   
  ...extensions.ts |     100 |      100 |     100 |     100 |                   
  ...a-security.ts |   99.44 |       50 |     100 |   99.44 | 16-17             
  schema-tail.ts   |   99.52 |       50 |     100 |   99.52 | 13-14             
  schema-ui.ts     |     100 |      100 |     100 |     100 |                   
  schema.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/constants     |     100 |      100 |     100 |     100 |                   
  historyLimits.ts |     100 |      100 |     100 |     100 |                   
 src/extensions    |   65.02 |    61.81 |      75 |   65.02 |                   
  ...utoUpdater.ts |   65.02 |    61.81 |      75 |   65.02 | ...69-470,479,481 
 ...egration-tests |   71.66 |    83.33 |   85.71 |   71.66 |                   
  ...st-helpers.ts |       0 |        0 |       0 |       0 | 1-79              
  test-utils.ts    |   91.97 |     86.2 |    92.3 |   91.97 | ...45,263-264,274 
 src/launcher      |   94.63 |    86.12 |   90.19 |   94.63 |                   
  ...ate-policy.ts |     100 |      100 |     100 |     100 |                   
  ...y-resolver.ts |   91.39 |    92.85 |   85.71 |   91.39 | 121-128           
  bun-launcher.ts  |   96.31 |    85.96 |   88.88 |   96.31 | 35-43             
  ...h-resolver.ts |   93.79 |    81.81 |    90.9 |   93.79 | ...14-316,339-340 
 ...viders/logging |   89.31 |     92.5 |   69.23 |   89.31 |                   
  ...rvice-impl.ts |   44.44 |      100 |       0 |   44.44 | 21-22,25-30,36-37 
  git-stats.ts     |   96.46 |     92.5 |     100 |   96.46 | 154-155,195-196   
 src/runtime       |   73.15 |    66.66 |   73.68 |   73.15 |                   
  ...chedClient.ts |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   71.95 |    64.28 |   72.22 |   71.95 | ...64-386,402-404 
 src/services      |   85.91 |       85 |   94.87 |   85.91 |                   
  ...mandLoader.ts |   80.74 |    73.33 |      80 |   80.74 | ...07-121,165-183 
  ...andService.ts |     100 |      100 |     100 |     100 |                   
  ...mandLoader.ts |   91.91 |    86.27 |     100 |   91.91 | ...11-216,303-310 
  ...omptLoader.ts |    67.7 |    68.96 |     100 |    67.7 | ...73,179-185,200 
  ...tArgParser.ts |     100 |    94.28 |     100 |     100 | 42,72             
  performResume.ts |   89.11 |    89.18 |     100 |   89.11 | ...59-262,268-269 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |      98 |     93.1 |     100 |      98 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.88 |    92.72 |     100 |   97.88 | 88-89,273-274     
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...o-continuation |   86.84 |    84.09 |   94.73 |   86.84 |                   
  ...ionService.ts |   86.84 |    84.09 |   94.73 |   86.84 | ...16,583,609-610 
 src/session       |   82.09 |    83.01 |   86.66 |   82.09 |                   
  debugLog.ts      |      60 |       50 |     100 |      60 | 12-16             
  ...rReporting.ts |   79.68 |    86.36 |     100 |   79.68 | 39-41,44-52,59-60 
  ...ractiveUI.tsx |   84.57 |      100 |   71.42 |   84.57 | ...62-264,274-283 
  ...rReporting.ts |     100 |      100 |     100 |     100 |                   
  ...iveSession.ts |   78.91 |       55 |      75 |   78.91 | ...51-254,271-288 
  ...tListeners.ts |     100 |      100 |     100 |     100 |                   
  ...alHandlers.ts |   81.37 |    88.57 |      90 |   81.37 | ...,94-97,112-113 
  ...nalCleanup.ts |   85.71 |       50 |     100 |   85.71 | 21                
 src/test-utils    |   76.81 |    82.25 |   37.68 |   76.81 |                   
  assertions.ts    |   76.47 |       50 |     100 |   76.47 | ...40,49-50,59-60 
  async.ts         |       0 |        0 |       0 |       0 | 1-34              
  ...eExtension.ts |     100 |      100 |     100 |     100 |                   
  ...omMatchers.ts |   22.22 |      100 |       0 |   22.22 | 19-49             
  inkFrame.ts      |      65 |    66.66 |   66.66 |      65 | 31-32,40-44       
  mockAgent.ts     |     100 |      100 |      50 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  regex.ts         |     100 |      100 |     100 |     100 |                   
  render.tsx       |   93.96 |    96.66 |   24.48 |   93.96 | ...54-159,266-267 
  ...e-testing.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...iderConfig.ts |       0 |        0 |       0 |       0 | 1-19              
 src/ui            |      49 |       93 |   28.84 |      49 |                   
  App.tsx          |   35.84 |      100 |       0 |   35.84 | 70-101,107-114    
  AppContainer.tsx |     100 |      100 |     100 |     100 |                   
  ...erRuntime.tsx |   17.15 |    33.33 |   16.66 |   17.15 | 73-414            
  ...tionNudge.tsx |       8 |      100 |       0 |       8 | 29-104            
  cliUiRuntime.ts  |   94.75 |    97.14 |   26.61 |   94.75 | ...50,706,723,726 
  colors.ts        |   37.14 |      100 |   20.33 |   37.14 | ...03-304,306-307 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  debug.ts         |     100 |      100 |     100 |     100 |                   
  ...derOptions.ts |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   88.63 |       84 |     100 |   88.63 | 18,20-21,28-29    
  ...ntsEnabled.ts |     100 |      100 |     100 |     100 |                   
  ...submission.ts |     100 |      100 |     100 |     100 |                   
  ...lobalState.ts |     100 |      100 |     100 |     100 |                   
  ...tic-colors.ts |   78.94 |      100 |      60 |   78.94 | 15-16,24-25       
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/commands   |   72.32 |    78.57 |   78.94 |   72.32 |                   
  aboutCommand.ts  |   82.84 |       50 |   91.66 |   82.84 | ...92-193,195-196 
  authCommand.ts   |    58.9 |    79.54 |   81.25 |    58.9 | ...91-641,653-656 
  ...urlCommand.ts |      68 |       75 |     100 |      68 | 47-62             
  bugCommand.ts    |   71.42 |    30.76 |     100 |   71.42 | ...00-111,146-154 
  chatCommand.ts   |   70.06 |    80.28 |   66.66 |   70.06 | ...53-554,602-613 
  ...Validation.ts |     100 |     91.6 |     100 |     100 | ...08,218,234,361 
  clearCommand.ts  |   86.66 |    85.71 |     100 |   86.66 | 81-88             
  ...essCommand.ts |   93.47 |    86.04 |     100 |   93.47 | ...,67-71,111-112 
  ...nueCommand.ts |     100 |      100 |     100 |     100 |                   
  copyCommand.ts   |     100 |      100 |     100 |     100 |                   
  debugCommands.ts |   13.81 |      100 |       0 |   13.81 | ...52,459,466,473 
  ...st-helpers.ts |   89.81 |     91.3 |   54.54 |   89.81 | ...4,96-97,99-100 
  ...icsCommand.ts |   78.08 |    51.64 |   94.11 |   78.08 | ...11-514,529-534 
  ...ticsTokens.ts |   92.05 |    90.24 |     100 |   92.05 | ...,63-68,103-104 
  ...ryCommand.tsx |    89.5 |    84.84 |     100 |    89.5 | ...26-134,201-209 
  docsCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...extCommand.ts |   96.22 |    89.65 |     100 |   96.22 | 220-225           
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...onsCommand.ts |   41.27 |    88.09 |    62.5 |   41.27 | ...23-380,390-538 
  ...ionSection.ts |   83.33 |    93.33 |     100 |   83.33 | 28-34             
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   79.49 |    80.82 |   92.85 |   79.49 | ...02,511-512,626 
  ideCommand.ts    |   69.87 |    74.28 |   69.23 |   69.87 | ...36-237,240-255 
  initCommand.ts   |   81.01 |    71.42 |   66.66 |   81.01 | 38-42,44-91       
  keyCommand.ts    |   91.33 |    84.44 |     100 |   91.33 | ...86,465-470,592 
  ...ileCommand.ts |    10.9 |      100 |       0 |    10.9 | 22-46,53-141      
  ...ingCommand.ts |   10.27 |      100 |       0 |   10.27 | ...19-572,589-601 
  logoutCommand.ts |   56.52 |    66.66 |      75 |   56.52 | ...-84,97-103,108 
  lspCommand.ts    |    93.8 |    85.36 |     100 |    93.8 | 43,95-100         
  mcpAuth.ts       |   90.43 |       80 |   66.66 |   90.43 | 32-41,86-87       
  mcpCommand.ts    |   96.25 |    87.87 |     100 |   96.25 | 87-92             
  mcpDisplay.ts    |   84.12 |    81.73 |   93.75 |   84.12 | ...47-448,492-493 
  memoryCommand.ts |   87.45 |    75.47 |     100 |   87.45 | ...47,235-249,298 
  modelCommand.ts  |   98.92 |    93.02 |     100 |   98.92 | 120               
  mouseCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...onsCommand.ts |    93.9 |    88.88 |     100 |    93.9 | 58-62             
  ...iesCommand.ts |   97.79 |    87.75 |     100 |   97.79 | 24,34-35          
  ...acyCommand.ts |   61.53 |      100 |       0 |   61.53 | 22-26             
  ...ileCommand.ts |   59.14 |    55.55 |   63.63 |   59.14 | ...90-531,552-568 
  profileLoad.ts   |   52.08 |       60 |    87.5 |   52.08 | ...45,172,183-187 
  ...adBalancer.ts |   81.36 |    84.61 |     100 |   81.36 | ...20-321,347-352 
  ...ileSchemas.ts |   67.11 |    81.81 |     100 |   67.11 | ...18-230,262-267 
  ...derCommand.ts |    57.8 |       42 |      80 |    57.8 | ...80-381,390-395 
  quitCommand.ts   |   29.26 |      100 |       0 |   29.26 | 18-50             
  ...oreCommand.ts |   90.27 |    83.33 |     100 |   90.27 | ...70-175,208-213 
  setCommand.ts    |   86.32 |    84.28 |     100 |   86.32 | ...91-200,217-222 
  ...mandSchema.ts |   71.57 |    81.81 |   84.61 |   71.57 | ...05,232-240,295 
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  setupCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   90.47 |    82.85 |     100 |   90.47 | ...13-216,223-227 
  skillsCommand.ts |   82.78 |       75 |     100 |   82.78 | ...91-292,305-306 
  statsCommand.ts  |   57.25 |    86.66 |   58.33 |   57.25 | ...04-216,234-235 
  statsQuota.ts    |   79.47 |       75 |   83.33 |   79.47 | ...15-316,349-353 
  ...entCommand.ts |   76.72 |    69.73 |   81.81 |   76.72 | ...09-615,626-632 
  tasksCommand.ts  |   75.83 |       75 |     100 |   75.83 | ...51-156,202-210 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  todoCommand.ts   |    78.5 |    71.62 |     100 |    78.5 | ...48-460,468-472 
  ...Formatters.ts |   48.93 |    71.42 |   33.33 |   48.93 | ...5,70-86,92-113 
  ...Operations.ts |   77.06 |       75 |   85.71 |   77.06 | ...10-424,430-437 
  ...matCommand.ts |   26.66 |      100 |       0 |   26.66 | 33-92             
  ...keyCommand.ts |   98.88 |     92.3 |     100 |   98.88 | 34                
  ...ileCommand.ts |    99.1 |    94.11 |     100 |    99.1 | 36                
  toolsCommand.ts  |   86.71 |    73.23 |     100 |   86.71 | ...64,295,326-327 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ileCommand.ts |   27.77 |        0 |       0 |   27.77 | 11-23             
  vimCommand.ts    |   44.44 |      100 |       0 |   44.44 | 15-25             
 ...ommands/schema |   96.06 |    92.54 |   94.11 |   96.06 |                   
  index.ts         |   95.84 |    91.58 |     100 |   95.84 | ...07-211,222-223 
  schemaHelpers.ts |   97.02 |    96.22 |     100 |   97.02 | 67-68,115-117     
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/ui/components |    11.9 |    38.56 |    7.51 |    11.9 |                   
  AboutBox.tsx     |   13.25 |      100 |       0 |   13.25 | ...80-102,106-134 
  AnsiOutput.tsx   |    8.33 |      100 |       0 |    8.33 | 25-90             
  AppHeader.tsx    |   21.87 |      100 |       0 |   21.87 | 27-57             
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  AuthDialog.tsx   |    5.22 |      100 |       0 |    5.22 | ...27-232,235-314 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...Indicator.tsx |   15.15 |      100 |       0 |   15.15 | 17-47             
  ...firmation.tsx |   15.97 |      100 |       0 |   15.97 | 60-135,144-209    
  ...tsDisplay.tsx |    12.5 |      100 |       0 |    12.5 | ...6,60-65,69-142 
  CliSpinner.tsx   |       0 |        0 |       0 |       0 | 1-22              
  Composer.tsx     |     8.1 |      100 |       0 |     8.1 | 17-32,45-100      
  ...entPrompt.tsx |   18.75 |      100 |       0 |   18.75 | 21-51             
  ...ryDisplay.tsx |   21.05 |      100 |       0 |   21.05 | 17-35             
  ...ryDisplay.tsx |    4.65 |      100 |       0 |    4.65 | 30-108,111-175    
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-37              
  ...gProfiler.tsx |   16.86 |      100 |       0 |   16.86 | ...73-118,122-222 
  ...esDisplay.tsx |   10.52 |      100 |       0 |   10.52 | 24-82             
  ...ogManager.tsx |    5.82 |      100 |       0 |    5.82 | 72-802,806-830    
  ...ngsDialog.tsx |   13.02 |      100 |       0 |   13.02 | ...49-173,177-248 
  ...rBoundary.tsx |   10.07 |        0 |       0 |   10.07 | ...26-171,189-204 
  ...ustDialog.tsx |   16.34 |      100 |       0 |   16.34 | ...2,70-81,84-143 
  Footer.tsx       |    12.6 |        0 |       0 |    12.6 | ...49-653,657-726 
  Header.tsx       |    17.5 |      100 |       0 |    17.5 | 22-62             
  Help.tsx         |    6.84 |      100 |       0 |    6.84 | ...87-190,194-206 
  ...emDisplay.tsx |   11.66 |      100 |       0 |   11.66 | 54-246,249-287    
  ...usDisplay.tsx |       0 |        0 |       0 |       0 | 1-47              
  InputPrompt.tsx  |     100 |       75 |     100 |     100 | 45                
  ...tsDisplay.tsx |    4.36 |      100 |       0 |    4.36 | ...32-226,229-292 
  ...utManager.tsx |       0 |        0 |       0 |       0 | 1-99              
  ...ileDialog.tsx |    8.33 |      100 |       0 |    8.33 | ...8,72-81,85-152 
  ...Indicator.tsx |   14.92 |      100 |       0 |   14.92 | 21-25,35-97       
  ...ingDialog.tsx |    6.68 |      100 |       0 |    6.68 | ...66-383,387-436 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |    3.82 |      100 |       0 |    3.82 | ...79-752,756-842 
  ...tsDisplay.tsx |    3.82 |      100 |       0 |    3.82 | 32-206,209-260    
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | ...08-139,142-177 
  ...odeDialog.tsx |     7.4 |      100 |       0 |     7.4 | 32-141            
  ...ustDialog.tsx |    5.53 |      100 |       0 |    5.53 | ...36-273,278-313 
  PrepareLabel.tsx |   13.33 |      100 |       0 |   13.33 | 20-48             
  ...ailDialog.tsx |   11.36 |      100 |       0 |   11.36 | ...93-499,503-576 
  ...ineEditor.tsx |    4.34 |      100 |       0 |    4.34 | ...66-552,555-630 
  ...istDialog.tsx |    3.84 |      100 |       0 |    3.84 | ...95-758,761-789 
  ...derDialog.tsx |    2.58 |      100 |       0 |    2.58 | 58-408,411-426    
  ...Indicator.tsx |       0 |        0 |       0 |       0 | 1-21              
  ...ngSpinner.tsx |   33.33 |      100 |       0 |   33.33 | 29-48             
  ...eKeyInput.tsx |       0 |        0 |       0 |       0 | 1-149             
  ...serDialog.tsx |    9.56 |      100 |       0 |    9.56 | ...52-603,611-670 
  ...ryDisplay.tsx |      10 |      100 |       0 |      10 | 21-28,31-75       
  ...ngsDialog.tsx |    9.75 |      100 |       0 |    9.75 | 29-105            
  ...putPrompt.tsx |   14.28 |      100 |       0 |   14.28 | 19-58             
  ...Indicator.tsx |   44.44 |      100 |       0 |   44.44 | 12-17             
  ...MoreLines.tsx |   30.43 |      100 |       0 |   30.43 | 18-38             
  ...estHelpers.ts |       0 |        0 |       0 |       0 | 1-201             
  StatsDisplay.tsx |    7.75 |      100 |       0 |    7.75 | ...21-635,638-709 
  ...usDisplay.tsx |       0 |        0 |       0 |       0 | 1-59              
  StickyHeader.tsx |    7.14 |      100 |       0 |    7.14 | 20-78             
  ...nsDisplay.tsx |    5.83 |      100 |       0 |    5.83 | 39-91,105-181     
  Table.tsx        |    6.77 |      100 |       0 |    6.77 | 31-36,39-99       
  ThemeDialog.tsx  |    3.96 |      100 |       0 |    3.96 | 51-441,444-500    
  ...dGradient.tsx |      25 |      100 |       0 |      25 | 27-46             
  Tips.tsx         |      16 |      100 |       0 |      16 | 17-45             
  TodoPanel.tsx    |     5.9 |      100 |       0 |     5.9 | ...87-244,247-296 
  ...tsDisplay.tsx |   10.05 |      100 |       0 |   10.05 | ...88-227,230-259 
  ToolsDialog.tsx  |   10.63 |      100 |       0 |   10.63 | ...5,41-47,50-123 
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...ionDialog.tsx |    6.08 |      100 |       0 |    6.08 | 18-104,110-161    
  ...romptHooks.ts |   87.47 |    65.51 |     100 |   87.47 | ...44-348,364-371 
  ...eyHandlers.ts |   24.33 |    33.33 |      50 |   24.33 | ...75-577,581-606 
  ...mptRender.tsx |   53.05 |     31.7 |   72.72 |   53.05 | ...02,314-322,343 
  ...PromptText.ts |   31.08 |    55.55 |   28.57 |   31.08 | ...25-175,179-199 
  ...romptTypes.ts |       0 |        0 |       0 |       0 | 1                 
  ...logActions.ts |    2.59 |      100 |       0 |    2.59 | ...92-562,565-602 
  ...logDisplay.ts |    4.28 |      100 |       0 |    4.28 | 25-120,125-184    
  ...logHelpers.ts |    7.64 |      100 |       0 |    7.64 | ...76-194,201-214 
  ...ialogHooks.ts |     2.8 |      100 |       0 |     2.8 | ...99-600,633-808 
  ...ogKeypress.ts |    1.69 |      100 |       0 |    1.69 | 35-387,482-679    
  ...ialogTypes.ts |       0 |        0 |       0 |       0 | 1                 
  ...alogViews.tsx |    4.13 |      100 |       0 |    4.13 | 31-133,167-378    
  todo-utils.ts    |       0 |        0 |       0 |       0 | 1-7               
 ...leCreateWizard |   19.55 |       75 |    1.13 |   19.55 |                   
  ...aramsStep.tsx |   13.42 |      100 |       0 |   13.42 | ...33-246,258-342 
  ...ationStep.tsx |    7.23 |      100 |       0 |    7.23 | ...35-571,583-651 
  ...onfigStep.tsx |   13.33 |      100 |       0 |   13.33 | 20-26,37-117      
  ...electStep.tsx |    9.73 |      100 |       0 |    9.73 | ...12-279,295-340 
  ...ationMenu.tsx |       0 |        0 |       0 |       0 | 1-102             
  ...eSaveStep.tsx |    7.73 |      100 |       0 |    7.73 | ...75-304,316-394 
  ...ssSummary.tsx |   12.12 |      100 |       0 |   12.12 | 23-88             
  ...electStep.tsx |   18.18 |      100 |       0 |   18.18 | 29-96             
  TextInput.tsx    |    6.56 |      100 |       0 |    6.56 | ...99-109,117-200 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.tsx        |   14.17 |      100 |       0 |   14.17 | ...97-226,235-319 
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |    15.2 |    83.33 |    7.69 |    15.2 | ...65-367,372-389 
  validation.ts    |   11.23 |      100 |       0 |   11.23 | ...97-104,107-111 
 ...gentManagement |    4.22 |      100 |       0 |    4.22 |                   
  ...entWizard.tsx |    2.91 |      100 |       0 |    2.91 | 30-232,237-312    
  ...ionWizard.tsx |    1.44 |      100 |       0 |    1.44 | 30-592,595-676    
  ...eteDialog.tsx |    5.88 |      100 |       0 |    5.88 | 14-94,104-146     
  ...tEditForm.tsx |    1.77 |      100 |       0 |    1.77 | 30-619,622-640    
  ...tListMenu.tsx |    2.94 |      100 |       0 |    2.94 | 15-264,267-348    
  ...tMainMenu.tsx |   16.66 |      100 |       0 |   16.66 | 22-62             
  ...gerDialog.tsx |    2.39 |      100 |       0 |    2.39 | 29-600,603-679    
  ...tShowView.tsx |    4.76 |      100 |       0 |    4.76 | 25-183,186-243    
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...comeOnboarding |   13.67 |        0 |       0 |   13.67 |                   
  ...ethodStep.tsx |   16.86 |      100 |       0 |   16.86 | 38-123            
  ...ationStep.tsx |    7.35 |      100 |       0 |    7.35 | ...1,59-95,98-177 
  ...etionStep.tsx |    9.84 |      100 |       0 |    9.84 | ...,89-99,103-179 
  ...electStep.tsx |   12.12 |      100 |       0 |   12.12 | ...3,67-75,79-143 
  ...electStep.tsx |   34.48 |      100 |       0 |   34.48 | 51-120            
  SkipExitStep.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...omeDialog.tsx |   11.76 |      100 |       0 |   11.76 | 51-118,121-166    
  WelcomeStep.tsx  |    10.2 |      100 |       0 |    10.2 | 23-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
 ...nents/messages |    18.9 |       90 |   15.06 |    18.9 |                   
  AiMessage.tsx    |   14.51 |      100 |       0 |   14.51 | 28-95             
  ...geContent.tsx |   20.83 |      100 |       0 |   20.83 | 26-46             
  ...onMessage.tsx |   12.28 |      100 |       0 |   12.28 | 24-86             
  DiffRenderer.tsx |    3.59 |      100 |       0 |    3.59 | ...81-412,415-433 
  ErrorMessage.tsx |   22.22 |      100 |       0 |   22.22 | 16-31             
  InfoMessage.tsx  |   17.24 |      100 |       0 |   17.24 | 19-44             
  ...rlMessage.tsx |   11.36 |      100 |       0 |   11.36 | 18-65             
  ...geMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ckDisplay.tsx |      20 |      100 |       0 |      20 | 43-64             
  ...onMessage.tsx |    3.04 |      100 |       0 |    3.04 | 36-552,557-636    
  ...upMessage.tsx |    7.55 |      100 |       0 |    7.55 | ...76-269,273-348 
  ToolMessage.tsx  |    4.37 |      100 |       0 |    4.37 | 38-342,358-428    
  ...ltDisplay.tsx |   92.03 |    88.23 |     100 |   92.03 | 55-69,238-240     
  ToolShared.tsx   |   64.61 |       90 |   33.33 |   64.61 | 78-99,102-105     
  UserMessage.tsx  |     100 |      100 |     100 |     100 |                   
  ...llMessage.tsx |   36.36 |      100 |       0 |   36.36 | 17-25             
  ...ngMessage.tsx |    23.8 |      100 |       0 |    23.8 | 17-34             
 ...ponents/shared |    42.3 |    62.09 |   40.77 |    42.3 |                   
  ...ctionList.tsx |    4.31 |      100 |       0 |    4.31 | 36-123,128-206    
  MaxSizedBox.tsx  |   49.79 |    56.75 |   70.58 |   49.79 | ...63-666,670-673 
  ...tonSelect.tsx |   12.76 |      100 |       0 |   12.76 | 66-113            
  ...lableList.tsx |    5.15 |      100 |       0 |    5.15 | 40-267            
  ...ist.hooks.tsx |    3.81 |      100 |       0 |    3.81 | ...70-795,798-835 
  ...lizedList.tsx |   11.49 |      100 |       0 |   11.49 | 28-112            
  ...List.types.ts |     100 |      100 |     100 |     100 |                   
  ...operations.ts |   75.54 |    48.14 |     100 |   75.54 | ...32-233,256-265 
  ...er-reducer.ts |   34.01 |    49.01 |   36.66 |   34.01 | ...30,632,644,687 
  buffer-types.ts  |     100 |      100 |     100 |     100 |                   
  text-buffer.ts   |   75.97 |    78.26 |    29.5 |   75.97 | ...33-635,654-660 
  ...formations.ts |   42.85 |    71.42 |      80 |   42.85 | ...32-139,163-209 
  ...n-handlers.ts |   33.99 |    61.53 |   23.25 |   33.99 | ...47-755,758-762 
  ...st-helpers.ts |       0 |        0 |       0 |       0 | 1-33              
  ...er-actions.ts |   93.84 |     87.5 |     100 |   93.84 | 91-93,100         
  visual-layout.ts |    90.2 |    72.34 |     100 |    90.2 | ...48-350,372-373 
  ...navigation.ts |   53.38 |    61.53 |   73.68 |   53.38 | ...45-366,389-411 
 ...mponents/views |    9.79 |      100 |       0 |    9.79 |                   
  ChatList.tsx     |   20.58 |      100 |       0 |   20.58 | 24-55             
  ...sionsList.tsx |     7.5 |      100 |       0 |     7.5 | 19-103            
  HooksList.tsx    |   10.67 |      100 |       0 |   10.67 | ...18-129,132-147 
  SkillsList.tsx   |    5.79 |      100 |       0 |    5.79 | 18-103            
 src/ui/constants  |   55.94 |     90.9 |      50 |   55.94 |                   
  ...ollections.ts |     100 |      100 |     100 |     100 |                   
  tips.ts          |       0 |        0 |       0 |       0 | 1-163             
 src/ui/containers |       0 |        0 |       0 |       0 |                   
  ...ontroller.tsx |       0 |        0 |       0 |       0 | 1-357             
  UIStateShell.tsx |       0 |        0 |       0 |       0 | 1-15              
 ...ainer/builders |   98.38 |      100 |   83.33 |   98.38 |                   
  ...dUIActions.ts |     100 |      100 |     100 |     100 |                   
  buildUIState.ts  |     100 |      100 |     100 |     100 |                   
  ...onsBuilder.ts |   66.66 |      100 |       0 |   66.66 | 20-21             
  ...ateBuilder.ts |   66.66 |      100 |       0 |   66.66 | 20-21             
 ...ontainer/hooks |    56.6 |    87.54 |   59.37 |    56.6 |                   
  ...pBootstrap.ts |   93.24 |    58.33 |     100 |   93.24 | ...41-248,252-254 
  useAppDialogs.ts |   41.31 |      100 |   42.85 |   41.31 | ...63,182-399,419 
  ...ntHandlers.ts |     100 |      100 |     100 |     100 |                   
  useAppInput.ts   |    5.43 |      100 |       0 |    5.43 | 102-507,510-514   
  useAppLayout.ts  |    7.69 |      100 |       0 |    7.69 | 93-308,311-314    
  ...reenAction.ts |   13.63 |      100 |       0 |   13.63 | 23-41             
  ...nSelection.ts |      20 |      100 |       0 |      20 | 27-48             
  ...hestration.ts |     100 |      100 |     100 |     100 |                   
  ...references.ts |      10 |      100 |       0 |      10 | 51-104            
  ...itHandling.ts |   89.79 |      100 |     100 |   89.79 | 131-139,143       
  ...textBridge.ts |   33.33 |      100 |       0 |   33.33 | 23-30             
  ...tartHotkey.ts |   26.66 |      100 |       0 |   26.66 | 23-33             
  ...omptSubmit.ts |     100 |      100 |     100 |     100 |                   
  ...utHandling.ts |   98.18 |       90 |     100 |   98.18 | 49,148            
  ...yBootstrap.ts |      30 |      100 |       0 |      30 | 28-34             
  ...eybindings.ts |   86.36 |    78.18 |     100 |   86.36 | ...02-204,248-249 
  ...easurement.ts |   15.38 |      100 |       0 |   15.38 | 45-95             
  ...reshAction.ts |   79.45 |     37.5 |     100 |   79.45 | 61,91-94,96-105   
  ...untimeSync.ts |   96.17 |    96.96 |     100 |   96.17 | 204-209           
  ...elTracking.ts |   34.69 |      100 |     100 |   34.69 | 51-95             
  ...laceholder.ts |      15 |      100 |       0 |      15 | 13-18,21-34       
  ...rorTimeout.ts |   17.64 |      100 |       0 |   17.64 | 24-39             
  ...astructure.ts |   73.91 |      100 |      20 |   73.91 | 53,57,61,75-83    
  ...ebugLogger.ts |   17.24 |      100 |       0 |   17.24 | 23-51             
  ...ialization.ts |   98.88 |    94.73 |     100 |   98.88 | 88                
  ...sAutoReset.ts |     100 |       90 |     100 |     100 | 42                
  ...andActions.ts |     100 |      100 |     100 |     100 |                   
  ...eshManager.ts |     100 |      100 |     100 |     100 |                   
  ...uationFlow.ts |    7.14 |      100 |       0 |    7.14 | 57-160            
  ...csTracking.ts |   95.78 |    80.64 |     100 |   95.78 | ...22-123,174-175 
  ...uthBridges.ts |   17.94 |      100 |   33.33 |   17.94 | ...13-138,142-146 
 src/ui/contexts   |   53.55 |    80.89 |   49.01 |   53.55 |                   
  ...chContext.tsx |   88.23 |    66.66 |     100 |   88.23 | 27-28             
  FocusContext.tsx |       0 |        0 |       0 |       0 | 1-11              
  ...ssContext.tsx |    83.3 |    87.89 |    87.5 |    83.3 | ...21-522,572-573 
  MouseContext.tsx |   78.82 |       75 |      80 |   78.82 | ...00-101,111-117 
  ...erContext.tsx |   94.44 |    63.63 |     100 |   94.44 | 125-128           
  ...owContext.tsx |   21.42 |      100 |   33.33 |   21.42 | 34,40-88          
  ...meContext.tsx |   45.27 |    57.14 |      50 |   45.27 | ...47-248,256-257 
  ...lProvider.tsx |    91.8 |    74.62 |     100 |    91.8 | ...94-495,507-508 
  ...onContext.tsx |    3.64 |      100 |       0 |    3.64 | ...04-459,464-471 
  ...teContext.tsx |       0 |        0 |       0 |       0 | 1-57              
  ...gsContext.tsx |      50 |      100 |       0 |      50 | 15-20             
  ...ngContext.tsx |   42.85 |      100 |       0 |   42.85 | 15-22             
  TodoContext.tsx  |   54.54 |      100 |       0 |   54.54 | 28-31,33-36,39-40 
  TodoProvider.tsx |    3.57 |      100 |       0 |    3.57 | 28-185,188-218    
  ...llContext.tsx |     100 |      100 |       0 |     100 |                   
  ...lProvider.tsx |    6.75 |      100 |       0 |    6.75 | 24-118            
  ...nsContext.tsx |      25 |      100 |       0 |      25 | 204-215,218-223   
  ...teContext.tsx |      50 |       50 |      50 |      50 | 251-260,265-266   
  ...deContext.tsx |   11.11 |      100 |       0 |   11.11 | 30-82,85-90       
 src/ui/editors    |   98.18 |     87.5 |     100 |   98.18 |                   
  ...ngsManager.ts |   98.18 |     87.5 |     100 |   98.18 | 59                
 src/ui/hooks      |   67.99 |    85.66 |   68.31 |   67.99 |                   
  ...st-helpers.ts |   91.47 |    81.25 |   68.57 |   91.47 | ...62-163,182-186 
  ...dProcessor.ts |   82.75 |    86.88 |   77.77 |   82.75 | ...02-204,257-269 
  ...sorHelpers.ts |   83.03 |    80.35 |   96.29 |   83.03 | ...50-658,704-705 
  ...rceHelpers.ts |      56 |       50 |   71.42 |      56 | ...68-275,280-288 
  ...etionUtils.ts |   53.36 |    88.23 |   64.28 |   53.36 | 57-207,335        
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  keyToAnsi.ts     |    42.5 |      100 |       0 |    42.5 | 27-37,47-61       
  ...etionUtils.ts |     100 |    66.66 |     100 |     100 | 49                
  ...dProcessor.ts |   95.61 |       80 |     100 |   95.61 | ...87-288,420-424 
  ...ndHandlers.ts |   17.68 |    27.27 |   22.22 |   17.68 | ...47-648,653-662 
  ...dPathUtils.ts |   96.87 |    92.85 |     100 |   96.87 | ...25-227,271-272 
  ...dProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...sorSupport.ts |   68.85 |    70.83 |   66.66 |   68.85 | ...81-284,302-309 
  ...tionEffect.ts |   90.44 |    84.28 |   92.85 |   90.44 | ...33-434,447-448 
  ...etionTypes.ts |       0 |        0 |       0 |       0 | 1                 
  toolMapping.ts   |   90.81 |    88.88 |   93.33 |   90.81 | ...95-207,226-228 
  ...st-helpers.ts |   75.93 |    75.86 |      24 |   75.93 | ...76-277,279-280 
  ...nateBuffer.ts |      50 |      100 |       0 |      50 | 16-18             
  ...dScrollbar.ts |   97.82 |      100 |     100 |   97.82 | 153-155           
  ...st-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |    92.5 |    89.51 |     100 |    92.5 | ...96-597,600-601 
  ...uthCommand.ts |   96.42 |    66.66 |     100 |   96.42 | 21                
  ...tIndicator.ts |     100 |     92.3 |     100 |     100 | 57                
  useBanner.ts     |     100 |    83.33 |     100 |     100 | 22,48             
  ...chedScroll.ts |   16.66 |      100 |       0 |   16.66 | 14-32             
  ...ketedPaste.ts |      20 |      100 |       0 |      20 | 20-38             
  ...ompletion.tsx |   97.24 |    82.75 |    90.9 |   97.24 | ...05-207,210-211 
  useCompletion.ts |    92.4 |     87.5 |     100 |    92.4 | 68-69,93-94,98-99 
  ...leMessages.ts |   96.15 |       90 |     100 |   96.15 | 56-57,63          
  ...ntHandlers.ts |   31.25 |      100 |     100 |   31.25 | 43-70,74-82       
  ...fileDialog.ts |   16.12 |      100 |       0 |   16.12 | 17-47             
  ...orSettings.ts |   11.86 |      100 |       0 |   11.86 | 31-87             
  ...AutoUpdate.ts |    8.33 |      100 |       0 |    8.33 | 18-64             
  ...ionUpdates.ts |   75.17 |    80.64 |   77.77 |   75.17 | ...60-261,289-303 
  ...erDetector.ts |     100 |      100 |     100 |     100 |                   
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |   84.67 |    86.95 |     100 |   84.67 | ...12-114,130-131 
  ...BranchName.ts |     100 |       95 |     100 |     100 | 54                
  ...oryManager.ts |   96.61 |    93.18 |     100 |   96.61 | ...70-171,214-215 
  ...splayState.ts |     100 |      100 |     100 |     100 |                   
  ...stListener.ts |   12.12 |      100 |       0 |   12.12 | 18-51             
  ...ivityTimer.ts |   76.19 |    66.66 |     100 |   76.19 | 30-35             
  ...putHistory.ts |    92.5 |    85.71 |     100 |    92.5 | 62-63,71,93-95    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 67                
  useKeypress.ts   |   88.88 |       75 |     100 |   88.88 | 31-32             
  ...rdProtocol.ts |       0 |        0 |       0 |       0 | 1-26              
  ...fileDialog.ts |     5.4 |      100 |       0 |     5.4 | 23-69,72-143      
  ...gIndicator.ts |     100 |      100 |     100 |     100 |                   
  useLogger.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMonitor.ts |     100 |      100 |     100 |     100 |                   
  useMouse.ts      |   77.77 |    66.66 |     100 |   77.77 | 31-34             
  useMouseClick.ts |     100 |      100 |     100 |     100 |                   
  ...eSelection.ts |     2.2 |      100 |       0 |     2.2 | 51-378,381-427    
  ...hestration.ts |     100 |      100 |     100 |     100 |                   
  ...oviderInfo.ts |       0 |        0 |       0 |       0 | 1-85              
  ...odifyTrust.ts |    9.09 |      100 |       0 |    9.09 | 43-134            
  ...raseCycler.ts |   79.72 |    73.33 |     100 |   79.72 | ...69,75-76,92-94 
  ...cySettings.ts |   85.14 |    77.77 |     100 |   85.14 | ...,75-79,109-120 
  ...Management.ts |    1.48 |      100 |       0 |    1.48 | 22-609,612-674    
  ...Completion.ts |   43.07 |    55.55 |      50 |   43.07 | ...92-305,336-345 
  ...iderDialog.ts |    5.71 |      100 |       0 |    5.71 | 39-77,80-151      
  ...lScheduler.ts |   76.42 |    97.36 |      75 |   76.42 | ...85,301-317,474 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  useResponsive.ts |     100 |      100 |     100 |     100 |                   
  ...ompletion.tsx |   69.56 |      100 |     100 |   69.56 | 45-47,51-66,78-81 
  useRewind.ts     |     100 |      100 |     100 |     100 |                   
  ...ectionList.ts |   89.78 |     89.1 |     100 |   89.78 | ...17-423,443-447 
  useSession.ts    |       0 |        0 |       0 |       0 | 1-23              
  ...ionBrowser.ts |     100 |      100 |     100 |     100 |                   
  ...serHelpers.ts |   95.79 |    85.21 |   97.36 |   95.79 | ...37-639,762-763 
  ...erKeypress.ts |   89.87 |    97.29 |   94.11 |   89.87 | 101-108,130-145   
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...hallowMemo.ts |      10 |      100 |       0 |      10 | 9-22,35-47        
  ...ellHistory.ts |   92.24 |    78.78 |     100 |   92.24 | ...82,130-131,141 
  ...Completion.ts |   97.07 |    81.25 |     100 |   97.07 | 71-73,101-102     
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-64              
  ...cessorCore.ts |   74.13 |       60 |     100 |   74.13 | ...20,157,177-204 
  ...ompletion.tsx |   96.77 |    81.39 |     100 |   96.77 | ...,93-94,340-348 
  ...leCallback.ts |     100 |      100 |     100 |     100 |                   
  ...tateAndRef.ts |   59.09 |      100 |     100 |   59.09 | 23-31             
  ...oryRefresh.ts |     100 |      100 |     100 |     100 |                   
  ...rminalSize.ts |   10.34 |      100 |       0 |   10.34 | 15-44,49-85       
  ...emeCommand.ts |    4.29 |      100 |       0 |    4.29 | 25-122,125-199    
  useTimer.ts      |    87.5 |    85.71 |     100 |    87.5 | 44-45,50-52       
  ...ntinuation.ts |   91.24 |    89.74 |     100 |   91.24 | ...27-128,154-164 
  ...ePreserver.ts |   57.14 |      100 |      80 |   57.14 | 58-76             
  ...oolsDialog.ts |    3.62 |      100 |       0 |    3.62 | 25-97,100-183     
  ...erGuidance.ts |   92.85 |    85.71 |     100 |   92.85 | 28-29             
  ...Onboarding.ts |    1.92 |      100 |       0 |    1.92 | 79-403,406-487    
  ...eMigration.ts |   11.66 |      100 |       0 |   11.66 | 15-74             
  vim.ts           |   85.73 |     87.8 |    90.9 |   85.73 | ...07-716,832-834 
 ...ks/agentStream |   82.81 |    78.54 |   82.08 |   82.81 |                   
  ...Dispatcher.ts |   47.55 |    35.55 |   56.25 |   47.55 | ...60,362,399-432 
  ...ersistence.ts |    98.3 |    95.34 |     100 |    98.3 | 160-162           
  ...tProcessor.ts |      78 |    77.77 |      80 |      78 | ...47-158,161-163 
  contextLimit.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  queryPreparer.ts |   63.63 |    46.66 |     100 |   63.63 | ...47-148,151-165 
  streamUtils.ts   |   93.43 |     87.4 |   91.66 |   93.43 | ...94-310,486-488 
  thoughtState.ts  |   93.33 |    68.75 |     100 |   93.33 | 70-71,76-77       
  ...ionHandler.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |   96.42 |    88.88 |     100 |   96.42 | 44                
  types.ts         |       0 |        0 |       0 |       0 | 1-17              
  ...ventStream.ts |   85.03 |    88.46 |      60 |   85.03 | ...73-287,306-307 
  ...gentStream.ts |     100 |      100 |      80 |     100 |                   
  ...mLifecycle.ts |   84.25 |    63.33 |      80 |   84.25 | ...31-232,261-266 
  ...hestration.ts |   99.18 |      100 |   88.88 |   99.18 | 112-113           
  ...ntHandlers.ts |   70.92 |    95.83 |   84.21 |   70.92 | ...39,448-457,516 
  ...treamState.ts |   79.53 |       50 |     100 |   79.53 | ...76,197,233-234 
  ...ubmitQuery.ts |   94.34 |    87.75 |   85.71 |   94.34 | ...81-482,504-506 
 src/ui/layouts    |   83.55 |    56.89 |   83.33 |   83.55 |                   
  ...AppLayout.tsx |   81.18 |    71.42 |   83.33 |   81.18 | ...91-205,321-359 
  ...utHelpers.tsx |   86.31 |     54.9 |   95.23 |   86.31 | ...88-789,810-838 
  ...ainContent.ts |   23.52 |      100 |       0 |   23.52 | 16-22,25-28,31-34 
 ...noninteractive |   74.07 |      100 |    7.14 |   74.07 |                   
  ...eractiveUi.ts |   74.07 |      100 |    7.14 |   74.07 | 17-19,23-24,27-28 
 src/ui/privacy    |   18.77 |        0 |       0 |   18.77 |                   
  ...acyNotice.tsx |       0 |        0 |       0 |       0 | 1-140             
  ...acyNotice.tsx |       0 |        0 |       0 |       0 | 1-59              
  ...acyNotice.tsx |   12.19 |      100 |       0 |   12.19 | 16-62             
  ...acyNotice.tsx |   35.42 |      100 |       0 |   35.42 | 77-172,180-235    
  ...acyNotice.tsx |      20 |      100 |       0 |      20 | 23-59,62-64       
  ...acyNotice.tsx |   13.04 |      100 |       0 |   13.04 | 22-73             
 src/ui/reducers   |    79.5 |    91.66 |      50 |    79.5 |                   
  appReducer.ts    |     100 |      100 |     100 |     100 |                   
  ...ionReducer.ts |       0 |        0 |       0 |       0 | 1-52              
 src/ui/state      |   52.63 |    30.76 |      50 |   52.63 |                   
  extensions.ts    |   52.63 |    30.76 |      50 |   52.63 | ...28,130,134-149 
 src/ui/themes     |   99.04 |    85.65 |   97.61 |   99.04 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |     100 |      100 |     100 |     100 |                   
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  green-screen.ts  |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  ...c-resolver.ts |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-compat.ts  |     100 |       50 |     100 |     100 | 79                
  theme-manager.ts |   88.55 |    82.81 |     100 |   88.55 | ...03-312,317-318 
  theme.ts         |   99.09 |     81.3 |   94.11 |   99.09 | 282-283,702-703   
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/types      |       0 |        0 |       0 |       0 |                   
  ...ngMetadata.ts |       0 |        0 |       0 |       0 |                   
 src/ui/utils      |   63.33 |    89.51 |   74.26 |   63.33 |                   
  ...Colorizer.tsx |    5.64 |      100 |       0 |    5.64 | ...27-168,180-249 
  ...olePatcher.ts |   72.09 |      100 |   83.33 |   72.09 | 50-61             
  ...nRenderer.tsx |   96.88 |    87.87 |     100 |   96.88 | ...69-271,275-277 
  ...wnDisplay.tsx |       5 |      100 |       0 |       5 | ...90-717,728-732 
  ...eRenderer.tsx |   11.17 |      100 |       0 |   11.17 | ...34-387,394-427 
  ...tGenerator.ts |     100 |    95.83 |   83.33 |     100 | 136               
  ...ketedPaste.ts |      60 |      100 |       0 |      60 | 13-14,17-18       
  clipboard.ts     |   97.29 |    84.61 |     100 |   97.29 | 40                
  ...boardUtils.ts |   62.44 |    76.74 |   83.33 |   62.44 | ...49-263,333-335 
  commandUtils.ts  |   93.02 |    94.44 |   96.15 |   93.02 | ...31-235,316-324 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  displayUtils.ts  |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   90.47 |    95.23 |     100 |   90.47 | 57-60             
  fuzzyFilter.ts   |     100 |    96.55 |     100 |     100 | 84                
  highlight.ts     |   77.69 |    97.29 |      60 |   77.69 | 146-172,176-181   
  ...xportUtils.ts |   98.52 |    94.11 |     100 |   98.52 | 137-138           
  ...storyItems.ts |   99.23 |    93.75 |     100 |   99.23 | 109               
  input.ts         |   84.28 |    94.44 |   66.66 |   84.28 | 73-80,106-113     
  isNarrowWidth.ts |      50 |      100 |       0 |      50 | 13-14             
  ...nUtilities.ts |   66.66 |     87.5 |     100 |   66.66 | 75-94,103-104     
  modelIdentity.ts |   99.23 |    98.18 |   84.61 |   99.23 | 169               
  mouse.ts         |   83.05 |    72.41 |     100 |   83.05 | ...94,201,214-215 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  ...opDetector.ts |       0 |        0 |       0 |       0 | 1-210             
  responsive.ts    |   73.39 |    76.66 |   83.33 |   73.39 | ...00-108,111-125 
  rewindFileOps.ts |   92.38 |    71.79 |     100 |   92.38 | ...48-251,291-295 
  ...putHandler.ts |   94.44 |    91.12 |     100 |   94.44 | ...15-316,386-387 
  ...ityManager.ts |   94.92 |    85.71 |    90.9 |   94.92 | ...28,352,380,391 
  ...alContract.ts |     100 |      100 |     100 |     100 |                   
  terminalLinks.ts |     100 |      100 |     100 |     100 |                   
  ...colCleanup.ts |   95.23 |       75 |     100 |   95.23 | 38                
  ...lSequences.ts |     100 |      100 |     100 |     100 |                   
  terminalSetup.ts |   10.72 |      100 |    7.14 |   10.72 | 80-419            
  textUtils.ts     |    93.7 |    92.15 |   88.88 |    93.7 | 20-25,156-157     
  ...Formatters.ts |       0 |        0 |       0 |       0 | 1-50              
  ...icsTracker.ts |     100 |    94.44 |     100 |     100 | 38                
  ui-sizing.ts     |      16 |      100 |       0 |      16 | 11-23,26-36       
  updateCheck.ts   |     100 |    94.11 |     100 |     100 | 35,46             
 src/utils         |   62.96 |    88.91 |   75.89 |   62.96 |                   
  ...ionContext.ts |   76.92 |       75 |     100 |   76.92 | 38-41,63-66,81-84 
  ...Formatting.ts |   94.36 |    93.75 |     100 |   94.36 | 49-50,71-72       
  bootstrap.ts     |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   68.25 |       80 |      60 |   68.25 | ...67-69,72,86-95 
  coalesce.ts      |     100 |      100 |     100 |     100 |                   
  commands.ts      |   51.78 |    71.42 |     100 |   51.78 | 25-26,57-85       
  commentJson.ts   |    92.3 |     92.5 |     100 |    92.3 | 94-102            
  ...ScopeUtils.ts |   27.58 |      100 |       0 |   27.58 | 24-41,58-86       
  ...icSettings.ts |   88.07 |    88.09 |     100 |   88.07 | ...73,85-88,91-94 
  ...arResolver.ts |   96.72 |    96.42 |     100 |   96.72 | 118-119           
  errors.ts        |   94.87 |       88 |     100 |   94.87 | 53-54,95-96       
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...lativeTime.ts |     100 |      100 |     100 |     100 |                   
  gitCommitInfo.ts |   90.27 |      100 |     100 |   90.27 | 78-80,103,110-112 
  gitUtils.ts      |   93.54 |       85 |     100 |   93.54 | 61-62,77-80       
  ...AutoUpdate.ts |   69.37 |    80.76 |   77.77 |   69.37 | ...67-268,282-347 
  ...lationInfo.ts |   99.49 |     98.3 |     100 |   99.49 | 59                
  math.ts          |   66.66 |      100 |       0 |   66.66 | 15                
  ...stentState.ts |   95.31 |    84.21 |     100 |   95.31 | 42,63-64          
  readStdin.ts     |   81.03 |    91.66 |   83.33 |   81.03 | 32-39,51-53       
  refusalNotice.ts |     100 |      100 |     100 |     100 |                   
  relaunch.ts      |     100 |      100 |     100 |     100 |                   
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  ...containers.ts |    4.86 |      100 |       0 |    4.86 | ...36-656,660-686 
  ...entrypoint.ts |    9.87 |      100 |       0 |    9.87 | 19-48,51-100      
  sandbox-env.ts   |   74.65 |    77.14 |   66.66 |   74.65 | ...52-153,161-162 
  sandbox-exec.ts  |    8.73 |      100 |    12.5 |    8.73 | 56-321,338-427    
  sandbox-image.ts |    3.96 |      100 |       0 |    3.96 | 12-128            
  ...box-podman.ts |   74.67 |    94.73 |   77.77 |   74.67 | ...50-260,326-399 
  ...x-seatbelt.ts |   28.02 |       50 |   22.22 |   28.02 | ...15-216,226-352 
  sandbox-ssh.ts   |   78.92 |    81.13 |     100 |   78.92 | ...07-308,372-376 
  sandbox.ts       |   13.23 |      100 |       0 |   13.23 | 47-111            
  ...st-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...ionCleanup.ts |   88.88 |    84.21 |     100 |   88.88 | ...42-243,326-327 
  sessionUtils.ts  |    8.86 |      100 |       0 |    8.86 | 52-122,129-143    
  settingsUtils.ts |   85.67 |    91.34 |   94.28 |   85.67 | ...61-489,528-529 
  ...ttingSaver.ts |    1.92 |      100 |       0 |    1.92 | 11-32,40-85       
  skillSettings.ts |   86.13 |       88 |     100 |   86.13 | 99-107,134-138    
  skillUtils.ts    |   71.33 |    70.96 |   83.33 |   71.33 | ...88-189,203-224 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdinSafety.ts   |   91.39 |    86.48 |     100 |   91.39 | ...66-167,170,245 
  terminalTheme.ts |     100 |      100 |     100 |     100 |                   
  typeGuards.ts    |   65.38 |      100 |      75 |   65.38 | 26-34             
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  version.ts       |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
 src/utils/privacy |   66.15 |       70 |   76.19 |   66.15 |                   
  ...taRedactor.ts |   81.91 |    71.42 |      80 |   81.91 | ...08-610,616-637 
  ...acyManager.ts |       0 |        0 |       0 |       0 | 1-176             
 ...ed-integration |   74.53 |    75.75 |   77.14 |   74.53 |                   
  ...temService.ts |     100 |      100 |     100 |     100 |                   
  ...tent-utils.ts |    8.62 |       50 |   14.28 |    8.62 | ...06-115,118-164 
  zed-helpers.ts   |      42 |    55.55 |      50 |      42 | ...59-166,168-170 
  ...h-resolver.ts |   73.33 |       56 |   96.15 |   73.33 | ...43-650,654-680 
  ...st-helpers.ts |    98.4 |      100 |   56.66 |    98.4 | 184-186           
  ...ol-handler.ts |   87.65 |     80.9 |   96.15 |   87.65 | ...16-318,365-378 
  ...ntegration.ts |   79.56 |    79.39 |   80.95 |   79.56 | ...13-814,842-844 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   79.08 |    84.14 |   76.61 |   79.08 |                   
 src               |     100 |      100 |     100 |     100 |                   
  ...-factories.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/adapters      |     100 |      100 |     100 |     100 |                   
  ...eamAdapter.ts |     100 |      100 |     100 |     100 |                   
 src/code_assist   |   80.88 |    80.57 |   82.14 |   80.88 |                   
  codeAssist.ts    |   17.24 |      100 |       0 |   17.24 | 22-44,51-59       
  ...orAdapters.ts |   92.26 |    71.11 |   88.88 |   92.26 | ...05-207,272-275 
  converter.ts     |   95.54 |    93.02 |     100 |   95.54 | 186-190,219-220   
  ...nAIWrapper.ts |     100 |      100 |     100 |     100 |                   
  ...al-storage.ts |   95.86 |    79.48 |     100 |   95.86 | 27-28,86,110,139  
  server.ts        |   48.16 |    72.72 |      50 |   48.16 | ...15-256,259-262 
  setup.ts         |   86.09 |    73.07 |     100 |   86.09 | ...57-159,183-189 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/commands      |     100 |      100 |     100 |     100 |                   
  extensions.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/config        |   70.21 |     79.9 |   58.45 |   70.21 |                   
  ...tLifecycle.ts |   80.34 |    97.05 |      80 |   80.34 | ...49-253,262-286 
  ...skServices.ts |    9.19 |      100 |       0 |    9.19 | ...5,62-80,89-129 
  config.ts        |    62.9 |    80.41 |      60 |    62.9 | ...92-801,826-846 
  configBase.ts    |   68.81 |    72.09 |   72.72 |   68.81 | ...48-255,257-261 
  ...igBaseCore.ts |   69.07 |    94.52 |   44.23 |   69.07 | ...35-836,838-839 
  ...onstructor.ts |   96.93 |    89.06 |     100 |   96.93 | ...97-498,501-502 
  ...estHarness.ts |   93.15 |    95.45 |   83.33 |   93.15 | 229-239,245-248   
  configTypes.ts   |      58 |      100 |      50 |      58 | 215-255           
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...ngsHelpers.ts |   62.16 |       40 |     100 |   62.16 | ...31,35-36,42-43 
  index.ts         |       0 |        0 |       0 |       0 | 1-41              
  ...ntegration.ts |   63.22 |    75.47 |   73.68 |   63.22 | ...17,434,443,452 
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...rSingleton.ts |   76.22 |    70.37 |   56.25 |   76.22 | ...94,397-400,408 
  ...entManager.ts |   50.76 |    68.91 |   65.21 |   50.76 | ...54-655,681-705 
  ...ingsParser.ts |   41.37 |    33.33 |     100 |   41.37 | 31-48             
  ...tryFactory.ts |   84.08 |    77.77 |   71.42 |   84.08 | ...71,465,483-499 
  types.ts         |       0 |        0 |       0 |       0 |                   
 ...nfirmation-bus |   88.88 |    66.66 |   66.66 |   88.88 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-2               
  message-bus.ts   |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   80.31 |    78.18 |    87.5 |   80.31 |                   
  ...ssionTypes.ts |       0 |        0 |       0 |       0 | 1-90              
  ...ntContract.ts |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   97.43 |    92.59 |     100 |   97.43 | 92-93             
  ...okTriggers.ts |   47.39 |     61.9 |   66.66 |   47.39 | ...51,253,299-304 
  ...igBoundary.ts |       0 |        0 |       0 |       0 | 1                 
  ...okTriggers.ts |   96.09 |    84.37 |     100 |   96.09 | ...22,161,208,250 
  logger.ts        |   78.22 |    80.19 |   94.44 |   78.22 | ...56-470,513-525 
  prompts.ts       |   84.36 |    63.29 |    91.3 |   84.36 | ...60,563,624-625 
  subagentTypes.ts |   83.11 |    68.42 |   77.77 |   83.11 | ...03-304,319-320 
  tokenLimits.ts   |     100 |      100 |     100 |     100 |                   
  ...erContract.ts |     100 |      100 |     100 |     100 |                   
  turn.ts          |     100 |      100 |     100 |     100 |                   
 ...re/compression |   29.71 |    33.33 |   14.28 |   29.71 |                   
  ...nDirective.ts |    6.25 |      100 |       0 |    6.25 | 22-62             
  types.ts         |   34.96 |    33.33 |   16.66 |   34.96 | ...20-421,434-436 
 src/debug         |   61.53 |        0 |       0 |   61.53 |                   
  ...ionManager.ts |     100 |      100 |     100 |     100 |                   
  DebugLogger.ts   |     100 |      100 |     100 |     100 |                   
  FileOutput.ts    |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |       0 |        0 |       0 |       0 | 1-6               
  ...FileOutput.ts |       0 |        0 |       0 |       0 | 1-6               
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/filters       |   97.79 |    95.58 |     100 |   97.79 |                   
  EmojiFilter.ts   |   97.79 |    95.58 |     100 |   97.79 | ...55-156,363-364 
 src/hooks         |    84.3 |    85.37 |   82.08 |    84.3 |                   
  errors.ts        |     100 |      100 |     100 |     100 |                   
  ...Aggregator.ts |   90.55 |    81.33 |    87.5 |   90.55 | ...58,377,379,381 
  ...sContracts.ts |       0 |        0 |       0 |       0 | 1                 
  ...entHandler.ts |   91.43 |     87.3 |   93.75 |   91.43 | ...50,782-788,833 
  hookPlanner.ts   |   98.79 |    93.33 |     100 |   98.79 | 103               
  hookRegistry.ts  |   97.19 |    88.31 |     100 |   97.19 | ...97,399,401,403 
  hookRunner.ts    |   84.88 |    87.14 |   86.95 |   84.88 | ...37-439,502-505 
  hookSystem.ts    |    64.2 |    88.88 |      65 |    64.2 | ...49-351,364-366 
  ...Translator.ts |   94.11 |    75.67 |     100 |   94.11 | ...68,479,524,529 
  ...Validators.ts |    92.4 |    89.83 |     100 |    92.4 | 57-59,78-80       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ssion-hook.ts |   88.88 |    33.33 |     100 |   88.88 | 24,30             
  trustedHooks.ts  |   20.77 |        0 |       0 |   20.77 | ...6,82-90,96-109 
  types.ts         |   63.63 |    89.13 |   60.71 |   63.63 | ...08-509,520-521 
 ...oks/test-utils |       0 |        0 |       0 |       0 |                   
  ...igWithHook.ts |       0 |        0 |       0 |       0 | 1-137             
 src/interfaces    |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 |                   
  ....interface.ts |       0 |        0 |       0 |       0 |                   
 src/llm-types     |   92.44 |    90.72 |   98.46 |   92.44 |                   
  afcHistory.ts    |   79.26 |    68.96 |     100 |   79.26 | ...99-100,102-103 
  ...ssageInput.ts |   86.09 |     86.2 |   97.29 |   86.09 | ...61-462,489-490 
  finishReasons.ts |   97.56 |    83.33 |     100 |   97.56 | 153-154           
  geminiContent.ts |       0 |        0 |       0 |       0 |                   
  grounding.ts     |       0 |        0 |       0 |       0 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  jsonSchema.ts    |     100 |      100 |     100 |     100 |                   
  modelEnvelope.ts |     100 |      100 |     100 |     100 |                   
  modelRequest.ts  |       0 |        0 |       0 |       0 |                   
  ...erApiError.ts |     100 |      100 |     100 |     100 |                   
  ...Embeddings.ts |       0 |        0 |       0 |       0 |                   
  toolCall.ts      |     100 |    98.14 |     100 |     100 | 216               
  ...eclaration.ts |     100 |      100 |     100 |     100 |                   
 src/models        |   89.01 |       90 |   92.68 |   89.01 |                   
  hydration.ts     |    47.1 |    64.28 |      50 |    47.1 | ...09-110,180-260 
  index.ts         |     100 |      100 |     100 |     100 |                   
  profiles.ts      |     100 |      100 |     100 |     100 |                   
  ...ntegration.ts |   95.34 |    89.74 |     100 |   95.34 | ...36-137,200-201 
  registry.ts      |   92.76 |    89.06 |      96 |   92.76 | ...72-273,399-403 
  schema.ts        |     100 |      100 |     100 |     100 |                   
  transformer.ts   |     100 |      100 |     100 |     100 |                   
 src/parsers       |   80.75 |    80.71 |   92.85 |   80.75 |                   
  ...CallParser.ts |   84.59 |     80.4 |    92.3 |   84.59 | ...09-810,813-814 
  ...rg-parsing.ts |   83.37 |    85.71 |   90.47 |   83.37 | ...23-425,501-502 
  ...ll-helpers.ts |   73.94 |     79.5 |   92.85 |   73.94 | ...07-508,514-535 
  ...rser-utils.ts |      76 |    73.33 |     100 |      76 | ...09-110,114-119 
 src/policy        |   73.02 |    76.19 |   88.46 |   73.02 |                   
  config.ts        |   68.24 |    77.19 |   86.36 |   68.24 | ...29,385,462-463 
  index.ts         |     100 |      100 |     100 |     100 |                   
  policy-engine.ts |     100 |      100 |     100 |     100 |                   
  ...cy-helpers.ts |   88.88 |    66.66 |     100 |   88.88 | 31-39             
  ...-stringify.ts |     100 |      100 |     100 |     100 |                   
  toml-loader.ts   |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
 src/prompt-config |   83.12 |    86.82 |   83.57 |   83.12 |                   
  ...lateEngine.ts |    94.7 |    89.24 |     100 |    94.7 | ...32-435,446-449 
  index.ts         |       0 |      100 |     100 |       0 | 5-42              
  prompt-cache.ts  |    99.1 |    97.43 |     100 |    99.1 | 236-237           
  ...st-helpers.ts |   77.14 |    42.85 |     100 |   77.14 | ...32,42-43,52-53 
  ...-installer.ts |   85.81 |    82.92 |   92.85 |   85.81 | ...23-827,834-835 
  prompt-loader.ts |    90.9 |    92.56 |   92.85 |    90.9 | ...13-530,540-541 
  ...t-resolver.ts |   50.38 |       84 |      50 |   50.38 | ...22-423,428-527 
  ...pt-service.ts |   85.32 |    83.18 |   80.95 |   85.32 | ...28,545-552,583 
  ...delegation.ts |   93.54 |     90.9 |     100 |   93.54 | 34-35             
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...onfig/defaults |   56.38 |    46.03 |   85.41 |   56.38 |                   
  core-defaults.ts |      48 |     41.5 |   78.57 |      48 | ...55,365,371-379 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...est-loader.ts |   81.81 |       80 |     100 |   81.81 | ...02-108,116-120 
  ...t-warnings.ts |    92.3 |    33.33 |     100 |    92.3 | 18-19             
  ...r-defaults.ts |   52.51 |    35.29 |   84.61 |   52.51 | ...24,334,340-345 
  ...e-defaults.ts |     100 |      100 |     100 |     100 |                   
  tool-defaults.ts |   55.74 |     42.3 |   84.61 |   55.74 | ...82-283,295-300 
 ...nfig/installer |   90.88 |    85.31 |     100 |   90.88 |                   
  ...operations.ts |   82.53 |    80.39 |     100 |   82.53 | ...81-285,301-302 
  ...resolution.ts |   96.63 |    92.59 |     100 |   96.63 | ...70-271,317-318 
  ...tory-utils.ts |   95.42 |    90.38 |     100 |   95.42 | ...14-117,154,175 
  file-writer.ts   |   89.47 |    76.66 |     100 |   89.47 | ...96,116,121-122 
  ...operations.ts |   97.46 |    94.44 |     100 |   97.46 | 48-49             
  ...-expansion.ts |   85.82 |    78.72 |     100 |   85.82 | ...66-167,169-170 
 ...onfig/resolver |   36.86 |    60.86 |   51.85 |   36.86 |                   
  ...ry-scanner.ts |    4.04 |      100 |       0 |    4.04 | ...98-159,163-207 
  fs-adapter.ts    |   39.06 |    66.66 |      50 |   39.06 | ...37,42-47,51-88 
  name-utils.ts    |   71.69 |       60 |   78.57 |   71.69 | ...03-204,208-218 
 src/prompts       |      30 |      100 |      25 |      30 |                   
  mcp-prompts.ts   |   28.57 |      100 |       0 |   28.57 | 11-15             
  ...t-registry.ts |   30.23 |      100 |   28.57 |   30.23 | ...43,49-56,69-74 
 src/recording     |    90.2 |    86.17 |   98.09 |    90.2 |                   
  ...ntegration.ts |    83.9 |       75 |     100 |    83.9 | ...31-132,143-144 
  ReplayEngine.ts  |   95.78 |       91 |     100 |   95.78 | ...37-342,502-509 
  ...nDiscovery.ts |   91.62 |    87.75 |     100 |   91.62 | ...44-345,360-361 
  ...ockManager.ts |   86.24 |    83.33 |     100 |   86.24 | ...18,233,260-261 
  ...ingService.ts |   82.97 |    92.45 |   95.65 |   82.97 | ...57,390-391,395 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   91.12 |       90 |   92.85 |   91.12 | 190-200,227-230   
  resumeSession.ts |   93.19 |    89.65 |     100 |   93.19 | ...10-215,246-247 
  ...eanupUtils.ts |      90 |    68.42 |     100 |      90 | ...40-241,267,280 
  ...Management.ts |   88.23 |    85.71 |     100 |   88.23 | 94,108-112        
  types.ts         |       0 |        0 |       0 |       0 |                   
 src/resources     |   95.23 |     92.3 |     100 |   95.23 |                   
  ...e-registry.ts |   95.23 |     92.3 |     100 |   95.23 | 34-35             
 src/runtime       |   85.81 |    89.19 |      82 |   85.81 |                   
  ...imeContext.ts |     100 |      100 |     100 |     100 |                   
  ...timeLoader.ts |   86.85 |    73.68 |   81.81 |   86.85 | ...14,218,244-247 
  ...ntimeState.ts |   95.66 |    90.66 |     100 |   95.66 | ...03-504,544-545 
  ...ionContext.ts |   83.54 |    93.33 |   71.42 |   83.54 | ...55-156,167-174 
  ...imeContext.ts |   75.86 |    97.82 |   63.33 |   75.86 | ...03-308,310-317 
  index.ts         |       0 |        0 |       0 |       0 | 1-19              
  ...imeContext.ts |      70 |       90 |     100 |      70 | 88-108            
  ...meAdapters.ts |    90.9 |    93.93 |   93.75 |    90.9 | 82-88,93-97       
  ...ateFactory.ts |     100 |    97.14 |     100 |     100 | 130               
  ...imeAdapter.ts |   80.55 |    85.71 |   88.88 |   80.55 | 62-69,84-85,88-93 
 ...time/contracts |       0 |        0 |       0 |       0 |                   
  ...lureReason.ts |       0 |        0 |       0 |       0 | 1                 
  ...kContracts.ts |       0 |        0 |       0 |       0 | 1                 
  ...ningOutput.ts |       0 |        0 |       0 |       0 | 1                 
  ...torFactory.ts |       0 |        0 |       0 |       0 | 1                 
  RuntimeModel.ts  |       0 |        0 |       0 |       0 | 1                 
  ...meProvider.ts |       0 |        0 |       0 |       0 | 1                 
  ...oviderChat.ts |       0 |        0 |       0 |       0 | 1                 
  ...derManager.ts |       0 |        0 |       0 |       0 | 1                 
  ...eTokenizer.ts |       0 |        0 |       0 |       0 | 1                 
  ...zerFactory.ts |       0 |        0 |       0 |       0 | 1                 
  ...tryContext.ts |       0 |        0 |       0 |       0 | 1                 
  index.ts         |       0 |        0 |       0 |       0 | 1                 
 ...runtime/errors |   94.87 |    85.71 |   66.66 |   94.87 |                   
  ...viderError.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-14              
 src/safety        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  pathValidator.ts |     100 |      100 |     100 |     100 |                   
 src/scheduler     |      90 |       80 |      50 |      90 |                   
  liveOutput.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/services      |   84.74 |    86.28 |   88.83 |   84.74 |                   
  ...ardService.ts |   94.23 |    93.75 |     100 |   94.23 | 70,74-75          
  ...utoTrigger.ts |   97.33 |    95.83 |     100 |   97.33 | 127-128           
  ...askManager.ts |   95.81 |    93.93 |     100 |   95.81 | 151-157,365-366   
  ...derService.ts |   98.98 |    97.05 |     100 |   98.98 | 173               
  ...y-analyzer.ts |   83.51 |    79.85 |   87.09 |   83.51 | ...13-641,647-648 
  ...extManager.ts |     100 |    96.29 |     100 |     100 | 63                
  ...nitization.ts |    98.7 |    96.87 |     100 |    98.7 | 172-173           
  ...eryService.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |     100 |      100 |     100 |     100 |                   
  ...ts-service.ts |      50 |      100 |       0 |      50 | 41-42,48-49       
  gitService.ts    |   86.72 |    86.95 |      80 |   86.72 | ...34-137,141-145 
  index.ts         |       0 |        0 |       0 |       0 | 1-23              
  ...ionService.ts |   96.43 |    95.08 |     100 |   96.43 | ...27-428,438-439 
  ...pExecution.ts |   88.42 |    78.57 |   83.33 |   88.42 | 65-66,92-100      
  ...lCpHelpers.ts |   87.83 |    87.75 |     100 |   87.83 | ...91,194,253-259 
  ...ionService.ts |   71.21 |    88.23 |    62.5 |   71.21 | ...83-306,365-378 
  ...utionTypes.ts |       0 |        0 |       0 |       0 | 1                 
  ...lExitGuard.ts |     100 |      100 |     100 |     100 |                   
  ...utputUtils.ts |   95.65 |    95.23 |     100 |   95.65 | 34-35             
  ...rocessKill.ts |   88.57 |    88.88 |     100 |   88.57 | 38-41             
  ...yExecution.ts |   96.15 |    93.33 |     100 |   96.15 | 110-111,132-134   
  ...PtyHelpers.ts |   87.03 |    76.19 |    87.5 |   87.03 | ...22,153-154,210 
  ...yLifecycle.ts |   87.68 |    78.12 |   94.73 |   87.68 | ...21,324,378-380 
  shellPtyState.ts |       0 |        0 |       0 |       0 | 1                 
  ...xt-tracker.ts |   94.87 |    88.88 |   85.71 |   94.87 | 54-55             
  ...er-service.ts |       0 |        0 |       0 |       0 | 1-161             
  ...er-service.ts |   68.47 |    48.48 |      80 |   68.47 | ...85-289,311-314 
 ...rvices/history |   83.97 |    87.01 |   87.83 |   83.97 |                   
  ...Converters.ts |    87.7 |    86.33 |      84 |    87.7 | ...50,427-433,491 
  HistoryEvents.ts |       0 |        0 |       0 |       0 |                   
  ...oryService.ts |   85.99 |    90.36 |   86.79 |   85.99 | ...16-717,796-797 
  IContent.ts      |   95.29 |    87.87 |     100 |   95.29 | 287-288,313-314   
  ...calToolIds.ts |   96.87 |    94.11 |     100 |   96.87 | 36-37             
  ...ebugLogger.ts |   62.41 |       68 |   85.71 |   62.41 | ...33-145,158-162 
  ...Validation.ts |     100 |      100 |     100 |     100 |                   
  ...CloneUtils.ts |   73.07 |    88.46 |   83.33 |   73.07 | ...98-101,106-118 
  ...textWindow.ts |   91.42 |    55.55 |     100 |   91.42 | 59,61-62          
  ...ryCuration.ts |     100 |      100 |     100 |     100 |                   
  ...EventTypes.ts |       0 |        0 |       0 |       0 |                   
  ...erPipeline.ts |     100 |      100 |     100 |     100 |                   
  historyQuery.ts  |   63.63 |       50 |     100 |   63.63 | 27-30             
  ...Estimation.ts |   44.68 |    82.14 |      50 |   44.68 | ...87-196,202-251 
  ...zerAdapter.ts |     100 |     87.5 |     100 |     100 | 73                
  ...malization.ts |    91.7 |    87.12 |     100 |    91.7 | ...26-431,477-485 
  ...oolPairing.ts |   98.59 |     87.5 |     100 |   98.59 | 103               
 src/skills        |   74.53 |    80.31 |   77.77 |   74.53 |                   
  ...lDiscovery.ts |     100 |      100 |     100 |     100 |                   
  skillLoader.ts   |   59.42 |    78.94 |   76.92 |   59.42 | ...16-351,363-373 
  skillManager.ts  |   89.68 |    80.88 |   77.27 |   89.68 | ...94-395,401-402 
 src/storage       |   98.69 |    96.87 |     100 |   98.69 |                   
  ...FileWriter.ts |     100 |      100 |     100 |     100 |                   
  ...nceService.ts |   98.65 |    96.87 |     100 |   98.65 | 291-292           
  ...ey-storage.ts |     100 |      100 |     100 |     100 |                   
  secure-store.ts  |     100 |      100 |     100 |     100 |                   
  sessionTypes.ts  |     100 |      100 |     100 |     100 |                   
 src/telemetry     |   15.45 |        0 |       0 |   15.45 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...-exporters.ts |       0 |        0 |       0 |       0 | 1-6               
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-17              
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-110             
  loggers.ts       |     100 |      100 |     100 |     100 |                   
  metrics.ts       |     100 |      100 |     100 |     100 |                   
  sdk.ts           |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  uiTelemetry.ts   |     100 |      100 |     100 |     100 |                   
 src/test-utils    |   53.38 |    60.56 |   23.07 |   53.38 |                   
  config.ts        |   83.45 |    88.23 |   20.83 |   83.45 | ...,94-99,176-179 
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  mock-tool.ts     |       0 |        0 |       0 |       0 | 1-159             
  ...aceContext.ts |       0 |        0 |       0 |       0 | 1-32              
  ...allOptions.ts |   81.62 |    51.61 |   54.54 |   81.62 | ...83,196,225-228 
  runtime.ts       |   47.03 |    33.33 |    8.82 |   47.03 | ...17-279,287-350 
  tools.ts         |   45.94 |    81.81 |   38.09 |   45.94 | ...15-227,230-237 
 src/todo          |   12.86 |      100 |       0 |   12.86 |                   
  todoFormatter.ts |   12.86 |      100 |       0 |   12.86 | ...03,206-219,222 
 src/tools         |   81.61 |    81.15 |      92 |   81.61 |                   
  ...ey-storage.ts |   81.61 |    81.15 |      92 |   81.61 | ...31-436,445-450 
 ...tools-adapters |   48.51 |    75.53 |   39.41 |   48.51 |                   
  ...iceAdapter.ts |   61.22 |    83.33 |    62.5 |   61.22 | ...52,55-60,65-68 
  ...iceAdapter.ts |   27.58 |      100 |      40 |   27.58 | 21-26,29-37,40-45 
  ...iceAdapter.ts |   22.58 |      100 |      40 |   22.58 | 18-25,28-43,46-47 
  ...iceAdapter.ts |   13.95 |      100 |       0 |   13.95 | ...76,79-80,83-98 
  ...BusAdapter.ts |   73.07 |     90.9 |   81.81 |   73.07 | ...02-126,145-151 
  ...iceAdapter.ts |      60 |      100 |       0 |      60 | ...27,36-37,40-41 
  ...iceAdapter.ts |   53.84 |      100 |      40 |   53.84 | 17-18,21-22,26-27 
  ...ostAdapter.ts |   19.33 |      100 |    8.69 |   19.33 | ...25-241,244-246 
  ...iceAdapter.ts |   15.58 |      100 |       0 |   15.58 | ...9,82-84,87-102 
  ...iceAdapter.ts |     100 |      100 |     100 |     100 |                   
  ...iceAdapter.ts |   55.03 |     69.9 |   68.96 |   55.03 | ...48-891,896-899 
  ...iceAdapter.ts |   76.66 |    66.66 |   57.14 |   76.66 | 49-53,56-57       
  ...ostAdapter.ts |   30.18 |      100 |   13.04 |   30.18 | ...83-189,192-193 
  ...ageAdapter.ts |   46.15 |      100 |       0 |   46.15 | ...33,36-37,40-41 
  ...ostAdapter.ts |   67.74 |      100 |   54.54 |   67.74 | ...57,60-61,64-65 
  ...iceHelpers.ts |   57.71 |       50 |      70 |   57.71 | ...95-196,200-201 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/utils         |   84.29 |    86.62 |   85.59 |   84.29 |                   
  LruCache.ts      |    82.6 |      100 |   71.42 |    82.6 | 29-30,33-34       
  asyncIterator.ts |   73.07 |    84.61 |   66.66 |   73.07 | ...71,75-86,93-94 
  bfsFileSearch.ts |   93.61 |    92.85 |     100 |   93.61 | 36-44             
  browser.ts       |    8.69 |      100 |       0 |    8.69 | 17-53             
  bunPtyAdapter.ts |   88.76 |    84.78 |   84.21 |   88.76 | ...27-532,551-554 
  channel.ts       |     100 |      100 |     100 |     100 |                   
  ...pointUtils.ts |      95 |    91.66 |     100 |      95 | 142-149           
  debugLogger.ts   |     100 |      100 |     100 |     100 |                   
  delay.ts         |     100 |      100 |     100 |     100 |                   
  editor.ts        |   95.47 |    90.38 |    90.9 |   95.47 | ...38-239,241-242 
  ...entContext.ts |     100 |      100 |     100 |     100 |                   
  errorParsing.ts  |   92.12 |     87.5 |   95.65 |   92.12 | ...87,218,302-303 
  ...rReporting.ts |   82.35 |       75 |     100 |   82.35 | ...40-142,150-155 
  errors.ts        |   70.12 |     92.3 |   31.25 |   70.12 | ...27-128,189-213 
  events.ts        |   67.54 |      100 |    64.7 |   67.54 | ...41-346,352-355 
  exitCodes.ts     |     100 |      100 |     100 |     100 |                   
  ...sionLoader.ts |   80.98 |    63.88 |   92.85 |   80.98 | ...70-171,224-232 
  fetch.ts         |   24.32 |        0 |       0 |   24.32 | 23-28,32-86,89-90 
  fileDiffUtils.ts |   94.87 |     90.9 |     100 |   94.87 | 25-26             
  fileUtils.ts     |   93.83 |    90.06 |   95.23 |   93.83 | ...00,469,503-509 
  formatters.ts    |   18.18 |      100 |       0 |   18.18 | 8-16              
  ...eUtilities.ts |   91.17 |    80.39 |   94.11 |   91.17 | ...77-381,415-425 
  ...rStructure.ts |   95.57 |    94.59 |     100 |   95.57 | ...15-216,376-381 
  getPty.ts        |   70.83 |       75 |      50 |   70.83 | 43-49             
  ...noreParser.ts |     100 |      100 |     100 |     100 |                   
  ...ineChanges.ts |       0 |        0 |       0 |       0 | 1-348             
  gitUtils.ts      |   42.55 |    71.42 |      50 |   42.55 | 32-33,40-44,53-80 
  googleErrors.ts  |   77.01 |    73.21 |     100 |   77.01 | ...08,346-347,364 
  ...uotaErrors.ts |   94.94 |    87.25 |     100 |   94.94 | ...76-277,315-316 
  ide-trust.ts     |      60 |      100 |       0 |      60 | 14-15             
  ...rePatterns.ts |     100 |    96.55 |     100 |     100 | 257               
  ...ionManager.ts |     100 |    88.88 |     100 |     100 | 24                
  ...edit-fixer.ts |       0 |        0 |       0 |       0 | 1-157             
  ...yDiscovery.ts |   84.11 |    79.85 |   82.35 |   84.11 | ...76-777,791-802 
  ...tProcessor.ts |   97.19 |    91.86 |   94.44 |   97.19 | ...11-312,406-407 
  ...Inspectors.ts |       0 |        0 |       0 |       0 | 1-39              
  output-format.ts |   64.22 |       92 |      80 |   64.22 | 239-240,250-295   
  package.ts       |     100 |      100 |     100 |     100 |                   
  ...erCoercion.ts |   80.89 |       80 |     100 |   80.89 | ...47-348,351-352 
  partUtils.ts     |   97.29 |    95.55 |     100 |   97.29 | 53-54             
  pathReader.ts    |   22.58 |      100 |       0 |   22.58 | ...22,28-29,41-60 
  paths.ts         |   83.58 |    84.33 |   78.94 |   83.58 | ...91-292,307-317 
  ...rDetection.ts |   52.05 |    78.94 |   83.33 |   52.05 | ...03-104,114-115 
  refusalNotice.ts |     100 |      100 |     100 |     100 |                   
  ...archTarget.ts |   89.58 |    69.23 |     100 |   89.58 | 45-47,65-66       
  retry.ts         |   83.76 |    86.53 |   92.59 |   83.76 | ...84-987,992-993 
  ...thResolver.ts |     100 |      100 |     100 |     100 |                   
  runtime.ts       |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  sanitization.ts  |     100 |      100 |     100 |     100 |                   
  ...aValidator.ts |   91.22 |    76.36 |     100 |   91.22 | ...51-352,368-379 
  ...r-launcher.ts |   91.15 |    81.81 |     100 |   91.15 | ...97,215,217-218 
  session.ts       |     100 |      100 |     100 |     100 |                   
  shell-parser.ts  |   87.64 |    80.53 |     100 |   87.64 | ...99-600,669-670 
  shell-utils.ts   |   85.99 |     92.7 |      88 |   85.99 | ...51-652,814-822 
  ...Completion.ts |   94.21 |    92.15 |     100 |   94.21 | 71-77             
  stdio.ts         |   83.83 |    56.52 |     100 |   83.83 | ...25-129,138-142 
  ...dleTimeout.ts |   98.48 |    94.59 |     100 |   98.48 | 131-132           
  ...amWatchdog.ts |     100 |    97.87 |   88.23 |     100 | 106               
  summarizer.ts    |   98.14 |       90 |     100 |   98.14 | 98                
  ...emEncoding.ts |   94.96 |    88.88 |     100 |   94.96 | ...10,142-143,197 
  terminal.ts      |   34.09 |      100 |       0 |   34.09 | ...55,58-59,62-66 
  ...Serializer.ts |    98.2 |    92.75 |     100 |    98.2 | ...,98-99,181-183 
  testUtils.ts     |      50 |      100 |   33.33 |      50 | ...47,53-58,64-66 
  textUtils.ts     |    12.5 |      100 |       0 |    12.5 | 15-34             
  thoughtUtils.ts  |     100 |      100 |     100 |     100 |                   
  tool-utils.ts    |   68.64 |    77.77 |      80 |   68.64 | ...34-135,156-180 
  ...putLimiter.ts |   95.14 |    81.63 |     100 |   95.14 | ...5-66,78-79,113 
  unicodeUtils.ts  |     100 |      100 |     100 |     100 |                   
  ...untManager.ts |   88.52 |    86.48 |     100 |   88.52 | ...,83-88,104-106 
  version.ts       |     100 |      100 |     100 |     100 |                   
  ...aceContext.ts |   96.85 |    95.23 |    92.3 |   96.85 | 95-96,110-111     
 ...ils/filesearch |   89.81 |    91.52 |   94.59 |   89.81 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    84.9 |    85.71 |   66.66 |    84.9 | ...12-114,128-133 
  fileSearch.ts    |   86.48 |    89.21 |     100 |   86.48 | ...11-312,360-361 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-24.x-ubuntu-latest' artifact from the main CI run.

@acoliver

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Please review the latest remediation commit. The earlier automated check was rate limited, so a substantive source review is requested.

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

@acoliver: I’ll perform a substantive review of the latest remediation commit, with particular attention to fallback correctness, redaction-before-validation/hashing, trusted-base execution, and telemetry aggregation integrity.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

OpenCodeReview — PR #2733

  • Reviewed head SHA: 5f71fbc68fd263bc8aaa1fae08aff37d2c868a7b
  • Merge base: 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range: full from 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range fallback: checkpoint-missing
  • Scope: selected 16 file(s), +5067/-227; cumulative 16 file(s), +5067/-227
  • Tokens: 0 total (0 input, 0 output, 0 cache)
  • OCR version: open-code-review v1.7.16 (a0b49d5b) linux/amd64 built at: 2026-07-24T15:49:28Z https://github.com/alibaba/open-code-review
  • Phase: review
  • Exit code: 1
  • Run: https://github.com/vybestack/llxprt-code/actions/runs/30194299073
  • OCR failed to run or parse output.
  • Artifacts: ocr-review-output contains raw JSON, stdout, stderr, preview, phase, and exit-code diagnostics.

OCR stderr excerpt

(empty)

OCR preflight excerpt

model=step-3.7-flash
provider-url=configured
Source: OCR environment
URL:    [REDACTED]
Model:  step-3.7-flash
I am open-code-review, a code review assistant developed by Alibaba, designed to assist users with code review related tasks in their command-line environment.
✓ Connection test successful

OCR preview stderr excerpt

(empty)

Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js Outdated
Comment thread scripts/aggregate-ocr-telemetry.js Outdated
Comment thread scripts/ocr-telemetry-io.js
Comment thread scripts/ocr-telemetry-io.js
Comment thread scripts/tests/ocr-telemetry-cli.test.js Outdated
Comment thread scripts/tests/ocr-telemetry-cli.test.js Outdated
Comment thread scripts/tests/ocr-telemetry.test.js
Comment thread scripts/tests/ocr-telemetry-workflow.test.js Outdated
Comment thread scripts/tests/ocr-telemetry-workflow.test.js Outdated
@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

OpenCodeReview — PR #2733

  • Reviewed head SHA: 34288221f2d97d24f9fe149eb297e070f10afcec
  • Merge base: 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range: full from 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range fallback: checkpoint-missing
  • Scope: selected 16 file(s), +5070/-227; cumulative 16 file(s), +5070/-227
  • Tokens: 1549203 total (1278084 input, 271119 output, 841856 cache)
  • OCR version: open-code-review v1.7.16 (a0b49d5b) linux/amd64 built at: 2026-07-24T15:49:28Z https://github.com/alibaba/open-code-review
  • Phase: review
  • Exit code: 0
  • Run: https://github.com/vybestack/llxprt-code/actions/runs/30194561725
  • 29 finding(s) (26 posted inline).
  • Artifacts: ocr-review-output contains raw JSON, stdout, stderr, preview, phase, and exit-code diagnostics.
  • Suppressed 12 exact duplicate finding(s).

Findings without a resolvable position

  • scripts/ocr-telemetry.js: [maintainability/medium] > The main() function mutates the input object returned by loadTelemetryInput() when the --failure flag is used (input.errors.push, input.context.infrastructureFailure = true, input.context.telemetryState = 'failed'). Mutating input parameters can cause unexpected side effects if the input object is reused or cached elsewhere. Consider creating a new object instead of mutating the existing one.
  • scripts/tests/ocr-telemetry-cli.test.js: [bug/medium] > The assertion checks for .redacting-${result.pid} but atomicWriteFile appends PID and sequence number to the temp filename (e.g., .redacting-<pid>-<seq>). This mismatch means the assertion does not actually verify that the specific temp file used by the redaction was cleaned up. Align the expected pattern with the actual temp-file naming convention, e.g., check that no file matching ${telemetryPath}.redacting-* exists.
  • scripts/tests/ocr-telemetry-workflow.test.js: [maintainability/low] > Inconsistent naming: _hashRun, _wallClockRun, _filesReviewedRun, and _finalClassificationRun use leading underscores, which often signals intentionally unused variables, yet all four are actively referenced later. This may mislead maintainers into thinking they are dead code. Consider removing the underscore prefixes or adding an explanatory comment if the project intentionally prefixes certain variables.

Shadow-mode routing preview (issue #2672)

  • 6 finding(s) would be routed to this summary instead of inline comments.
    • maintainability/low: 6
    • test/low: 1
  • Set repository variable OCR_ROUTING_SHADOW_MODE=false to enable live routing.

Comment thread .github/workflows/ocr-review.yml
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/ocr-telemetry-io.js
Comment thread scripts/ocr-telemetry-io.js
Comment thread scripts/tests/ocr-telemetry-workflow.test.js
Comment thread scripts/tests/ocr-telemetry-workflow.test.js
Comment thread scripts/tests/ocr-telemetry.test.js
Comment thread scripts/tests/ocr-telemetry.test.js Outdated
Comment thread scripts/tests/ocr-telemetry.test.js Outdated
@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

OpenCodeReview — PR #2733

  • Reviewed head SHA: 828a6569e3f2858342ce7e59e78fef121f5259e7
  • Merge base: 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range: full from 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range fallback: checkpoint-missing
  • Scope: selected 16 file(s), +5052/-227; cumulative 16 file(s), +5052/-227
  • Tokens: 2447304 total (2022593 input, 424711 output, 1503232 cache)
  • OCR version: open-code-review v1.7.16 (a0b49d5b) linux/amd64 built at: 2026-07-24T15:49:28Z https://github.com/alibaba/open-code-review
  • Phase: review
  • Exit code: 0
  • Run: https://github.com/vybestack/llxprt-code/actions/runs/30196120783
  • 25 finding(s) (25 posted inline).
  • Artifacts: ocr-review-output contains raw JSON, stdout, stderr, preview, phase, and exit-code diagnostics.
  • Suppressed 4 exact duplicate finding(s).

Shadow-mode routing preview (issue #2672)

  • 8 finding(s) would be routed to this summary instead of inline comments.
    • style/low: 1
    • maintainability/low: 4
    • test/low: 1
    • other/low: 2
  • Set repository variable OCR_ROUTING_SHADOW_MODE=false to enable live routing.

Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/aggregate-ocr-telemetry.js
Comment thread scripts/tests/ocr-telemetry-cli.test.js
Comment thread scripts/tests/ocr-telemetry-cli.test.js
Comment thread scripts/tests/ocr-telemetry-cli.test.js
Comment thread scripts/tests/ocr-telemetry-cli.test.js
Comment thread scripts/tests/ocr-telemetry.test.js
@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

OpenCodeReview — PR #2733

  • Reviewed head SHA: 4e532b4709f7c52d2df14301835a713a0c27a826
  • Merge base: 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range: full from 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range fallback: checkpoint-missing
  • Scope: selected 16 file(s), +5055/-227; cumulative 16 file(s), +5055/-227
  • Tokens: 1554807 total (1207638 input, 347169 output, 737920 cache)
  • OCR version: open-code-review v1.7.16 (a0b49d5b) linux/amd64 built at: 2026-07-24T15:49:28Z https://github.com/alibaba/open-code-review
  • Phase: review
  • Exit code: 0
  • Run: https://github.com/vybestack/llxprt-code/actions/runs/30196933317
  • 21 finding(s) (21 posted inline).
  • Artifacts: ocr-review-output contains raw JSON, stdout, stderr, preview, phase, and exit-code diagnostics.

Shadow-mode routing preview (issue #2672)

  • 3 finding(s) would be routed to this summary instead of inline comments.
    • test/low: 1
    • style/low: 1
    • maintainability/low: 1
  • Set repository variable OCR_ROUTING_SHADOW_MODE=false to enable live routing.

Comment thread .github/workflows/ocr-review.yml
Comment thread .github/workflows/ocr-review.yml
Comment thread .github/workflows/ocr-review.yml
Comment thread .github/workflows/ocr-review.yml
Comment thread scripts/aggregate-ocr-telemetry.js
Comment on lines +598 to +599
expect(telemetryUploadStep.with?.path).toBe('ocr-telemetry.json');
expect(telemetryUploadStep.with?.['if-no-files-found']).toBe('error');

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[test/medium] The test does not assert the if-no-files-found behavior for the main Upload OCR artifacts step. The workflow changed this value from warn to error, but the refactored test only checks the telemetry upload step's if-no-files-found. Add an assertion for uploadStep.with?.['if-no-files-found'] to preserve coverage of this behavioral change.

Comment on lines +602 to 608
it('creates non-telemetry placeholders before producing telemetry', () => {
const placeholderRun = commandText(
stepNamed(codeReviewJob, 'Ensure OCR artifact placeholders exist'),
);
for (const artifact of uploadStep.with?.path.trim().split(/\s+/) ?? []) {
expect(placeholderRun).toContain(artifact);
}
expect(placeholderRun).toContain('ocr-routing-decisions.json');
expect(placeholderRun).not.toContain('ocr-telemetry.json');
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[test/low] The refactored placeholder test no longer verifies that every non-telemetry artifact in the upload list has a corresponding placeholder. The old test iterated over all artifacts and asserted each one was present in the placeholder script. The new test only checks two artifacts (ocr-routing-decisions.json included, ocr-telemetry.json excluded). Consider restoring a loop-based assertion over the full upload artifact list to ensure the placeholder step stays synchronized with the upload step.

Comment on lines +59 to +63
afterEach(() => {
while (temporaryDirectories.length > 0) {
fs.rmSync(temporaryDirectories.pop(), { recursive: true, force: true });
}
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[style/low] Use a for...of loop instead of while (temporaryDirectories.length > 0) with pop() for the temporary directory cleanup. The for...of pattern is more idiomatic and readable for iterating over an array to perform cleanup actions.

Comment on lines +24 to +32
let _hashRun;
let uploadStep;
let telemetryUploadStep;
let wallClockStep;
let _wallClockRun;
let filesReviewedStep;
let _filesReviewedRun;
let finalClassificationStep;
let _finalClassificationRun;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[style/low] Variables _hashRun, _wallClockRun, _filesReviewedRun, and _finalClassificationRun use underscore prefixes which conventionally indicate intentionally unused variables, yet they are actively referenced in assertions. This naming pattern may trigger lint warnings and misleads readers about variable usage intent. Rename them to remove the underscore prefix (e.g., hashRun, wallClockRun) since they are read in test bodies.

Comment on lines +38 to +41
telemetryStep = stepNamed(
codeReviewJob,
'Emit OCR telemetry (issue #2676)',
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[maintainability/low] The step name 'Emit OCR telemetry (issue #2676)' hardcodes a business issue number. While this aids traceability in the GitHub Actions UI, it creates maintenance overhead if issue tracking references change and conflicts with the guideline against hardcoding business numbers. Consider extracting the issue reference to a constant or making it optional, or reference the issue in a comment rather than the step display name.

@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

OpenCodeReview — PR #2733

  • Reviewed head SHA: 682c33b0bb1d6320a23def427ed921a305e4fdc8
  • Merge base: 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range: full from 89b3561aff73dd239fabcf6e443ff9a073511b70
  • Range fallback: checkpoint-missing
  • Scope: selected 17 file(s), +5086/-227; cumulative 17 file(s), +5086/-227
  • Tokens: 1250954 total (1009015 input, 241939 output, 587392 cache)
  • OCR version: open-code-review v1.7.16 (a0b49d5b) linux/amd64 built at: 2026-07-24T15:49:28Z https://github.com/alibaba/open-code-review
  • Phase: review
  • Exit code: 0
  • Run: https://github.com/vybestack/llxprt-code/actions/runs/30198188617
  • 16 finding(s) (15 posted inline).
  • Artifacts: ocr-review-output contains raw JSON, stdout, stderr, preview, phase, and exit-code diagnostics.

Findings without a resolvable position

  • scripts/tests/ocr-telemetry-workflow.test.js: [maintainability/medium] > Tests are extremely brittle due to hardcoded step display names and exact ordering assertions. Any workflow refactoring (renaming steps, reordering, or inserting new steps) will cause multiple unrelated tests to fail simultaneously, increasing maintenance burden and discouraging legitimate workflow improvements. Consider identifying steps by stable id fields rather than display names, and reduce the number of ordering assertions to only the critical ones that enforce actual business requirements.

Shadow-mode routing preview (issue #2672)

  • 5 finding(s) would be routed to this summary instead of inline comments.
    • test/low: 2
    • style/low: 2
    • maintainability/low: 1
  • Set repository variable OCR_ROUTING_SHADOW_MODE=false to enable live routing.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (5)
scripts/tests/aggregate-ocr-telemetry.test.js (1)

492-546: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Pure aggregation tests nested inside the CLI contract suite. These three cases don't touch the CLI and inherit the CLI suite's temp-directory beforeAll/afterAll. Moving this describe to the top level keeps the suite boundaries meaningful.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/tests/aggregate-ocr-telemetry.test.js` around lines 492 - 546, Move
the “aggregateTelemetry — mixed evidence and epoch ordering” describe block out
of the CLI contract suite and place it at the top level of the test file. Keep
all three aggregation tests unchanged while ensuring they no longer inherit the
CLI suite’s temporary-directory beforeAll/afterAll hooks.
scripts/tests/ocr-telemetry-lifecycle.test.js (1)

295-318: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Only rejection paths are covered for the wall-clock step. All three cases expect null; a valid epoch-millisecond marker producing a finite nonnegative wall_clock_seconds is never exercised, so a regression that always emits an empty value would pass.

💚 Proposed addition
+  it('computes a nonnegative duration from a valid start marker', () => {
+    const directory = temporaryDirectory('ocr-wall-clock-valid-');
+    fs.writeFileSync(
+      path.join(directory, 'ocr_wall_clock_start.txt'),
+      String(Date.now() - 2000),
+    );
+    const output = path.join(directory, 'github-output.txt');
+    const result = runShell(
+      commandText(stepNamed(codeReviewJob, 'Capture OCR wall-clock')),
+      directory,
+      { GITHUB_OUTPUT: output },
+    );
+    expect(result.status, result.stderr).toBe(0);
+    const value = fs
+      .readFileSync(output, 'utf8')
+      .match(/^wall_clock_seconds=(.*)$/m)?.[1];
+    expect(Number(value)).toBeGreaterThanOrEqual(2);
+  });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/tests/ocr-telemetry-lifecycle.test.js` around lines 295 - 318, Add a
successful-case assertion alongside the rejection cases in the wall-clock
lifecycle test, using a valid epoch-millisecond marker and verifying that the
Capture OCR wall-clock step emits a finite, nonnegative wall_clock_seconds
value. Keep the existing corrupt-marker coverage unchanged.
scripts/tests/ocr-review-workflow-behaviors.test.js (1)

126-140: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Lost coverage for the pre-write placeholder. The workflow still overwrites the source file with '[REDACTION-PENDING]\n' before staging the redacted temp (.github/workflows/ocr-review.yml Line 3154) — that write is what prevents an unredacted file from surviving a mid-step crash. With that assertion removed, the guard can be dropped without any test failing.

💚 Proposed addition
     expectContainsAll(redactRun, [
+      "fs.writeFileSync(fileName, '[REDACTION-PENDING]\\n')",
       'const temporary = `${fileName}.redacting`',
       'fs.writeFileSync(temporary, redact(original))',
       'fs.renameSync(temporary, fileName)',
     ]);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/tests/ocr-review-workflow-behaviors.test.js` around lines 126 - 140,
Update the Behavior 4 test in the test case around redactRun to assert that the
workflow writes '[REDACTION-PENDING]\n' to the source file before creating or
writing the temporary redaction file. Verify this pre-write occurs before
fs.writeFileSync(temporary, redact(original)), while preserving the existing
atomic rename assertions.
scripts/tests/ocr-telemetry-workflow.test.js (1)

24-32: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Underscore-prefixed names are actually used. _hashRun, _wallClockRun, _filesReviewedRun, and _finalClassificationRun are all read later (Lines 243, 258, 282, 304); the _ prefix conventionally signals "intentionally unused" and now misleads readers (and any unused-var tooling).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/tests/ocr-telemetry-workflow.test.js` around lines 24 - 32, Rename
the underscore-prefixed variables _hashRun, _wallClockRun, _filesReviewedRun,
and _finalClassificationRun to non-underscored names, and update every later
reference to each variable accordingly while leaving the other step variables
unchanged.
.github/workflows/ocr-review.yml (1)

3240-3285: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated schema shape risks silent drift. This inline fallback record hand-mirrors the full RECORD_KEYS set from scripts/ocr-telemetry-schema.js; any future field added/renamed there will not be reflected here, and the divergence only surfaces at the "Validate redacted OCR telemetry" step (which, in this branch, cannot fall back to the producer either). The behavior stays fail-closed, so this is a maintainability concern rather than a live defect — a schema-key comment or a test asserting this literal against RECORD_KEYS would prevent the drift.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ocr-review.yml around lines 3240 - 3285, Add a
maintainability guard for the inline fallback record in the Node heredoc:
document that its keys must mirror RECORD_KEYS from
scripts/ocr-telemetry-schema.js, and add a test or validation that compares this
literal’s key set with RECORD_KEYS so added or renamed schema fields fail
explicitly. Keep the existing fail-closed fallback behavior unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ocr-review.yml:
- Around line 1211-1215: Update the comment above the node command in the OCR
invocation setup to state that Date.now() writes epoch milliseconds, while
preserving the existing command and the consumer’s division by 1000.
- Around line 2897-2908: Update the post_state derivation near
core.setOutput('post_state', postState) to account for sticky-summary
publication failure: when the summary post was not created and publicationState
remains 'ambiguous' with summaryComment null, report a failed or equivalent
non-success state instead of 'posted'. Preserve the existing RANGE_MODE, ran,
policyFailure, and failedInline distinctions for other outcomes, and reuse the
existing summary publication state symbols.
- Around line 3436-3448: Update the upload-state validation block to include the
outcome of the telemetry artifact upload step,
`steps.upload-ocr-telemetry.outcome`, alongside
`steps.upload-ocr-artifacts.outcome`. Set `upload_state="failed"` and
`infrastructure_failure="true"` when either upload fails or is skipped; retain
`uploaded` only when both outcomes are successful.

In `@scripts/aggregate-ocr-telemetry.js`:
- Around line 147-158: Update detectDuplicates so records with run_id set to
null bypass duplicate detection and do not share the null identity key; retain
the existing duplicate error behavior for records with a non-null run_id and
run_attempt identity.

In `@scripts/ocr-telemetry.js`:
- Around line 294-306: In scripts/ocr-telemetry.js lines 294-306, update
identityFields to lowercase and hex-validate context.sha, returning null for
invalid values using the existing buildGuaranteedTelemetry guard. Also update
the artifact mapping at scripts/ocr-telemetry.js lines 371-378 to restrict
completeness and publication_state to their schema enum sets, return null for
unknown values, and remove the always-null primary argument from terminalValue.
- Around line 489-498: Update crossText to return the same “none” fallback used
by distributionText when by_category_severity is empty, while preserving the
existing formatted output for non-empty distributions.

In `@scripts/tests/ocr-telemetry-schema.test.js`:
- Around line 125-129: Update the __proto__ case in the isOwnNumericDistribution
test to construct a real own "__proto__" property using JSON.parse, rather than
an object literal that changes the prototype; keep the constructor and prototype
rejection assertions unchanged.

---

Nitpick comments:
In @.github/workflows/ocr-review.yml:
- Around line 3240-3285: Add a maintainability guard for the inline fallback
record in the Node heredoc: document that its keys must mirror RECORD_KEYS from
scripts/ocr-telemetry-schema.js, and add a test or validation that compares this
literal’s key set with RECORD_KEYS so added or renamed schema fields fail
explicitly. Keep the existing fail-closed fallback behavior unchanged.

In `@scripts/tests/aggregate-ocr-telemetry.test.js`:
- Around line 492-546: Move the “aggregateTelemetry — mixed evidence and epoch
ordering” describe block out of the CLI contract suite and place it at the top
level of the test file. Keep all three aggregation tests unchanged while
ensuring they no longer inherit the CLI suite’s temporary-directory
beforeAll/afterAll hooks.

In `@scripts/tests/ocr-review-workflow-behaviors.test.js`:
- Around line 126-140: Update the Behavior 4 test in the test case around
redactRun to assert that the workflow writes '[REDACTION-PENDING]\n' to the
source file before creating or writing the temporary redaction file. Verify this
pre-write occurs before fs.writeFileSync(temporary, redact(original)), while
preserving the existing atomic rename assertions.

In `@scripts/tests/ocr-telemetry-lifecycle.test.js`:
- Around line 295-318: Add a successful-case assertion alongside the rejection
cases in the wall-clock lifecycle test, using a valid epoch-millisecond marker
and verifying that the Capture OCR wall-clock step emits a finite, nonnegative
wall_clock_seconds value. Keep the existing corrupt-marker coverage unchanged.

In `@scripts/tests/ocr-telemetry-workflow.test.js`:
- Around line 24-32: Rename the underscore-prefixed variables _hashRun,
_wallClockRun, _filesReviewedRun, and _finalClassificationRun to non-underscored
names, and update every later reference to each variable accordingly while
leaving the other step variables unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2641e8cf-c506-48c5-87fe-4e9cd5ad12a4

📥 Commits

Reviewing files that changed from the base of the PR and between 9783f8c and 682c33b.

📒 Files selected for processing (17)
  • .github/workflows/ocr-review.yml
  • package.json
  • scripts/aggregate-ocr-telemetry.js
  • scripts/ocr-telemetry-io.js
  • scripts/ocr-telemetry-schema.js
  • scripts/ocr-telemetry.js
  • scripts/tests/aggregate-ocr-telemetry.test.js
  • scripts/tests/ocr-review-incremental-checkpoint.test.js
  • scripts/tests/ocr-review-workflow-behaviors.test.js
  • scripts/tests/ocr-review-workflow-features.test.js
  • scripts/tests/ocr-review-workflow.test.js
  • scripts/tests/ocr-reviewed-range-manifest-wiring.test.js
  • scripts/tests/ocr-telemetry-cli.test.js
  • scripts/tests/ocr-telemetry-lifecycle.test.js
  • scripts/tests/ocr-telemetry-schema.test.js
  • scripts/tests/ocr-telemetry-workflow.test.js
  • scripts/tests/ocr-telemetry.test.js

Comment on lines +1211 to +1215
# Issue #2676: capture the authoritative wall-clock start for the OCR
# invocation under both success and failure paths. Written as epoch
# seconds so the Capture OCR wall-clock step can compute a finite,
# nonnegative duration.
node -e 'process.stdout.write(String(Date.now()))' > ocr_wall_clock_start.txt

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Comment contradicts the value actually written. Date.now() writes epoch milliseconds, but the comment says "epoch seconds". The consumer at Line 1333 divides by 1000, so behavior is correct — only the comment is wrong, and it invites a "fix" that would inflate wall_clock_seconds 1000×.

📝 Proposed comment fix
-          # invocation under both success and failure paths. Written as epoch
-          # seconds so the Capture OCR wall-clock step can compute a finite,
-          # nonnegative duration.
+          # invocation under both success and failure paths. Written as epoch
+          # milliseconds (Date.now()); the Capture OCR wall-clock step divides
+          # by 1000 to produce a finite, nonnegative duration in seconds.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Issue #2676: capture the authoritative wall-clock start for the OCR
# invocation under both success and failure paths. Written as epoch
# seconds so the Capture OCR wall-clock step can compute a finite,
# nonnegative duration.
node -e 'process.stdout.write(String(Date.now()))' > ocr_wall_clock_start.txt
# Issue `#2676`: capture the authoritative wall-clock start for the OCR
# invocation under both success and failure paths. Written as epoch
# milliseconds (Date.now()); the Capture OCR wall-clock step divides
# by 1000 to produce a finite, nonnegative duration in seconds.
node -e 'process.stdout.write(String(Date.now()))' > ocr_wall_clock_start.txt
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ocr-review.yml around lines 1211 - 1215, Update the
comment above the node command in the OCR invocation setup to state that
Date.now() writes epoch milliseconds, while preserving the existing command and
the consumer’s division by 1000.

Comment on lines +2897 to +2908
// Issue #2676: expose the Post OCR results lifecycle state so the
// telemetry record can truthfully distinguish posted/noop/failed
// post outcomes. Derived from ran + range mode, not invented.
let postState = 'posted';
if (process.env.RANGE_MODE === 'noop') {
postState = 'noop';
} else if (!ran) {
postState = policyFailure ? 'policy-failed' : 'failed';
} else if (failedInline > 0) {
postState = 'partial';
}
core.setOutput('post_state', postState);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

post_state reports posted when the sticky-summary post failed. The summary failure at Lines 2821-2823 is swallowed and leaves publicationState = 'ambiguous' with summaryComment === null, yet this derivation only inspects RANGE_MODE, ran, and failedInline. A run whose summary comment never landed is therefore recorded as a clean posted in telemetry — exactly the kind of publication-routing signal issue #2676 is meant to capture.

🐛 Proposed fix
             let postState = 'posted';
             if (process.env.RANGE_MODE === 'noop') {
               postState = 'noop';
             } else if (!ran) {
               postState = policyFailure ? 'policy-failed' : 'failed';
-            } else if (failedInline > 0) {
+            } else if (failedInline > 0 || publicationState !== 'complete') {
               postState = 'partial';
             }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Issue #2676: expose the Post OCR results lifecycle state so the
// telemetry record can truthfully distinguish posted/noop/failed
// post outcomes. Derived from ran + range mode, not invented.
let postState = 'posted';
if (process.env.RANGE_MODE === 'noop') {
postState = 'noop';
} else if (!ran) {
postState = policyFailure ? 'policy-failed' : 'failed';
} else if (failedInline > 0) {
postState = 'partial';
}
core.setOutput('post_state', postState);
// Issue `#2676`: expose the Post OCR results lifecycle state so the
// telemetry record can truthfully distinguish posted/noop/failed
// post outcomes. Derived from ran + range mode, not invented.
let postState = 'posted';
if (process.env.RANGE_MODE === 'noop') {
postState = 'noop';
} else if (!ran) {
postState = policyFailure ? 'policy-failed' : 'failed';
} else if (failedInline > 0 || publicationState !== 'complete') {
postState = 'partial';
}
core.setOutput('post_state', postState);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ocr-review.yml around lines 2897 - 2908, Update the
post_state derivation near core.setOutput('post_state', postState) to account
for sticky-summary publication failure: when the summary post was not created
and publicationState remains 'ambiguous' with summaryComment null, report a
failed or equivalent non-success state instead of 'posted'. Preserve the
existing RANGE_MODE, ran, policyFailure, and failedInline distinctions for other
outcomes, and reuse the existing summary publication state symbols.

Comment on lines +3436 to +3448
upload_outcome="${{ steps.upload-ocr-artifacts.outcome }}"
telemetry_state="complete"
hash_state="prepared"
upload_state="uploaded"
if [ "$post_outcome" != "success" ] || [ -z "$post_state" ] || [ "$post_state" = "failed" ]; then
post_state="failed"
infrastructure_failure="true"
fi
if [ "$post_state" = "policy-failed" ]; then policy_failure="true"; infrastructure_failure="true"; fi
if [ "$source_redaction_outcome" != "success" ]; then infrastructure_failure="true"; fi
if [ "$telemetry_valid" != "true" ]; then telemetry_state="failed"; infrastructure_failure="true"; fi
if [ "$hash_valid" != "true" ]; then hash_state="failed"; infrastructure_failure="true"; fi
if [ "$upload_outcome" != "success" ]; then upload_state="failed"; infrastructure_failure="true"; fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

upload_state ignores the telemetry artifact upload. Only steps.upload-ocr-artifacts.outcome is consulted; a failed or skipped upload-ocr-telemetry (the primary #2676 deliverable) still yields upload_state=uploaded and no infrastructure failure.

🐛 Proposed fix
           upload_outcome="${{ steps.upload-ocr-artifacts.outcome }}"
+          telemetry_upload_outcome="${{ steps.upload-ocr-telemetry.outcome }}"
@@
-          if [ "$upload_outcome" != "success" ]; then upload_state="failed"; infrastructure_failure="true"; fi
+          if [ "$upload_outcome" != "success" ] || [ "$telemetry_upload_outcome" != "success" ]; then
+            upload_state="failed"
+            infrastructure_failure="true"
+          fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
upload_outcome="${{ steps.upload-ocr-artifacts.outcome }}"
telemetry_state="complete"
hash_state="prepared"
upload_state="uploaded"
if [ "$post_outcome" != "success" ] || [ -z "$post_state" ] || [ "$post_state" = "failed" ]; then
post_state="failed"
infrastructure_failure="true"
fi
if [ "$post_state" = "policy-failed" ]; then policy_failure="true"; infrastructure_failure="true"; fi
if [ "$source_redaction_outcome" != "success" ]; then infrastructure_failure="true"; fi
if [ "$telemetry_valid" != "true" ]; then telemetry_state="failed"; infrastructure_failure="true"; fi
if [ "$hash_valid" != "true" ]; then hash_state="failed"; infrastructure_failure="true"; fi
if [ "$upload_outcome" != "success" ]; then upload_state="failed"; infrastructure_failure="true"; fi
upload_outcome="${{ steps.upload-ocr-artifacts.outcome }}"
telemetry_upload_outcome="${{ steps.upload-ocr-telemetry.outcome }}"
telemetry_state="complete"
hash_state="prepared"
upload_state="uploaded"
if [ "$post_outcome" != "success" ] || [ -z "$post_state" ] || [ "$post_state" = "failed" ]; then
post_state="failed"
infrastructure_failure="true"
fi
if [ "$post_state" = "policy-failed" ]; then policy_failure="true"; infrastructure_failure="true"; fi
if [ "$source_redaction_outcome" != "success" ]; then infrastructure_failure="true"; fi
if [ "$telemetry_valid" != "true" ]; then telemetry_state="failed"; infrastructure_failure="true"; fi
if [ "$hash_valid" != "true" ]; then hash_state="failed"; infrastructure_failure="true"; fi
if [ "$upload_outcome" != "success" ] || [ "$telemetry_upload_outcome" != "success" ]; then
upload_state="failed"
infrastructure_failure="true"
fi
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ocr-review.yml around lines 3436 - 3448, Update the
upload-state validation block to include the outcome of the telemetry artifact
upload step, `steps.upload-ocr-telemetry.outcome`, alongside
`steps.upload-ocr-artifacts.outcome`. Set `upload_state="failed"` and
`infrastructure_failure="true"` when either upload fails or is skipped; retain
`uploaded` only when both outcomes are successful.

Comment on lines +147 to +158
function detectDuplicates(sorted) {
const seen = new Set();
for (const record of sorted) {
const key = `${record.run_id}\u0000${record.run_attempt}`;
if (seen.has(key)) {
throw new Error(
`duplicate (run_id=${record.run_id}, run_attempt=${record.run_attempt}) records are not allowed without an explicit retry policy`,
);
}
seen.add(key);
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Null identity records collide as duplicates.

The schema permits run_id: null / run_attempt: null, and buildGuaranteedTelemetry returns the candidate unchanged when it validates — so two genuinely distinct runs with unavailable identity both key to null\u0000null and abort the entire aggregation. Consider skipping duplicate detection when run_id is null, or extending the key with generated_at.

🩹 Proposed fix
 function detectDuplicates(sorted) {
   const seen = new Set();
   for (const record of sorted) {
+    if (record.run_id === null) continue;
     const key = `${record.run_id}\u0000${record.run_attempt}`;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function detectDuplicates(sorted) {
const seen = new Set();
for (const record of sorted) {
const key = `${record.run_id}\u0000${record.run_attempt}`;
if (seen.has(key)) {
throw new Error(
`duplicate (run_id=${record.run_id}, run_attempt=${record.run_attempt}) records are not allowed without an explicit retry policy`,
);
}
seen.add(key);
}
}
function detectDuplicates(sorted) {
const seen = new Set();
for (const record of sorted) {
if (record.run_id === null) continue;
const key = `${record.run_id}\u0000${record.run_attempt}`;
if (seen.has(key)) {
throw new Error(
`duplicate (run_id=${record.run_id}, run_attempt=${record.run_attempt}) records are not allowed without an explicit retry policy`,
);
}
seen.add(key);
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/aggregate-ocr-telemetry.js` around lines 147 - 158, Update
detectDuplicates so records with run_id set to null bypass duplicate detection
and do not share the null identity key; retain the existing duplicate error
behavior for records with a non-null run_id and run_attempt identity.

Comment thread scripts/ocr-telemetry.js
Comment on lines +294 to +306
function identityFields(context) {
const normalizedPrNumber = nullableCount(context.prNumber);
return {
run_id: nullableString(context.runId),
run_attempt: normalizeRunAttempt(context.runAttempt),
pr_number:
normalizedPrNumber !== null && normalizedPrNumber > 0
? normalizedPrNumber
: null,
sha: nullableString(context.sha),
generated_at: normalizeTimestamp(context.generatedAt),
};
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Unnormalized field passthrough in buildRecord discards entire records. Several fields are copied straight from context/artifacts into schema-constrained slots; one bad value invalidates the candidate and buildGuaranteedTelemetry replaces every real metric with the empty failed fallback. Normalize per field so a single malformed input degrades only that field.

  • scripts/ocr-telemetry.js#L294-L306: lowercase and hex-validate sha in identityFields (the same guard buildGuaranteedTelemetry already applies), emitting null when it doesn't match.
  • scripts/ocr-telemetry.js#L371-L378: constrain completeness and publication_state to the schema enum sets, emitting null for unrecognized artifact values; also drop the always-null primary argument in the terminalValue call.
📍 Affects 1 file
  • scripts/ocr-telemetry.js#L294-L306 (this comment)
  • scripts/ocr-telemetry.js#L371-L378
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/ocr-telemetry.js` around lines 294 - 306, In scripts/ocr-telemetry.js
lines 294-306, update identityFields to lowercase and hex-validate context.sha,
returning null for invalid values using the existing buildGuaranteedTelemetry
guard. Also update the artifact mapping at scripts/ocr-telemetry.js lines
371-378 to restrict completeness and publication_state to their schema enum
sets, return null for unknown values, and remove the always-null primary
argument from terminalValue.

Comment thread scripts/ocr-telemetry.js
Comment on lines +489 to +498
function crossText(findings) {
if (!findings) return 'n/a';
return Object.entries(findings.by_category_severity)
.flatMap(([category, severities]) =>
Object.entries(severities).map(
([severity, count]) => `${category}×${severity}: ${count}`,
),
)
.join(', ');
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

crossText renders an empty string for an empty distribution.

distributionText falls back to none, but crossText returns '' when by_category_severity is empty (zero findings), producing a dangling category×severity — line in the step summary.

🩹 Proposed fix
     .flatMap(([category, severities]) =>
       Object.entries(severities).map(
         ([severity, count]) => `${category}×${severity}: ${count}`,
       ),
     )
-    .join(', ');
+    .join(', ') || 'none';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function crossText(findings) {
if (!findings) return 'n/a';
return Object.entries(findings.by_category_severity)
.flatMap(([category, severities]) =>
Object.entries(severities).map(
([severity, count]) => `${category}×${severity}: ${count}`,
),
)
.join(', ');
}
function crossText(findings) {
if (!findings) return 'n/a';
return Object.entries(findings.by_category_severity)
.flatMap(([category, severities]) =>
Object.entries(severities).map(
([severity, count]) => `${category}×${severity}: ${count}`,
),
)
.join(', ') || 'none';
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/ocr-telemetry.js` around lines 489 - 498, Update crossText to return
the same “none” fallback used by distributionText when by_category_severity is
empty, while preserving the existing formatted output for non-empty
distributions.

Comment on lines +125 to +129
it('rejects __proto__/constructor/prototype keys', () => {
expect(isOwnNumericDistribution({ __proto__: { x: 1 } })).toBe(false);
expect(isOwnNumericDistribution({ constructor: 1 })).toBe(false);
expect(isOwnNumericDistribution({ prototype: 1 })).toBe(false);
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm how isOwnNumericDistribution treats an empty own-key object and
# a real own __proto__ key, to validate the assertion above.
fd -t f 'ocr-telemetry-schema.js' scripts --exec ast-grep outline {} --match 'isOwnNumericDistribution|UNSAFE_KEYS' --view expanded

Repository: vybestack/llxprt-code

Length of output: 316


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== scripts/ocr-telemetry-schema.js (relevant slice) ==\n'
cat -n scripts/ocr-telemetry-schema.js | sed -n '100,180p'

printf '\n== scripts/tests/ocr-telemetry-schema.test.js (relevant slice) ==\n'
cat -n scripts/tests/ocr-telemetry-schema.test.js | sed -n '115,135p'

printf '\n== JS semantics probe for object-literal __proto__ ==\n'
node - <<'JS'
const a = { __proto__: { x: 1 } };
console.log('own keys:', Object.keys(a));
console.log('prototype has x:', Object.getPrototypeOf(a).x);
console.log('hasOwnProperty("__proto__"):', Object.prototype.hasOwnProperty.call(a, '__proto__'));
JS

Repository: vybestack/llxprt-code

Length of output: 4801


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== scripts/ocr-telemetry-schema.js (top slice for isPlainObject) ==\n'
cat -n scripts/ocr-telemetry-schema.js | sed -n '1,110p'

Repository: vybestack/llxprt-code

Length of output: 3721


Use a real own __proto__ key here { __proto__: { x: 1 } } changes the prototype, so this assertion only covers the plain-object check. If the goal is to exercise the unsafe-key path, switch it to JSON.parse('{"__proto__":1}').

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/tests/ocr-telemetry-schema.test.js` around lines 125 - 129, Update
the __proto__ case in the isOwnNumericDistribution test to construct a real own
"__proto__" property using JSON.parse, rather than an object literal that
changes the prototype; keep the constructor and prototype rejection assertions
unchanged.

@acoliver

Copy link
Copy Markdown
Collaborator Author

Evaluated the non-positioned workflow-test finding against the source. The step names and ordering assertions are intentional behavioral contracts for trusted-base execution, redaction-before-validation/hashing, source artifact gating, and lifecycle classification boundaries. Replacing those contracts with generic IDs or broadly removing ordering assertions would allow security- and integrity-relevant workflow reordering regressions. No source change is warranted.

@acoliver
acoliver merged commit 40d2a5c into main Jul 26, 2026
38 of 39 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

maintainer:e2e:ok Trusted contributor; maintainer-approved E2E run

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add structured telemetry extraction from OCR result for longitudinal quality analysis

1 participant