perf(tests): reduce CI suite runtime - #2165
Conversation
|
Warning Review limit reached
Next review available in: 34 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughテストランナーでunitとperfを並列実行対象にし、smokeとserialテストを直列実行対象として明確化した。サイズ集計を実行済みファイルに限定し、カバレッジ台帳とserialテスト参照を更新した。 Changesテスト実行基盤の更新
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 8f45ea3. Configure here.
3d60342 to
19350a6
Compare
There was a problem hiding this comment.
Actionable comments posted: 36
🤖 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 `@docs/reference/09-testing.md`:
- Line 511: Update the “What stays serial” paragraph in the testing
documentation to explicitly state that files whose names contain `.serial.` run
serially, while preserving the existing statement that they run before their
tier’s parallel band and keeping the English wording aligned with the Japanese
documentation.
In `@tests/e2e/t-exec-codex-kernel.serial.test.ts`:
- Around line 55-61: Update the expectation in the Codex kernel test around the
recorded result to also validate adapterId as "codex", matching the acceptance
criteria used by the Claude SDK test while preserving the existing ok, kind, and
outcome assertions.
In `@tests/harness/claude-print-live.ts`:
- Around line 25-60: Extract the duplicated Claude preflight sequence from
claudePrintLiveRequirementsSkipReason in tests/harness/claude-print-live.ts and
the corresponding flow in tests/harness/claude-tui-live.ts into a shared helper
such as claudeFamilyRequirementsSkipReason, parameterized by capability,
required help flags, and any additional checks or diagnostics. Update
tests/harness/claude-print-live.ts:25-60 to use the helper, and update
tests/harness/claude-tui-live.ts:24-52 likewise while retaining tmux validation
only in the TUI-specific path; preserve the existing validation order and
behavior.
In `@tests/harness/claude-sdk-live.ts`:
- Around line 15-26: Remove the unused required claudeBin property from
ClaudeSdkLiveRequirements and update tests/harness/claude-sdk-live.ts lines
15-26 accordingly. In tests/e2e/t-claude-sdk-kernel.serial.test.ts lines 22-29,
remove the CLAUDE_BIN constant and stop passing claudeBin to
claudeSdkLiveRequirementsSkipReason; leave the remaining requirements unchanged.
- Around line 30-32: Update the unsupported-version diagnostic in the `version
=== null || !isClaudeSdkVersionSupported(version)` branch to include the
observed `version` value, while preserving a clear indication when the SDK is
not detected and the existing minimum-version requirement.
In `@tests/harness/codex-exec-live.ts`:
- Around line 58-66: Update the codex probe flow around probeEnvironment and
version so a failed buildChildEnvironment result reports the environment-policy
rejection using its explicit rejection key, matching claude-print-live.ts and
claude-tui-live.ts, instead of falling through to the “codex >= 0.139.0 not
found” diagnostic; preserve the existing version check for successful
environments.
In `@tests/harness/live-e2e/adapter.ts`:
- Around line 94-105: Update the implementations in codex.ts and claude-sdk.ts
to import and reuse the exported AdapterError type from adapter.ts, replacing
their inline `{ kind: "prepare-failed"; diagnostic: string }` declarations while
preserving the existing prepare error behavior.
In `@tests/harness/live-e2e/claude-sdk.ts`:
- Around line 86-100: Replace the local versionTuple and
isClaudeSdkVersionSupported comparison logic with the shared parseVersion and
versionAtLeast utilities imported from ./version.ts, matching the usage in
codex.ts. Remove the duplicate local implementation while preserving the
existing minimum-version capability check.
- Around line 206-218: lineLimitKind currently receives only 0 or 1 queued
events, so its queue-event limit and retained byte check do not measure actual
queue depth. Update the acceptLine call sites to pass the number of unprocessed
lines from each read and track bytes for those queued lines, then keep the
queue-limit checks aligned with the documented 16-event in-memory queue
contract.
In `@tests/harness/live-e2e/claude-tui.ts`:
- Around line 63-69: Update the spawnSync invocation in TmuxCommandRunner.run to
include a finite timeout option, using the existing test timeout limit or an
appropriate shared constant. Preserve the current command arguments,
environment, encoding, and maxBuffer behavior while ensuring unresponsive tmux
calls cannot block indefinitely.
- Line 39: Update the readiness detection around READY_PROMPT_PATTERN to remove
ANSI escape sequences before matching the prompt, or stop capturing them by
removing the capture-pane -e option. Ensure colored ❯ lines match within
readyTimeoutMs while preserving existing plain-text mock behavior.
In `@tests/harness/live-e2e/claude.ts`:
- Around line 369-381: Clear the timeout created in the cleanup race within the
active-process shutdown block before the race settles, including when the
process exits or the timeout rejects. Update the logic around
`#activeProcess.kill`() and the Promise.race so the timer handle is retained and
always released, while preserving the existing 10-second timeout and failure
handling.
- Around line 245-254: Update the capability check around
CLAUDE_REQUIRED_HELP_FLAGS so help.status is validated before accessing
help.stdout, short-circuiting when the probe fails and preventing includes from
receiving null. Preserve the existing missingFlags and
AMADEUS_LIVE_E2E:SKIP:CAPABILITY_UNSUPPORTED diagnostic behavior for successful
probes.
- Around line 46-50: Replace the inline CAPABILITY IIFE in claude.ts with the
existing requireCapability helper from registry.ts, and update the import
accordingly. Preserve the "claude-print" capability lookup and failure behavior
while removing the duplicated capabilityById logic.
In `@tests/harness/live-e2e/codex.ts`:
- Around line 99-102: Update the error cleanup path around the scratch-root
registration and the catch block in codex.ts so deleting root also marks
scratch-root as released in the registrar. Ensure cleanup receipts no longer
retain the deleted resource, while preserving the existing throw behavior after
cleanup.
- Around line 135-145: Update the spawnSync calls in preflight and initializeGit
to include bounded execution and output limits, matching the existing harness
conventions: use timeout 15_000 and maxBuffer 64 * 1024 for the codex --version
probe and apply the same limits to the initializeGit invocation.
- Around line 259-275: Update the Codex process lifecycle around Bun.spawn and
cleanup so the process is started as detached and terminated through its process
group, matching the process-group handling in claude-sdk.ts while preserving the
existing signal behavior. In cleanup, retain the reap timeout handle created for
the Promise.race and always clear it in the race’s finally block, including when
the process exits before the timeout.
In `@tests/harness/live-e2e/contract.ts`:
- Around line 43-56: Extend TOKEN_PATTERN to also match case-insensitive
Authorization Bearer credential values, including the Bearer label and following
token, so sanitizeText redacts them before sanitizeOutcome persists diagnostic
text. Preserve the existing labeled-token matching behavior.
In `@tests/harness/live-e2e/journey.ts`:
- Around line 135-144: In createCodexAnchorJourney, define a shared constant for
the ".amadeus-live-anchor.json" filename and reuse it in both the default prompt
and the assertion’s anchorPath construction. Keep the prompt and validation
behavior unchanged while ensuring future filename changes update both references
together.
In `@tests/harness/live-e2e/ledger.ts`:
- Around line 151-163: Update the lock-state handling around the statSync call
to classify an ENOENT error caused by lock disappearance as free instead of
returning an owner-mismatch error. Preserve the existing error result for other
stat failures and the current unstamped-fresh/unstamped-stale classification
when the lock still exists.
In `@tests/harness/live-e2e/lifecycle.ts`:
- Around line 209-219: Update the identity built in the recorded receipt flow
around stableJson and digest to include a per-attempt differentiator, such as
attemptCount or a random nonce, along with measuredVersion and cleanup so
distinct executions cannot produce the same receiptId. Preserve the existing
receipt fields and digest-based receiptId generation.
In `@tests/harness/live-e2e/registry.ts`:
- Line 40: Retain AMADEUS_CODEX_EXEC_AUTH_HOME in sourcePathKeys and add a brief
comment explaining that it is intentionally included defensively, because
sourcePathKeys rejects keys absent from allowedKeys and therefore prevents this
variable from being copied to child processes.
In `@tests/harness/live-e2e/resources.ts`:
- Around line 48-62: Update cleanupReceiptFromRegistrar so resources remaining
in the planned state are represented in the receipt, preventing attempted IDs
from being omitted from both releasedResourceIds and retainedResourceIds after
registration failures. Include planned resources in the appropriate
retained/unreleased accounting, or explicitly document in the function why
planned resources are intentionally excluded as not requiring cleanup.
- Line 63: Move the type-only import of CleanupReceipt and CleanupTarget to the
top of the resources module, before the existing imports, and remove the
duplicate import from the file end.
In `@tests/harness/live-e2e/stream.ts`:
- Around line 13-29: Wrap the stream-reading loop using the reader from
getReader() in a try/finally block and call reader.releaseLock() in finally,
ensuring the lock is released even when reader.read() rejects. Preserve the
existing hashing, byte counting, and chunk-retention behavior.
In `@tests/harness/live-e2e/testing/claude-contract-common.ts`:
- Around line 1-6:
集約された共通ロジックを実装してください。tests/harness/live-e2e/testing/claude-contract-common.ts の
CLAUDE_SIDE_EFFECT_CALLS を ReadonlySet<string> の単一公開定数として整え、POLICY_CI_ZERO_CALLS
と POLICY_STRICT_OPT_IN の判定および違反リスト生成ヘルパーを追加してください。oracle.ts のローカル
SKIP_SIDE_EFFECT_BOUNDARIES を削除して共通定数を import し、claude-print-contract.ts と
claude-sdk-contract.ts は共通ヘルパーを利用して重複判定を削除し、それぞれ SETTINGS_PROJECT_ONLY
の引数検査と資格情報・出力境界の判定だけを残してください。対象は
tests/harness/live-e2e/testing/oracle.ts:67、claude-print-contract.ts:22-43、claude-sdk-contract.ts:32-62
です。
- Line 1: Unify the duplicated side-effect boundary sets by removing the local
SKIP_SIDE_EFFECT_BOUNDARIES definition in oracle.ts and importing/reusing
CLAUDE_SIDE_EFFECT_CALLS from claude-contract-common.ts. Preserve the existing
boundary membership and update references in oracle.ts to use the shared
constant.
In `@tests/harness/live-e2e/testing/claude-print-contract.ts`:
- Around line 22-28: Extract the shared POLICY_CI_ZERO_CALLS and
POLICY_STRICT_OPT_IN checks, including violation-list construction, from the
current contract logic into a common helper reused by claude-print-contract.ts
and claude-sdk-contract.ts. Leave only adapter-specific assertions in each
contract and preserve the existing assertion IDs and outcomes.
In `@tests/harness/live-e2e/testing/claude-sdk-contract.ts`:
- Around line 32-37: Extract the shared POLICY_CI_ZERO_CALLS and
POLICY_STRICT_OPT_IN checks, including violation-list generation, from the
current contract logic into a common helper. Update both claude-sdk-contract.ts
and claude-print-contract.ts to reuse that helper while preserving their
existing inputs and policy outcomes.
In `@tests/harness/live-e2e/testing/fakes.ts`:
- Around line 71-96: Record a “leak-scan” call in the fake adapter’s execute
flow so cleanupRun’s context.leakCheck(target) is reflected in
ScriptedLiveAdapter.calls. Update the relevant call-recording logic near execute
and preserve the existing timeout abort/reap ordering and execution results.
In `@tests/harness/sdk-drive.ts`:
- Around line 354-362: Refactor the shipped and project settings resolution in
the surrounding harness flow to avoid the nested ternary, handling the
project-only case first with an explicit branch while preserving the existing
readClaudeSettings behavior for shipped and project paths.
In `@tests/integration/t-claude-sdk-live-gate.integration.test.ts`:
- Around line 203-213: Resolve the claude-sdk-worker.ts path from the test
file’s import.meta.dir instead of relying on the relative path and
process.cwd(). Update the Bun.spawnSync command in the worker CLI delegation
test while preserving its existing arguments, environment, and assertions.
In
`@tests/integration/t-live-e2e-hardening-kit-unit-contract.integration.test.ts`:
- Around line 258-272: Resolve the “codex-exec” capability once before iterating
over the corpus, replacing the per-iteration IIFE around capabilityById.
Preserve the existing unavailable-capability error behavior and reuse the
resolved capability in each evaluateLiveGate call.
In `@tests/integration/t-live-e2e-runbook.test.ts`:
- Around line 30-31: Replace the brittle prose-fragment assertions in the
integration test with checks for stable identifiers that verify the
distribution-change trigger, such as `dist/<harness>`, adapter IDs, or opt-in
keys. Keep the existing `## Distribution change trigger` heading assertion and
avoid depending on sentence wording, order, or punctuation.
In `@tests/run-tests.ts`:
- Line 791: Update the test scheduling flow around pinnedSerial and
runFilesPartitioned so all .serial. files execute before either parallel batch,
including Claude-required files; run both serial groups first, then start the
regular and Claude-required parallel groups while preserving their existing
partitioning and level behavior.
In `@tests/unit/t-live-e2e-kernel.test.ts`:
- Around line 56-67: Extend the tests around evaluateLiveGate using
capability.optInKey with the exact string "1" and assert that the result has
kind "allow". Keep the existing table focused on denied values while adding
coverage that fails if every input is incorrectly returned as skip.
🪄 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: ASSERTIVE
Plan: Pro Plus
Run ID: 9a8b662b-da7a-4c81-85be-51d2fbb83031
⛔ Files ignored due to path filters (275)
amadeus/spaces/default/codekb/amadeus/re-scans/260803-harness-live-e2e.mdis excluded by!amadeus/spaces/*/codekb/**amadeus/spaces/default/elections/260803-e-hle-ad13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ad13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-fd13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ics13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13-zero/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ra13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/ballots/subagent-1-amend.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-res13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/subagent-2-ballot.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-sds13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r2/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13-r3/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260803-e-hle-ug13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-bt13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/ballots/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/ballots/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/election.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/ledger.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/record.mdis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/tally.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/timeline.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/views/subagent-1.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/260804-e-hle-nd13/views/subagent-2.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/elections/elections.jsonis excluded by!amadeus/spaces/*/elections/**amadeus/spaces/default/intents/260803-harness-live-e2e/amadeus-state.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/audit/j5ik2o-mac-studio-lan-6c5247e7ede8.jsonlis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/ballot-subagent-1-bt13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/ballot-subagent-2-bt13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/build-and-test-summary.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/build-instructions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/build-test-results.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/election-definition-bt13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/integration-test-instructions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/performance-test-instructions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/security-test-instructions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/build-and-test/unit-test-instructions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/code-generation/code-generation-plan.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/code-generation/code-summary.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-print-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/code-generation/code-generation-plan.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/code-generation/code-summary.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-sdk-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/code-generation/code-generation-plan.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/code-generation/code-summary.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/claude-tui-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/code-generation/code-generation-plan.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/code-generation/code-summary.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/codex-live-walking-skeleton/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/cursor-live-closure/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/functional-design/ballot-subagent-1-fd13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/functional-design/ballot-subagent-2-fd13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/functional-design/election-definition-fd13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/functional-design/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/functional-design/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kimi-print-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-acp-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-ide-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/kiro-tui-live/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/code-generation/code-generation-plan.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/code-generation/code-summary.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/live-e2e-common-hardening/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/nfr-design/ballot-subagent-1-nd13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/nfr-design/ballot-subagent-2-nd13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/nfr-design/election-definition-nd13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/nfr-design/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/nfr-design/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/functional-design/business-logic-model.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/functional-design/business-rules.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/functional-design/domain-entities.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/functional-design/functional-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/nfr-design/logical-components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/nfr-design/nfr-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/construction/opencode-live-closure/nfr-design/security-design.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/intent-capture/intent-capture-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/intent-capture/intent-statement.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/intent-capture/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/intent-capture/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/intent-capture/stakeholder-map.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/scope-definition/intent-backlog.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/scope-definition/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/scope-definition/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/scope-definition/scope-definition-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/ideation/scope-definition/scope-document.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/application-design-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/component-dependency.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/component-methods.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/components.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/decisions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/election-definition-ad13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/application-design/services.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/bolt-plan.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/delivery-planning-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/external-dependency-map.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/risk-and-sequencing-rationale.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/delivery-planning/team-allocation.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/ballot-subagent-1-res13-zero.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/ballot-subagent-1-res13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/ballot-subagent-2-res13-zero.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/ballot-subagent-2-res13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/election-definition-res13-zero.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/election-definition-res13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/requirements-analysis-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/requirements-analysis/requirements.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/reverse-engineering/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/reverse-engineering/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/reverse-engineering/scan-notes.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/election-definition-ug13.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/learnings-election-r2.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/learnings-election-r3.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/learnings-selections.jsonis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/memory.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/unit-of-work-dependency.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/unit-of-work-story-map.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/unit-of-work.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/inception/units-generation/units-generation-questions.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/verification/phase-check-construction.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/verification/phase-check-ideation.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/260803-harness-live-e2e/verification/phase-check-inception.mdis excluded by!amadeus/spaces/*/intents/**amadeus/spaces/default/intents/intents.jsonis excluded by!amadeus/spaces/*/intents/**
📒 Files selected for processing (77)
docs/harness-engineering/live-e2e.mddocs/reference/09-testing.ja.mddocs/reference/09-testing.mdtests/.coverage-patch-allowlist.jsontests/.coverage-registry.jsontests/.test-size-purity-allowlist.jsontests/README.mdtests/e2e/t-claude-print-kernel.serial.test.tstests/e2e/t-claude-sdk-kernel.serial.test.tstests/e2e/t-claude-tui-kernel.serial.test.tstests/e2e/t-exec-codex-autosolo-s13.serial.test.tstests/e2e/t-exec-codex-compose-front.serial.test.tstests/e2e/t-exec-codex-journey-workspace.serial.test.tstests/e2e/t-exec-codex-kernel.serial.test.tstests/e2e/t-exec-codex-memory-include.serial.test.tstests/e2e/t-exec-codex-status.serial.test.tstests/gen-coverage-registry.tstests/harness/claude-print-live.tstests/harness/claude-sdk-live.tstests/harness/claude-tui-live.tstests/harness/codex-exec-live.tstests/harness/live-e2e/adapter.tstests/harness/live-e2e/claude-sdk-worker.tstests/harness/live-e2e/claude-sdk.tstests/harness/live-e2e/claude-tui.tstests/harness/live-e2e/claude.tstests/harness/live-e2e/codex.tstests/harness/live-e2e/contract.tstests/harness/live-e2e/journey.tstests/harness/live-e2e/ledger.tstests/harness/live-e2e/lifecycle.tstests/harness/live-e2e/policy.tstests/harness/live-e2e/project-matrix.tstests/harness/live-e2e/projector.tstests/harness/live-e2e/registry.tstests/harness/live-e2e/resources.tstests/harness/live-e2e/runs.jsonltests/harness/live-e2e/stream.tstests/harness/live-e2e/testing/claude-contract-common.tstests/harness/live-e2e/testing/claude-print-contract.tstests/harness/live-e2e/testing/claude-sdk-contract.tstests/harness/live-e2e/testing/contract-case.tstests/harness/live-e2e/testing/evidence.tstests/harness/live-e2e/testing/fakes.tstests/harness/live-e2e/testing/live-kernel.tstests/harness/live-e2e/testing/oracle.tstests/harness/live-e2e/version.tstests/harness/sdk-drive.tstests/integration/sdk-drive.calibration.test.tstests/integration/t-advisory-human-choice-domain.test.tstests/integration/t-claude-print-live-gate.integration.test.tstests/integration/t-claude-sdk-live-gate.integration.test.tstests/integration/t-claude-tui-live-gate.integration.test.tstests/integration/t-codex-exec-live-helper.test.tstests/integration/t-coverage-mechanism-ratchet.test.tstests/integration/t-live-e2e-claude-print.integration.test.tstests/integration/t-live-e2e-claude-sdk.integration.test.tstests/integration/t-live-e2e-claude-tui.integration.test.tstests/integration/t-live-e2e-codex.integration.test.tstests/integration/t-live-e2e-hardening-kit-unit-contract.integration.test.tstests/integration/t-live-e2e-hardening-kit.integration.test.tstests/integration/t-live-e2e-lifecycle.integration.test.tstests/integration/t-live-e2e-runbook.test.tstests/no-silent-drop/adoption-evidence-manifest.jsontests/no-silent-drop/adoption-evidence.jsontests/no-silent-drop/baseline.jsontests/no-silent-drop/evidence/adoption-runs.jsontests/no-silent-drop/exemptions.jsontests/run-tests.tstests/smoke/t05-run-tests-parallel.test.tstests/unit/gen-coverage-registry.test.tstests/unit/t-codex-exec-live-gate.test.tstests/unit/t-live-e2e-kernel.test.tstests/unit/t-package-unreferenced-source.serial.test.tstests/unit/t-package-write-sweep.serial.test.tstests/unit/t07-hook-audit-logger.serial.test.tstests/unit/t140-sdk-drive-model-resolution.test.ts
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
🛑 Comments failed to post (36)
docs/reference/09-testing.md (1)
511-511: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
.serial.ファイルが直列で実行される点を明記してください。L511 は「tier の並列帯より前に実行される」とだけ述べています。直列である点が抜けています。日本語版 (
docs/reference/09-testing.ja.mdL501) は「直列実行されます」と明記しています。表現を揃えてください。📝 提案する修正
-**What stays serial.** The smoke tier ignores `--parallel` and runs serially. Any file whose name contains `.serial.` also runs before its tier's parallel band. Use that suffix only for a demonstrated shared-state or ordering dependency. The preflight gate (`tests/integration/t19.test.ts`) also runs serially because the LLM tiers depend on its exit status. +**What stays serial.** The smoke tier ignores `--parallel` and runs serially. Any file whose name contains `.serial.` runs serially, before its tier's parallel band. Use that suffix only for a demonstrated shared-state or ordering dependency. The preflight gate (`tests/integration/t19.test.ts`) also runs serially because the LLM tiers depend on its exit status.📝 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.**What stays serial.** The smoke tier ignores `--parallel` and runs serially. Any file whose name contains `.serial.` runs serially, before its tier's parallel band. Use that suffix only for a demonstrated shared-state or ordering dependency. The preflight gate (`tests/integration/t19.test.ts`) also runs serially because the LLM tiers depend on its exit status.🤖 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 `@docs/reference/09-testing.md` at line 511, Update the “What stays serial” paragraph in the testing documentation to explicitly state that files whose names contain `.serial.` run serially, while preserving the existing statement that they run before their tier’s parallel band and keeping the English wording aligned with the Japanese documentation.tests/e2e/t-exec-codex-kernel.serial.test.ts (1)
55-61: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
adapterIdの検証を追加してください。
tests/e2e/t-claude-sdk-kernel.serial.test.tsL52-59 はadapterId: "claude-sdk"を検証します。Codex 版にはこの検証がありません。ハーネス間で受理条件を揃えてください。♻️ 提案する修正
expect(result).toMatchObject({ ok: true, value: { kind: "recorded", + adapterId: "codex-exec", outcome: { code: "AMADEUS_LIVE_E2E:PASS:SUCCESS" }, }, });📝 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.expect(result).toMatchObject({ ok: true, value: { kind: "recorded", adapterId: "codex-exec", outcome: { code: "AMADEUS_LIVE_E2E:PASS:SUCCESS" }, }, });🤖 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 `@tests/e2e/t-exec-codex-kernel.serial.test.ts` around lines 55 - 61, Update the expectation in the Codex kernel test around the recorded result to also validate adapterId as "codex", matching the acceptance criteria used by the Claude SDK test while preserving the existing ok, kind, and outcome assertions.tests/harness/claude-print-live.ts (1)
25-60: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Claude 系ライブプリフライトが2ファイルに重複しています。 根本原因は共通ヘルパーの欠如です。両ファイルとも「ゲート評価 →
buildChildEnvironment→--version検証 →--helpフラグ検証 → distribution 検証 →ANTHROPIC_API_KEY検証」を同じ順序で再実装しています。差分は tmux 検証の有無、help フラグ定数、診断文言だけです。
tests/harness/claude-print-live.ts#L25-L60: 共通ヘルパー(例:claudeFamilyRequirementsSkipReason)を切り出し、capability・help フラグ定数・追加チェックを引数で受け取る形にしてください。tests/harness/claude-tui-live.ts#L24-L52: 切り出したヘルパーを呼び出し、tmux 検証だけを固有処理として残してください。🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
📍 Affects 2 files
tests/harness/claude-print-live.ts#L25-L60(this comment)tests/harness/claude-tui-live.ts#L24-L52🤖 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 `@tests/harness/claude-print-live.ts` around lines 25 - 60, Extract the duplicated Claude preflight sequence from claudePrintLiveRequirementsSkipReason in tests/harness/claude-print-live.ts and the corresponding flow in tests/harness/claude-tui-live.ts into a shared helper such as claudeFamilyRequirementsSkipReason, parameterized by capability, required help flags, and any additional checks or diagnostics. Update tests/harness/claude-print-live.ts:25-60 to use the helper, and update tests/harness/claude-tui-live.ts:24-52 likewise while retaining tmux validation only in the TUI-specific path; preserve the existing validation order and behavior.tests/harness/claude-sdk-live.ts (2)
15-26: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
未使用の必須プロパティ
claudeBinを削除してください。 根本原因はClaudeSdkLiveRequirementsがclaudeBinを必須で宣言している点です。claudeSdkLiveRequirementsSkipReasonはこの値を読みません。SDK 経路はprocess.execPathでワーカーを起動するため、Claude CLI バイナリを参照しません。必須プロパティのまま残すと、すべての呼び出し側に無意味な値の算出を強制します。
tests/harness/claude-sdk-live.ts#L15-L26:ClaudeSdkLiveRequirementsからreadonly claudeBin: string;を削除してください。tests/e2e/t-claude-sdk-kernel.serial.test.ts#L22-L29:CLAUDE_BIN定数と、claudeSdkLiveRequirementsSkipReasonへのclaudeBin: CLAUDE_BINの受け渡しを削除してください。📍 Affects 2 files
tests/harness/claude-sdk-live.ts#L15-L26(this comment)tests/e2e/t-claude-sdk-kernel.serial.test.ts#L22-L29🤖 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 `@tests/harness/claude-sdk-live.ts` around lines 15 - 26, Remove the unused required claudeBin property from ClaudeSdkLiveRequirements and update tests/harness/claude-sdk-live.ts lines 15-26 accordingly. In tests/e2e/t-claude-sdk-kernel.serial.test.ts lines 22-29, remove the CLAUDE_BIN constant and stop passing claudeBin to claudeSdkLiveRequirementsSkipReason; leave the remaining requirements unchanged.
30-32: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
バージョン診断に実測値を含めてください。
L30 は「未検出」と「非対応バージョン」を同じ文言に潰します。ローカル実行者はどちらか判別できません。
versionを診断文に含めてください。📝 提案する修正
const version = probeClaudeSdkVersion(packageJsonPath); if (version === null || !isClaudeSdkVersionSupported(version)) { - return `Claude Agent SDK >= ${CAPABILITY.minimumVersion} is unavailable`; + return `Claude Agent SDK >= ${CAPABILITY.minimumVersion} is unavailable (declared: ${version ?? "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.if (version === null || !isClaudeSdkVersionSupported(version)) { return `Claude Agent SDK >= ${CAPABILITY.minimumVersion} is unavailable (declared: ${version ?? "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 `@tests/harness/claude-sdk-live.ts` around lines 30 - 32, Update the unsupported-version diagnostic in the `version === null || !isClaudeSdkVersionSupported(version)` branch to include the observed `version` value, while preserving a clear indication when the SDK is not detected and the existing minimum-version requirement.tests/harness/codex-exec-live.ts (1)
58-66: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
環境ポリシー拒否が「codex 未検出」として報告されます。
probeEnvironment.okが false の場合、versionはnullになります。その結果、74行でcodex >= 0.139.0 not foundを返します。実際の原因は環境ポリシーによる拒否です。診断が誤ります。
claude-print-live.tsの34行とclaude-tui-live.tsの33行は拒否キーを明示して返します。ハーネス間で診断を揃えてください。🐛 修正案
- const probeEnvironment = buildChildEnvironment(env, CAPABILITY.environment); - const version = probeEnvironment.ok - ? spawnSync(codexBin, ["--version"], { - encoding: "utf-8", - env: probeEnvironment.value, - maxBuffer: 64 * 1024, - timeout: 15_000, - }) - : null; - const match = (version?.stdout ?? "").match(/(\d+)\.(\d+)\.(\d+)/); + const probeEnvironment = buildChildEnvironment(env, CAPABILITY.environment); + if (!probeEnvironment.ok) { + return `Codex child environment rejected ${probeEnvironment.error.key}`; + } + const version = spawnSync(codexBin, ["--version"], { + encoding: "utf-8", + env: probeEnvironment.value, + maxBuffer: 64 * 1024, + timeout: 15_000, + }); + const match = (version.stdout ?? "").match(/(\d+)\.(\d+)\.(\d+)/); if ( - version === null || version.status !== 0 ||📝 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.const probeEnvironment = buildChildEnvironment(env, CAPABILITY.environment); if (!probeEnvironment.ok) { return `Codex child environment rejected ${probeEnvironment.error.key}`; } const version = spawnSync(codexBin, ["--version"], { encoding: "utf-8", env: probeEnvironment.value, maxBuffer: 64 * 1024, timeout: 15_000, });🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/codex-exec-live.ts` around lines 58 - 66, Update the codex probe flow around probeEnvironment and version so a failed buildChildEnvironment result reports the environment-policy rejection using its explicit rejection key, matching claude-print-live.ts and claude-tui-live.ts, instead of falling through to the “codex >= 0.139.0 not found” diagnostic; preserve the existing version check for successful environments.tests/harness/live-e2e/adapter.ts (1)
94-105: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
AdapterErrorを実装側で再利用してください。
tests/harness/live-e2e/codex.tsL173 とtests/harness/live-e2e/claude-sdk.tsL351 は、同じ形の{ kind: "prepare-failed"; diagnostic: string }をインラインで再宣言しています。エクスポート済みのAdapterErrorを import して使ってください。エラー種別を将来追加する際、宣言箇所が 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 `@tests/harness/live-e2e/adapter.ts` around lines 94 - 105, Update the implementations in codex.ts and claude-sdk.ts to import and reuse the exported AdapterError type from adapter.ts, replacing their inline `{ kind: "prepare-failed"; diagnostic: string }` declarations while preserving the existing prepare error behavior.tests/harness/live-e2e/claude-sdk.ts (2)
86-100: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
バージョン比較を
./version.tsに統一してください。
tests/harness/live-e2e/codex.tsL26 はparseVersionとversionAtLeastを./version.tsから import しています。このファイルは同じ処理をversionTupleとisClaudeSdkVersionSupportedとして再実装しています。ハーネス間で比較規則が分岐する余地を残さないでください。共通実装に寄せてください。🤖 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 `@tests/harness/live-e2e/claude-sdk.ts` around lines 86 - 100, Replace the local versionTuple and isClaudeSdkVersionSupported comparison logic with the shared parseVersion and versionAtLeast utilities imported from ./version.ts, matching the usage in codex.ts. Remove the duplicate local implementation while preserving the existing minimum-version capability check.
206-218: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
queue-event-limitの判定は到達不能です。
lineLimitKindのqueuedEventCountに渡る値は、L275 では常に0、L281 では0または1です。L215 の比較対象はCLAUDE_SDK_QUEUE_EVENT_LIMIT(16)なので、この分岐は常に false になります。
docs/harness-engineering/live-e2e.mdL40 は「in-memory queue over 16 events」を非グリーン条件として宣言しています。現状その契約は実装されていません。
retainedBytesは L253 で累積されるため、L216 のqueue-byte-limitも「キュー滞留量」ではなく「累積保持バイト数」を測っています。定数名と実測対象が一致していません。実際にキュー深さを測らないなら、
CLAUDE_SDK_QUEUE_EVENT_LIMITと関連分岐を削除し、ドキュメントの記述も合わせてください。測る必要があるなら、acceptLineの呼び出し側で 1 回のread()に含まれる未処理行数を渡してください。Also applies to: 275-275, 281-281
🤖 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 `@tests/harness/live-e2e/claude-sdk.ts` around lines 206 - 218, lineLimitKind currently receives only 0 or 1 queued events, so its queue-event limit and retained byte check do not measure actual queue depth. Update the acceptLine call sites to pass the number of unprocessed lines from each read and track bytes for those queued lines, then keep the queue-limit checks aligned with the documented 16-event in-memory queue contract.tests/harness/live-e2e/claude-tui.ts (2)
39-39: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # tmux capture-pane -e の使用箇所と、ANSI 除去処理の有無を確認する rg -nP -C3 'capture-pane' --type=ts rg -nP -C2 'stripANSI|\\u001b\[|\\x1b\[' --type=tsRepository: amadeus-dlc/amadeus
Length of output: 157
🏁 Script executed:
#!/bin/bash set -u printf '%s\n' '--- candidate files ---' git ls-files | rg '(^|/)tests/harness/live-e2e/claude-tui\.ts$|claude-tui' printf '%s\n' '--- relevant source ---' file="tests/harness/live-e2e/claude-tui.ts" if [ -f "$file" ]; then sed -n '1,90p' "$file" sed -n '350,420p' "$file" fi printf '%s\n' '--- all capture-pane and ANSI handling references ---' rg -n -P -C4 'capture-pane|stripANSI|\\x1b|\\u001b|ANSI' --glob '*.ts' --glob '*.tsx' --glob '*.js' --glob '*.jsx' . || true printf '%s\n' '--- project/runtime hints ---' rg -n -P 'Bun\.stripANSI|capture-pane' . --glob '!node_modules/**' || true exit 0Repository: amadeus-dlc/amadeus
Length of output: 33965
🏁 Script executed:
#!/bin/bash set -u printf '%s\n' '--- live-e2e harness around capture calls ---' sed -n '285,325p' tests/harness/live-e2e/claude-tui.ts printf '%s\n' '--- integration tests for readiness ---' sed -n '1,130p' tests/integration/t-live-e2e-claude-tui.integration.test.ts printf '%s\n' '--- readiness references and test doubles ---' rg -n -P -C5 'ready|READY_PROMPT_PATTERN|Claude TUI readiness|Claude Code ready|capture-pane' \ tests/harness/live-e2e tests/integration tests/unit --glob '*.ts' || true printf '%s\n' '--- deterministic regex probe ---' python3 - <<'PY' import re pattern = re.compile(r'^\s*❯\s*$', re.MULTILINE) samples = { "plain": "Claude Code ready\n❯ \nanchor complete\n", "sgr_wrapped": "Claude Code ready\n\x1b[32m❯ \x1b[0m\nanchor complete\n", "cursor_wrapped": "Claude Code ready\n\x1b[?25l❯ \x1b[?25h\nanchor complete\n", } for name, value in samples.items(): print(f"{name}: {bool(pattern.search(value))} {value.encode()!r}") PY printf '%s\n' '--- local tmux availability/docs, if present ---' if command -v tmux >/dev/null 2>&1; then tmux -V; fi if command -v man >/dev/null 2>&1; then man tmux 2>/dev/null | col -b 2>/dev/null | rg -n -C3 -- '-e|escape' | head -80 || true fi exit 0Repository: amadeus-dlc/amadeus
Length of output: 50376
🏁 Script executed:
#!/bin/bash set -u printf '%s\n' '--- exact readiness implementation ---' sed -n '375,405p' tests/harness/live-e2e/claude-tui.ts printf '%s\n' '--- exact integration test ---' sed -n '1,115p' tests/integration/t-live-e2e-claude-tui.integration.test.ts printf '%s\n' '--- exact readiness-related matches ---' rg -n -P -C3 'READY_PROMPT_PATTERN|`#waitForReady`|readiness timed out|Claude Code ready|this\.#ready|capture-pane' \ tests/harness/live-e2e/claude-tui.ts \ tests/integration/t-live-e2e-claude-tui.integration.test.ts \ tests/unit/t-tui-drive-socket-isolation.test.ts || true printf '%s\n' '--- deterministic regex probe ---' python3 - <<'PY' import re pattern = re.compile(r'^\s*❯\s*$', re.MULTILINE) samples = [ ("plain", "Claude Code ready\n❯ \nanchor complete\n"), ("sgr", "Claude Code ready\n\x1b[32m❯ \x1b[0m\nanchor complete\n"), ] for name, value in samples: print(name, pattern.search(value) is not None, repr(value)) PY exit 0Repository: amadeus-dlc/amadeus
Length of output: 11783
🌐 Web query:
tmux capture-pane -e include escape sequences official man page💡 Result:
The tmux command to capture pane content while including escape sequences is capture-pane with the -e flag [1]. According to the official tmux documentation and man pages, the capture-pane command (often shortened to capturep) extracts text from a pane's grid [1][2][3]. When the -e flag is used, tmux includes escape sequences for colors and text attributes in the output [1]. Key details regarding this functionality include: - Purpose: Including escape sequences is particularly useful when you want to preserve the visual formatting (such as colors and styles) of the captured pane content when printing it to stdout or saving it to a file [1][4]. - Usage: To capture the entire history along with escape sequences and print to stdout, you can use a command similar to: tmux capture-pane -epS - [4]. - Related flags: - -p: Prints the captured content to standard output instead of a paste buffer [1][3]. - -S and -E: Used to specify the starting and ending lines to capture (e.g., -S - captures the entire history) [1][4]. - -C: Alternatively, you can use -C to escape non-printable characters as octal sequences if you prefer a different format [1]. If you are displaying the output of such a command in a terminal, you may need to use a tool like less -r to correctly interpret and display the preserved escape sequences [4].
Citations:
- 1: https://p.rst.im/q/github.com/tmux/tmux/wiki/Advanced-Use
- 2: https://deepwiki.com/tmux/tmux/7.4-paste-buffers-and-environment
- 3: https://tmux.info/docs/commands
- 4: https://unix.stackexchange.com/questions/688216/how-to-get-the-full-console-log-of-my-tmux-session-on-linux
準備判定では ANSI シーケンスを除去してください。
capture-pane -eは色や属性のエスケープシーケンスを保持します。色付きの❯行はREADY_PROMPT_PATTERNに一致せず、readyTimeoutMsまでタイムアウトします。-eを外すか、ANSI 除去後の文字列を判定してください。既存のモックはプレーンテキストのみです。🤖 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 `@tests/harness/live-e2e/claude-tui.ts` at line 39, Update the readiness detection around READY_PROMPT_PATTERN to remove ANSI escape sequences before matching the prompt, or stop capturing them by removing the capture-pane -e option. Ensure colored ❯ lines match within readyTimeoutMs while preserving existing plain-text mock behavior.
63-69: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win
tmux 呼び出しに
timeoutを設定してください。
spawnSyncにtimeoutがありません。tmux サーバーが応答しない場合、同期呼び出しがブロックします。AbortSignalはこの間チェックされません。テスト全体がハングします。上限を1つ足すだけで防げます。♻️ 提案する修正
const result = spawnSync(this.#tmuxBin, [...args], { cwd: options.cwd, env: options.env, encoding: "utf8", maxBuffer: MAX_PANE_BYTES + 1, + timeout: 15_000, });📝 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.run(args: readonly string[], options: TmuxCommandOptions = {}): TmuxCommandResult { const result = spawnSync(this.#tmuxBin, [...args], { cwd: options.cwd, env: options.env, encoding: "utf8", maxBuffer: MAX_PANE_BYTES + 1, timeout: 15_000, });🤖 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 `@tests/harness/live-e2e/claude-tui.ts` around lines 63 - 69, Update the spawnSync invocation in TmuxCommandRunner.run to include a finite timeout option, using the existing test timeout limit or an appropriate shared constant. Preserve the current command arguments, environment, encoding, and maxBuffer behavior while ensuring unresponsive tmux calls cannot block indefinitely.tests/harness/live-e2e/claude.ts (3)
46-50: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
requireCapabilityを再実装しています。
registry.tsには同一処理のrequireCapabilityがあります。claude-print-live.tsとcodex-exec-live.tsはそれを使っています。この IIFE は不要です。-const CAPABILITY = (() => { - const resolved = capabilityById("claude-print"); - if (!resolved.ok) throw new Error("claude-print capability is not registered"); - return resolved.value; -})(); +const CAPABILITY = requireCapability("claude-print");23行の import も
requireCapabilityに差し替えてください。🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/live-e2e/claude.ts` around lines 46 - 50, Replace the inline CAPABILITY IIFE in claude.ts with the existing requireCapability helper from registry.ts, and update the import accordingly. Preserve the "claude-print" capability lookup and failure behavior while removing the duplicated capabilityById logic.
245-254: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
help.statusを確認する前にhelp.stdoutを参照します。245行の
filterはhelp.stdout.includes(flag)を無条件に評価します。spawnSyncが spawn 自体に失敗した場合、stdoutはnullになります。その場合 TypeError が発生します。216行で--versionの成功を確認済みなので発生確率は低いですが、claude-print-live.tsの54行はhelp.status !== 0を先に短絡評価しています。書き方を揃えてください。- const missingFlags = CLAUDE_REQUIRED_HELP_FLAGS.filter((flag) => !help.stdout.includes(flag)); + const helpOutput = help.status === 0 ? help.stdout ?? "" : ""; + const missingFlags = CLAUDE_REQUIRED_HELP_FLAGS.filter((flag) => !helpOutput.includes(flag));📝 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.const helpOutput = help.status === 0 ? help.stdout ?? "" : ""; const missingFlags = CLAUDE_REQUIRED_HELP_FLAGS.filter((flag) => !helpOutput.includes(flag)); return { measuredVersion: parsed.join("."), findings: help.status === 0 && missingFlags.length === 0 ? [] : [{ code: "AMADEUS_LIVE_E2E:SKIP:CAPABILITY_UNSUPPORTED", diagnostic: `Claude print flags unavailable: ${missingFlags.join(",") || "help probe failed"}`, }], };🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/live-e2e/claude.ts` around lines 245 - 254, Update the capability check around CLAUDE_REQUIRED_HELP_FLAGS so help.status is validated before accessing help.stdout, short-circuiting when the probe fails and preventing includes from receiving null. Preserve the existing missingFlags and AMADEUS_LIVE_E2E:SKIP:CAPABILITY_UNSUPPORTED diagnostic behavior for successful probes.
369-381: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
setTimeoutのタイマーが解放されません。374行のタイマーは
Promise.raceが解決した後も残ります。プロセスの終了を最大10秒遅らせます。並列テスト実行では累積します。タイマーを解放してください。♻️ 修正案
if (this.#activeProcess !== undefined) { + let reapTimer: ReturnType<typeof setTimeout> | undefined; try { this.#activeProcess.kill(); await Promise.race([ this.#activeProcess.exited, - new Promise<never>((_, reject) => setTimeout(() => reject(new Error("Claude reap timed out")), 10_000)), + new Promise<never>((_, reject) => { + reapTimer = setTimeout(() => reject(new Error("Claude reap timed out")), 10_000); + }), ]); } catch (error) { failures.push(sanitizeText(String(error))); } finally { + if (reapTimer !== undefined) clearTimeout(reapTimer); this.#activeProcess = undefined; } }📝 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.if (this.#activeProcess !== undefined) { let reapTimer: ReturnType<typeof setTimeout> | undefined; try { this.#activeProcess.kill(); await Promise.race([ this.#activeProcess.exited, new Promise<never>((_, reject) => { reapTimer = setTimeout(() => reject(new Error("Claude reap timed out")), 10_000); }), ]); } catch (error) { failures.push(sanitizeText(String(error))); } finally { if (reapTimer !== undefined) clearTimeout(reapTimer); this.#activeProcess = undefined; } }🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/live-e2e/claude.ts` around lines 369 - 381, Clear the timeout created in the cleanup race within the active-process shutdown block before the race settles, including when the process exits or the timeout rejects. Update the logic around `#activeProcess.kill`() and the Promise.race so the timer handle is retained and always released, while preserving the existing 10-second timeout and failure handling.tests/harness/live-e2e/codex.ts (3)
99-102: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
割り当て失敗時に
scratch-rootを released にしてください。L82 で
scratch-rootを created にした後、L100 で root を削除します。しかし状態は created のままです。呼び出し元がこの registrar でクリーンアップ受領書を作ると、cleanupReceiptFromRegistrarはscratch-rootをretainedResourceIdsに入れます (tests/harness/live-e2e/resources.tsL58)。cleanupBarrierIsClosedはretainedResourceIds.length === 0を要求するため、実際には残っていないリソースでバリアが閉じません。🐛 提案する修正
} catch (error) { rmSync(root, { recursive: true, force: true }); + registrar.markReleased("scratch-root"); throw error; }📝 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.} catch (error) { rmSync(root, { recursive: true, force: true }); registrar.markReleased("scratch-root"); throw error; }🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/live-e2e/codex.ts` around lines 99 - 102, Update the error cleanup path around the scratch-root registration and the catch block in codex.ts so deleting root also marks scratch-root as released in the registrar. Ensure cleanup receipts no longer retain the deleted resource, while preserving the existing throw behavior after cleanup.
135-145: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
spawnSyncにtimeoutとmaxBufferを指定してください。L139 の
codex --version呼び出しには上限がありません。バイナリがハングすると preflight が無期限にブロックします。tests/harness/codex-exec-live.tsL56-61 は同じ probe にtimeout: 15_000とmaxBuffer: 64 * 1024を指定しています。tests/harness/live-e2e/claude-sdk.tsL129-134 もtimeout: 5_000を指定しています。ハーネス間で揃えてください。
initializeGit(L106-115) のspawnSyncにも同じ上限が必要です。🛡️ 提案する修正
const version = baseEnvironment.ok ? spawnSync(this.#options.codexBin, ["--version"], { encoding: "utf8", env: baseEnvironment.value, + maxBuffer: 64 * 1024, + timeout: 15_000, }) : null;🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/live-e2e/codex.ts` around lines 135 - 145, Update the spawnSync calls in preflight and initializeGit to include bounded execution and output limits, matching the existing harness conventions: use timeout 15_000 and maxBuffer 64 * 1024 for the codex --version probe and apply the same limits to the initializeGit invocation.
259-275: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
プロセスグループを終了させ、reap タイマーを解放してください。
2 点あります。
- L263 の
kill()は Codex プロセス本体だけに SIGTERM を送ります。Codex が子プロセスを持つ場合、孤児が残ります。tests/harness/live-e2e/claude-sdk.tsL188-198 はprocess.kill(-worker.pid, signal)でプロセスグループへ送信します。Codex 側も同じ扱いにしてください。ただし L222-230 のBun.spawnはdetachedを指定していないため、グループ送信を使うなら detached 起動も必要です。- L266-268 の
setTimeoutはクリアされません。プロセスが即座に終了しても、タイマーは 10 秒間 event loop を保持します。ハンドルを保持してfinallyでクリアしてください。🛡️ 提案する修正(タイマー解放)
if (this.#activeProcess !== undefined) { + let reapTimer: ReturnType<typeof setTimeout> | undefined; try { this.#activeProcess.kill(); await Promise.race([ this.#activeProcess.exited, new Promise<never>((_, reject) => - setTimeout(() => reject(new Error("Codex reap timed out")), 10_000) + reapTimer = setTimeout(() => reject(new Error("Codex reap timed out")), 10_000) ), ]); } catch (error) { failures.push(sanitizeText(String(error))); } finally { + if (reapTimer !== undefined) clearTimeout(reapTimer); this.#activeProcess = undefined; } }🧰 Tools
🪛 ast-grep (0.45.0)
[warning] Importing child_process exposes a command-execution surface; ensure any command/argument built from input is validated, and prefer execFile/spawn with an argument array over exec.
Context: import { spawnSync } from "node:child_process";
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').(detect-child-process-typescript)
🤖 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 `@tests/harness/live-e2e/codex.ts` around lines 259 - 275, Update the Codex process lifecycle around Bun.spawn and cleanup so the process is started as detached and terminated through its process group, matching the process-group handling in claude-sdk.ts while preserving the existing signal behavior. In cleanup, retain the reap timeout handle created for the Promise.race and always clear it in the race’s finally block, including when the process exits before the timeout.tests/harness/live-e2e/contract.ts (1)
43-56: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win
TOKEN_PATTERNは区切り文字付きの形式しか伏せません。現在のパターンは
sk-,token=,secret:のような「ラベル + 区切り文字」の形式だけに一致します。Authorization: Bearer eyJhbGci...のような形式は一致しません。この場合、値がそのまま診断文字列に残り、sanitizeOutcome経由で台帳レシートへ永続化されます。
bearer形式を1パターン追加してください。🔒 提案する修正
-const TOKEN_PATTERN = /(?:sk|sess|key|token|secret)[-_=:][A-Za-z0-9._-]+/gi; +const TOKEN_PATTERN = + /(?:bearer\s+[A-Za-z0-9._-]+|(?:sk|sess|key|token|secret)[-_=:][A-Za-z0-9._-]+)/gi;📝 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.const TOKEN_PATTERN = /(?:bearer\s+[A-Za-z0-9._-]+|(?:sk|sess|key|token|secret)[-_=:][A-Za-z0-9._-]+)/gi; const ABSOLUTE_PATH_PATTERN = /(?:[A-Za-z]:\\|\/)(?:[^\s/\\]+[/\\])+[^\s]*/g; export function codeMatchesStatus(status: LiveStatus, code: LiveCode): boolean { return code.startsWith(STATUS_PREFIX[status]); } export function sanitizeText(value: string, maxLength = 512): string { const redacted = value .replace(TOKEN_PATTERN, "[REDACTED]") .replace(ABSOLUTE_PATH_PATTERN, "<absolute-path>"); if (redacted.length <= maxLength) return redacted; return `${redacted.slice(0, maxLength)}…[sha256:${digest(redacted)}]`; }🤖 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 `@tests/harness/live-e2e/contract.ts` around lines 43 - 56, Extend TOKEN_PATTERN to also match case-insensitive Authorization Bearer credential values, including the Bearer label and following token, so sanitizeText redacts them before sanitizeOutcome persists diagnostic text. Preserve the existing labeled-token matching behavior.tests/harness/live-e2e/journey.ts (1)
135-144: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Codex アンカーのファイル名を定数化してください。
.amadeus-live-anchor.jsonがプロンプト(Line 137)と検証パス(Line 144)に別々のリテラルとして現れます。TUI 側はCLAUDE_TUI_ANCHOR_FILEを共有しています。片方だけ変更すると、アサーションが黙って失敗します。同じ扱いに揃えてください。♻️ 提案する修正
+export const CODEX_ANCHOR_FILE = ".amadeus-live-anchor.json"; + export function createCodexAnchorJourney(options: CodexAnchorJourneyOptions = {}): LiveJourney { const prompt = options.prompt ?? - 'Create .amadeus-live-anchor.json containing exactly {"status":"ok"}, then respond briefly.'; + `Create ${CODEX_ANCHOR_FILE} containing exactly {"status":"ok"}, then respond briefly.`; @@ - const anchorPath = join(scratch.projectDir, ".amadeus-live-anchor.json"); + const anchorPath = join(scratch.projectDir, CODEX_ANCHOR_FILE);📝 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.export const CODEX_ANCHOR_FILE = ".amadeus-live-anchor.json"; export function createCodexAnchorJourney(options: CodexAnchorJourneyOptions = {}): LiveJourney { const prompt = options.prompt ?? `Create ${CODEX_ANCHOR_FILE} containing exactly {"status":"ok"}, then respond briefly.`; return { id: "codex-anchor-file-v1", prompt, timeoutMs: options.timeoutMs ?? 120_000, retryPolicy: { maxAttempts: 1 }, assert: (execution, scratch) => { const anchorPath = join(scratch.projectDir, CODEX_ANCHOR_FILE);🤖 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 `@tests/harness/live-e2e/journey.ts` around lines 135 - 144, In createCodexAnchorJourney, define a shared constant for the ".amadeus-live-anchor.json" filename and reuse it in both the default prompt and the assertion’s anchorPath construction. Keep the prompt and validation behavior unchanged while ensuring future filename changes update both references together.tests/harness/live-e2e/ledger.ts (1)
151-163: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
ロック消失時の分類が誤りです。
existsSyncとstatSyncの間でロックが解放されると、statSyncはENOENTを投げます。現在の実装はこれをowner-mismatchエラーとして返します。実際の状態はfreeです。エクスポート API の利用者に誤った状態を伝えます。🛠️ 提案する修正
} catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") { + return { ok: true, value: { kind: "free" } }; + } return { ok: false, error: ledgerError("owner-mismatch", String(error)) }; }📝 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.try { const age = Date.now() - statSync(lockPath).mtimeMs; return { ok: true, value: { kind: age > (options.unstampedGraceMs ?? DEFAULT_UNSTAMPED_GRACE_MS) ? "unstamped-stale" : "unstamped-fresh", }, }; } catch (error) { if ((error as NodeJS.ErrnoException).code === "ENOENT") { return { ok: true, value: { kind: "free" } }; } return { ok: false, error: ledgerError("owner-mismatch", String(error)) }; }🤖 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 `@tests/harness/live-e2e/ledger.ts` around lines 151 - 163, Update the lock-state handling around the statSync call to classify an ENOENT error caused by lock disappearance as free instead of returning an owner-mismatch error. Preserve the existing error result for other stat failures and the current unstamped-fresh/unstamped-stale classification when the lock still exists.tests/harness/live-e2e/lifecycle.ts (1)
209-219: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
receiptIdの同一性キーが狭すぎます。キーは
adapterId、journeyId、recordedAt、gitSha、outcome.codeだけです。measuredVersionとcleanupは含みません。同一ミリ秒で同じコードの2回の実行が発生すると、同じreceiptIdで内容が異なる receipt になります。appendRunReceiptはこれをreceipt-conflictとして拒否し、正常な実行が台帳に記録できません。attemptCountや乱数ノンスを identity に加えることを検討してください。🤖 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 `@tests/harness/live-e2e/lifecycle.ts` around lines 209 - 219, Update the identity built in the recorded receipt flow around stableJson and digest to include a per-attempt differentiator, such as attemptCount or a random nonce, along with measuredVersion and cleanup so distinct executions cannot produce the same receiptId. Preserve the existing receipt fields and digest-based receiptId generation.tests/harness/live-e2e/registry.ts (1)
40-40: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # Description: AMADEUS_CODEX_EXEC_AUTH_HOME の残存参照を洗い出す。 rg -n -C3 'AMADEUS_CODEX_EXEC_AUTH_HOME'Repository: amadeus-dlc/amadeus
Length of output: 157
🏁 Script executed:
#!/bin/bash set -eu printf '%s\n' '--- tracked target file ---' git ls-files -- tests/harness/live-e2e/registry.ts printf '%s\n' '--- target context ---' if [ -f tests/harness/live-e2e/registry.ts ]; then sed -n '1,90p' tests/harness/live-e2e/registry.ts else echo 'target file not found' fi printf '%s\n' '--- exact and related references ---' rg -n -C3 -i 'AMADEUS_CODEX_EXEC_AUTH_HOME|authHome|sourcePathKeys|allowedKeys' tests . 2>/dev/null || true printf '%s\n' '--- working tree summary ---' git status --shortRepository: amadeus-dlc/amadeus
Length of output: 25508
🏁 Script executed:
#!/bin/bash set -eu printf '%s\n' '--- policy implementation ---' sed -n '1,105p' tests/harness/live-e2e/policy.ts printf '%s\n' '--- registry consumers ---' rg -n -C4 'LIVE_CAPABILITIES|sourcePathKeys|EnvironmentDeclaration' tests/harness tests/unit tests/integration printf '%s\n' '--- Codex environment implementation ---' rg -n -C6 'codexExecChildEnvironment|OPENAI_API_KEY|AMADEUS_CODEX_EXEC_AUTH_HOME|CODEX_HOME' tests/harness tests/unit tests/integration printf '%s\n' '--- relevant test sections ---' sed -n '30,115p' tests/unit/t-codex-exec-live-gate.test.ts sed -n '65,105p' tests/unit/t-live-e2e-kernel.test.ts sed -n '30,115p' tests/integration/t-live-e2e-codex.integration.test.tsRepository: amadeus-dlc/amadeus
Length of output: 50375
🏁 Script executed:
#!/bin/bash set -eu python3 - <<'PY' from pathlib import Path import re registry = Path("tests/harness/live-e2e/registry.ts").read_text() policy = Path("tests/harness/live-e2e/policy.ts").read_text() entry = re.search( r'id: "codex-exec".*?sourcePathKeys: \[([^\]]+)\]', registry, re.S, ) assert entry, "codex-exec environment declaration not found" source_keys = re.findall(r'"([^"]+)"', entry.group(1)) allowed = re.search( r'id: "codex-exec".*?allowedKeys: \[([^\]]+)\]', registry, re.S, ) assert allowed, "codex-exec allowedKeys not found" allowed_keys = re.findall(r'"([^"]+)"', allowed.group(1)) assert "AMADEUS_CODEX_EXEC_AUTH_HOME" in source_keys assert "AMADEUS_CODEX_EXEC_AUTH_HOME" not in allowed_keys assert "new Set([...declaration.sensitiveKeys, ...declaration.sourcePathKeys])" in policy assert "for (const key of declaration.allowedKeys)" in policy assert "sourcePathKeys.includes(key)" in policy print("old key is a defensive source-path entry, not a copied child-environment key") PYRepository: amadeus-dlc/amadeus
Length of output: 234
AMADEUS_CODEX_EXEC_AUTH_HOMEの防御的列挙であることを明記してください。
sourcePathKeysは、キーがallowedKeysに誤って追加された場合も拒否します。このキーはallowedKeysに含まれないため、子プロセスへコピーされません。削除せず、意図を短いコメントで説明してください。🤖 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 `@tests/harness/live-e2e/registry.ts` at line 40, Retain AMADEUS_CODEX_EXEC_AUTH_HOME in sourcePathKeys and add a brief comment explaining that it is intentionally included defensively, because sourcePathKeys rejects keys absent from allowedKeys and therefore prevents this variable from being copied to child processes.tests/harness/live-e2e/resources.ts (2)
48-62: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
planned状態のリソースが受領書から欠落します。L57 は
releasedを、L58 はcreatedを集計します。plannedのままのリソースはどちらにも入りません。
prepareが資格情報リースに失敗した場合 (tests/harness/live-e2e/codex.tsL176-184 はregisterPlannedの後にleaseを呼ぶ)、codex-credential-bindingは planned のまま残ります。この受領書ではattemptedResourceIdsに含まれるのに、released にも retained にも現れません。追跡の穴になります。意図的な設計なら、planned が「未作成なので回収不要」であることをコメントで明示してください。
🤖 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 `@tests/harness/live-e2e/resources.ts` around lines 48 - 62, Update cleanupReceiptFromRegistrar so resources remaining in the planned state are represented in the receipt, preventing attempted IDs from being omitted from both releasedResourceIds and retainedResourceIds after registration failures. Include planned resources in the appropriate retained/unreleased accounting, or explicitly document in the function why planned resources are intentionally excluded as not requiring cleanup.
63-63: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
import typeをファイル先頭へ移動してください。L63 の import 文がファイル末尾にあります。TypeScript は import を巻き上げるので動作しますが、読み手は
CleanupReceiptとCleanupTargetの出所を探すことになります。L1 の前へ移動してください。♻️ 提案する修正
+import type { CleanupReceipt, CleanupTarget } from "./adapter.ts"; + export type CleanupResourceState = "planned" | "created" | "released";末尾の行を削除します。
}; } -import type { CleanupReceipt, CleanupTarget } from "./adapter.ts";🤖 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 `@tests/harness/live-e2e/resources.ts` at line 63, Move the type-only import of CleanupReceipt and CleanupTarget to the top of the resources module, before the existing imports, and remove the duplicate import from the file end.tests/harness/live-e2e/stream.ts (1)
13-29: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win
リーダーのロックを解放してください。
getReader()で取得したリーダーを解放していません。reader.read()が reject した場合、ストリームはロックされたままになります。try/finallyでreleaseLock()を呼んでください。♻️ 修正案
const reader = stream.getReader(); const hash = createHash("sha256"); const chunks: Uint8Array[] = []; let buffered = 0; let total = 0; - for (;;) { - const item = await reader.read(); - if (item.done) break; - hash.update(item.value); - total += item.value.byteLength; - if (buffered < limit) { - const remaining = limit - buffered; - const retained = item.value.byteLength <= remaining ? item.value : item.value.slice(0, remaining); - chunks.push(retained); - buffered += retained.byteLength; - } - } + try { + for (;;) { + const item = await reader.read(); + if (item.done) break; + hash.update(item.value); + total += item.value.byteLength; + if (buffered < limit) { + const remaining = limit - buffered; + const retained = item.value.byteLength <= remaining ? item.value : item.value.slice(0, remaining); + chunks.push(retained); + buffered += retained.byteLength; + } + } + } finally { + reader.releaseLock(); + }📝 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.const reader = stream.getReader(); const hash = createHash("sha256"); const chunks: Uint8Array[] = []; let buffered = 0; let total = 0; try { for (;;) { const item = await reader.read(); if (item.done) break; hash.update(item.value); total += item.value.byteLength; if (buffered < limit) { const remaining = limit - buffered; const retained = item.value.byteLength <= remaining ? item.value : item.value.slice(0, remaining); chunks.push(retained); buffered += retained.byteLength; } } } finally { reader.releaseLock(); }🤖 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 `@tests/harness/live-e2e/stream.ts` around lines 13 - 29, Wrap the stream-reading loop using the reader from getReader() in a try/finally block and call reader.releaseLock() in finally, ensuring the lock is released even when reader.read() rejects. Preserve the existing hashing, byte counting, and chunk-retention behavior.tests/harness/live-e2e/testing/claude-contract-common.ts (2)
1-1: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
境界名の集合が
oracle.tsと重複しています。
tests/harness/live-e2e/testing/oracle.tsの Line 67 にあるSKIP_SIDE_EFFECT_BOUNDARIESは、このCLAUDE_SIDE_EFFECT_CALLSと同一の要素を持ちます。定義が2箇所にあると、境界を追加したときに片方だけ更新される状態になります。片方を単一の定数に統一してください。♻️ 提案するリファクタ
-export const CLAUDE_SIDE_EFFECT_CALLS = new Set(["probe", "lease", "scratch", "spawn", "ledger"]); +export const SIDE_EFFECT_BOUNDARIES: ReadonlySet<string> = new Set([ + "probe", + "lease", + "scratch", + "spawn", + "ledger", +]);
oracle.ts側はローカル定義を削除し、この定数を import してください。🤖 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 `@tests/harness/live-e2e/testing/claude-contract-common.ts` at line 1, Unify the duplicated side-effect boundary sets by removing the local SKIP_SIDE_EFFECT_BOUNDARIES definition in oracle.ts and importing/reusing CLAUDE_SIDE_EFFECT_CALLS from claude-contract-common.ts. Preserve the existing boundary membership and update references in oracle.ts to use the shared constant.
1-6: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Claude 契約の共通ロジックが分散しています。 境界名の集合と共通ポリシー判定が3ファイルに複製されています。共有モジュール
claude-contract-common.tsに集約すると、境界や判定を追加したときの更新漏れがなくなります。
tests/harness/live-e2e/testing/claude-contract-common.ts#L1-L6: 境界名の集合をReadonlySet<string>として単一の定数で公開し、POLICY_CI_ZERO_CALLSとPOLICY_STRICT_OPT_INの判定と違反リスト生成を共通ヘルパーとして追加してください。tests/harness/live-e2e/testing/oracle.ts#L67-L67: ローカルのSKIP_SIDE_EFFECT_BOUNDARIESを削除し、共通定数を import してください。tests/harness/live-e2e/testing/claude-print-contract.ts#L22-L43: 共通ヘルパーを呼び出し、SETTINGS_PROJECT_ONLYの引数検査だけを残してください。tests/harness/live-e2e/testing/claude-sdk-contract.ts#L32-L62: 共通ヘルパーを呼び出し、資格情報と出力境界の判定だけを残してください。📍 Affects 4 files
tests/harness/live-e2e/testing/claude-contract-common.ts#L1-L6(this comment)tests/harness/live-e2e/testing/oracle.ts#L67-L67tests/harness/live-e2e/testing/claude-print-contract.ts#L22-L43tests/harness/live-e2e/testing/claude-sdk-contract.ts#L32-L62🤖 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 `@tests/harness/live-e2e/testing/claude-contract-common.ts` around lines 1 - 6, 集約された共通ロジックを実装してください。tests/harness/live-e2e/testing/claude-contract-common.ts の CLAUDE_SIDE_EFFECT_CALLS を ReadonlySet<string> の単一公開定数として整え、POLICY_CI_ZERO_CALLS と POLICY_STRICT_OPT_IN の判定および違反リスト生成ヘルパーを追加してください。oracle.ts のローカル SKIP_SIDE_EFFECT_BOUNDARIES を削除して共通定数を import し、claude-print-contract.ts と claude-sdk-contract.ts は共通ヘルパーを利用して重複判定を削除し、それぞれ SETTINGS_PROJECT_ONLY の引数検査と資格情報・出力境界の判定だけを残してください。対象は tests/harness/live-e2e/testing/oracle.ts:67、claude-print-contract.ts:22-43、claude-sdk-contract.ts:32-62 です。tests/harness/live-e2e/testing/claude-print-contract.ts (1)
22-28: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
共通判定ロジックが
claude-sdk-contract.tsと重複しています。
POLICY_CI_ZERO_CALLSとPOLICY_STRICT_OPT_INの判定、および違反リストへの変換処理は、tests/harness/live-e2e/testing/claude-sdk-contract.tsの Line 32-37 と Line 59-62 と同一です。共通ヘルパーへ抽出し、各アダプター固有の判定だけを残してください。Also applies to: 40-43
🤖 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 `@tests/harness/live-e2e/testing/claude-print-contract.ts` around lines 22 - 28, Extract the shared POLICY_CI_ZERO_CALLS and POLICY_STRICT_OPT_IN checks, including violation-list construction, from the current contract logic into a common helper reused by claude-print-contract.ts and claude-sdk-contract.ts. Leave only adapter-specific assertions in each contract and preserve the existing assertion IDs and outcomes.tests/harness/live-e2e/testing/claude-sdk-contract.ts (1)
32-37: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
共通判定ロジックが
claude-print-contract.tsと重複しています。
POLICY_CI_ZERO_CALLS、POLICY_STRICT_OPT_INの判定と違反リスト生成は、tests/harness/live-e2e/testing/claude-print-contract.tsの Line 23-28 と Line 40-43 と同一です。共通ヘルパーへ抽出してください。Also applies to: 59-62
🤖 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 `@tests/harness/live-e2e/testing/claude-sdk-contract.ts` around lines 32 - 37, Extract the shared POLICY_CI_ZERO_CALLS and POLICY_STRICT_OPT_IN checks, including violation-list generation, from the current contract logic into a common helper. Update both claude-sdk-contract.ts and claude-print-contract.ts to reuse that helper while preserving their existing inputs and policy outcomes.tests/harness/live-e2e/testing/fakes.ts (1)
71-96: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # Description: Confirm where the "leak-scan" boundary is recorded. rg -n -C3 'leak-scan' -- testsRepository: amadeus-dlc/amadeus
Length of output: 4895
🏁 Script executed:
#!/bin/bash set -eu printf '%s\n' '--- candidate files ---' git ls-files 'tests/harness/live-e2e/testing/fakes.ts' 'tests/harness/live-e2e/testing/oracle.ts' printf '%s\n' '--- fakes ---' cat -n tests/harness/live-e2e/testing/fakes.ts | sed -n '1,150p' printf '%s\n' '--- oracle ---' cat -n tests/harness/live-e2e/testing/oracle.ts | sed -n '90,140p' printf '%s\n' '--- lifecycle trace writers ---' rg -n -C4 'record\(["'\''](abort|reap|cleanup|leak-scan)|leak-scan|ScriptedLiveAdapter|orderedTrace' tests/harness/live-e2e tests/integration printf '%s\n' '--- isolated build-and-test directive ---' bun .codex/tools/amadeus-orchestrate.ts next --stage build-and-test --singleRepository: amadeus-dlc/amadeus
Length of output: 25257
🏁 Script executed:
#!/bin/bash set -eu printf '%s\n' '--- lifecycle implementation ---' ast-grep outline tests/harness/live-e2e/lifecycle.ts cat -n tests/harness/live-e2e/lifecycle.ts | sed -n '1,260p' printf '%s\n' '--- timeout integration test ---' cat -n tests/integration/t-live-e2e-hardening-kit.integration.test.ts | sed -n '80,145p' printf '%s\n' '--- trace and observation types ---' rg -n -C5 'ContractObservation|trace:|FakeBoundaryCall|cleanupReceiptFromRegistrar|leakFindings|leak' tests/harness/live-e2e tests/integration/t-live-e2e-hardening-kit.integration.test.ts printf '%s\n' '--- standalone deterministic verifier ---' python3 - <<'PY' from pathlib import Path import re fake = Path("tests/harness/live-e2e/testing/fakes.ts").read_text() oracle = Path("tests/harness/live-e2e/testing/oracle.ts").read_text() lifecycle = Path("tests/harness/live-e2e/lifecycle.ts").read_text() recorded = re.findall(r'this\._*record\("([^"]+)"\)', fake) required = re.search(r'isOrderedSubsequence\(\["abort", "reap", "cleanup", "leak-scan"\]', oracle) lifecycle_leak = "leak-scan" in lifecycle print("fake_boundaries =", recorded) print("fake_records_leak_scan =", "leak-scan" in recorded) print("oracle_timeout_requires_leak_scan =", bool(required)) print("lifecycle_contains_leak_scan =", lifecycle_leak) print("timeout_trace_satisfies_requirement =", all(x in recorded for x in ["abort", "reap", "cleanup", "leak-scan"])) PYRepository: amadeus-dlc/amadeus
Length of output: 41139
leak-scanを trace に記録してください。
cleanupRunはcontext.leakCheck(target)を実行しますが、ScriptedLiveAdapter.callsにleak-scanを追加しません。timeout の oracle 要件を満たせず、TIMEOUT_ABORT_REAPになります。🤖 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 `@tests/harness/live-e2e/testing/fakes.ts` around lines 71 - 96, Record a “leak-scan” call in the fake adapter’s execute flow so cleanupRun’s context.leakCheck(target) is reflected in ScriptedLiveAdapter.calls. Update the relevant call-recording logic near execute and preserve the existing timeout abort/reap ordering and execution results.tests/harness/sdk-drive.ts (1)
354-362: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
入れ子三項演算子を分岐で整理できます。
shippedとprojectの解決が2段の入れ子三項になっています。挙動は正しいですが、project-onlyの分岐を先に返す形にすると読みやすくなります。♻️ 提案するリファクタ
- const shipped = opts.settingsAuthority === "project-only" - ? undefined - : readClaudeSettings(SHIPPED_SETTINGS); - const projectSettingsPath = join(projectDir, ".claude", "settings.json"); - const project = opts.settingsAuthority === "project-only" - ? readClaudeSettings(projectSettingsPath) - : projectSettingsPath === SHIPPED_SETTINGS - ? shipped - : readClaudeSettings(projectSettingsPath); + const projectOnly = opts.settingsAuthority === "project-only"; + const projectSettingsPath = join(projectDir, ".claude", "settings.json"); + const shipped = projectOnly ? undefined : readClaudeSettings(SHIPPED_SETTINGS); + const project = !projectOnly && projectSettingsPath === SHIPPED_SETTINGS + ? shipped + : readClaudeSettings(projectSettingsPath);📝 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.const projectOnly = opts.settingsAuthority === "project-only"; const projectSettingsPath = join(projectDir, ".claude", "settings.json"); const shipped = projectOnly ? undefined : readClaudeSettings(SHIPPED_SETTINGS); const project = !projectOnly && projectSettingsPath === SHIPPED_SETTINGS ? shipped : readClaudeSettings(projectSettingsPath);🤖 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 `@tests/harness/sdk-drive.ts` around lines 354 - 362, Refactor the shipped and project settings resolution in the surrounding harness flow to avoid the nested ternary, handling the project-only case first with an explicit branch while preserving the existing readClaudeSettings behavior for shipped and project paths.tests/integration/t-claude-sdk-live-gate.integration.test.ts (1)
203-213: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win
ワーカーのパスを
import.meta.dirから解決してください。
cmdは相対パスtests/harness/live-e2e/claude-sdk-worker.tsを使い、cwd: process.cwd()に依存します。リポジトリルート以外からbun testを実行すると、この spawn は失敗します。テストファイル位置を基準に解決すると、実行ディレクトリに依存しなくなります。🔧 提案する修正
- cmd: [process.execPath, "tests/harness/live-e2e/claude-sdk-worker.ts", "--probe"], - cwd: process.cwd(), + cmd: [ + process.execPath, + join(import.meta.dir, "../harness/live-e2e/claude-sdk-worker.ts"), + "--probe", + ],📝 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.test("worker CLI delegates its probe through the main guard", () => { const result = Bun.spawnSync({ cmd: [ process.execPath, join(import.meta.dir, "../harness/live-e2e/claude-sdk-worker.ts"), "--probe", ], env: process.env, stdout: "pipe", stderr: "pipe", }); expect(result.exitCode).toBe(0); expect(JSON.parse(result.stdout.toString())).toMatchObject({ query: true, abort: true }); });🤖 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 `@tests/integration/t-claude-sdk-live-gate.integration.test.ts` around lines 203 - 213, Resolve the claude-sdk-worker.ts path from the test file’s import.meta.dir instead of relying on the relative path and process.cwd(). Update the Bun.spawnSync command in the worker CLI delegation test while preserving its existing arguments, environment, and assertions.tests/integration/t-live-e2e-hardening-kit-unit-contract.integration.test.ts (1)
258-272: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
IIFE をループ外へ移してください。
capabilityById("codex-exec")の解決をループ内の IIFE で毎回実行しています。結果はループ中で不変です。ループ前に一度だけ解決すれば、ネストが減り意図が明確になります。♻️ 提案する修正
test("generates a reproducible strict opt-in property corpus", () => { const first = strictOptInPropertyCases(1717); expect(first).toEqual(strictOptInPropertyCases(1717)); + const capability = capabilityById("codex-exec"); + if (!capability.ok) throw new Error("codex-exec capability is unavailable"); for (const propertyCase of first) { const decision = evaluateLiveGate( { AMADEUS_CODEX_EXEC_LIVE: propertyCase.value }, - (() => { - const capability = capabilityById("codex-exec"); - if (!capability.ok) throw new Error("codex-exec capability is unavailable"); - return capability.value; - })(), + capability.value, ); expect(decision.kind).toBe(propertyCase.expected === "allow" ? "allow" : "skip"); } });📝 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.test("generates a reproducible strict opt-in property corpus", () => { const first = strictOptInPropertyCases(1717); expect(first).toEqual(strictOptInPropertyCases(1717)); const capability = capabilityById("codex-exec"); if (!capability.ok) throw new Error("codex-exec capability is unavailable"); for (const propertyCase of first) { const decision = evaluateLiveGate( { AMADEUS_CODEX_EXEC_LIVE: propertyCase.value }, capability.value, ); expect(decision.kind).toBe(propertyCase.expected === "allow" ? "allow" : "skip"); } });🤖 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 `@tests/integration/t-live-e2e-hardening-kit-unit-contract.integration.test.ts` around lines 258 - 272, Resolve the “codex-exec” capability once before iterating over the corpus, replacing the per-iteration IIFE around capabilityById. Preserve the existing unavailable-capability error behavior and reuse the resolved capability in each evaluateLiveGate call.tests/integration/t-live-e2e-runbook.test.ts (1)
30-31: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
散文の途中を
toContainで検証すると壊れやすくなります。
"a harness driver (including Claude print, SDK, or TUI)"と"or the installer, identify every affected adapter in the registry"は文の途中を切り出した断片です。ドキュメントの語順や句読点を変えるだけでテストが落ちます。検証したい内容は「配布物変更トリガの記述が存在すること」です。見出し## Distribution change triggerの検証で既に大部分を担保できています。安定した識別子(
dist/<harness>、アダプタ ID、opt-in キー)に絞るか、ドキュメント側にアンカーコメントを置いてそれを検証してください。🤖 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 `@tests/integration/t-live-e2e-runbook.test.ts` around lines 30 - 31, Replace the brittle prose-fragment assertions in the integration test with checks for stable identifiers that verify the distribution-change trigger, such as `dist/<harness>`, adapter IDs, or opt-in keys. Keep the existing `## Distribution change trigger` heading assertion and avoid depending on sentence wording, order, or punctuation.tests/run-tests.ts (1)
791-791: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
.serial.ファイルをすべての parallel batch より先に実行してください。
runFilesPartitionedは通常ファイル帯を完了してから Claude-required ファイル帯を実行します。したがって、Claude-required の.serial.ファイルは通常のparallelFilesより後に実行されます。これは PR の serial 実行順序契約を破ります。serial ファイルを先に両方実行してから、通常と Claude-required の parallel ファイルを実行してください。
修正例
- await runFileBand(effectiveParallel, serialFiles, parallelFiles, collector); - await runFileBand(effectiveParallel, liveSerialFiles, liveParallelFiles, collector); + await runFileBand(1, serialFiles, [], collector); + await runFileBand(1, liveSerialFiles, [], collector); + await runFileBand(effectiveParallel, [], parallelFiles, collector); + await runFileBand(effectiveParallel, [], liveParallelFiles, collector);🤖 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 `@tests/run-tests.ts` at line 791, Update the test scheduling flow around pinnedSerial and runFilesPartitioned so all .serial. files execute before either parallel batch, including Claude-required files; run both serial groups first, then start the regular and Claude-required parallel groups while preserving their existing partitioning and level behavior.tests/unit/t-live-e2e-kernel.test.ts (1)
56-67: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
"1"の許可ケースを検証してください。この表には
"1"がありません。現在のテストは拒否ケースだけを検証します。evaluateLiveGateがすべての値をskipに変更しても、このテストは成功します。
capability.optInKeyを使用して"1"のkind: "allow"を検証してください。🤖 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 `@tests/unit/t-live-e2e-kernel.test.ts` around lines 56 - 67, Extend the tests around evaluateLiveGate using capability.optInKey with the exact string "1" and assert that the result has kind "allow". Keep the existing table focused on denied values while adding coverage that fails if every input is incorrectly returned as skip.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@docs/reference/09-testing.ja.md`:
- Line 490: Update the parallel-execution descriptions in
docs/reference/09-testing.ja.md lines 490-490 and docs/reference/09-testing.md
lines 500-500 to include the perf level alongside unit, integration, and e2e,
keeping both language versions synchronized.
🪄 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: ASSERTIVE
Plan: Pro Plus
Run ID: 3dae3d36-f69a-4287-8fa7-737b7e599baf
📒 Files selected for processing (6)
docs/reference/09-testing.ja.mddocs/reference/09-testing.mdtests/.coverage-registry.jsontests/.test-size-purity-allowlist.jsontests/README.mdtests/gen-coverage-registry.ts

概要
CIテストのボトルネックを解消し、smoke + unit + integration の実行時間を短縮します。
.serial.接尾辞で直列化背景
CIログではunit tierの全件直列実行、coverage registryの反復解析、終了時の全テスト再走査が主なボトルネックでした。並列安全性が確認できるunitテストを並列化し、実証された共有状態依存だけを明示的に直列化します。
影響
.serial.ファイルは各tierの並列帯より先に直列実行されます。min(available CPU cores, 4)です。計測
test:ci: 420.09秒同一GitHub Actions環境での正確な比較は、このPRのCI結果で確定します。
検証
bun run typecheckbun run lint(既存ベースライン警告のみ)bun tests/gen-coverage-registry.ts --checkbun run source-only:checkbun run test:ci -- -P 4: 793 files / 10,687 assertions / 0 failures依存関係
このPRは live E2E test corpusを含む #2159 の先端をbaseにしています。#2159を先にマージしてください。
Note
Medium Risk
Parallel unit execution can expose ordering or shared-state flakes if a dependent test is not marked
.serial.; runner scheduling changed but exit code contract is unchanged.Overview
Speeds up CI by changing how the test runner schedules work and reports sizes, without altering pass/fail exit semantics.
Parallelism: The unit tier now respects
--parallellike integration/e2e; only smoke stays forced serial. Files whose names include.serial.run in a serial band before the tier's parallel batch in any tier.t07-hook-audit-loggerandt-package-write-sweepwere renamed to.serial.for demonstrated shared-state/order deps. Help text and EN/JA testing docs describe the new contract.Runner overhead: End-of-run size matrix is built from executed files (
SizeCollector) instead of re-walking all oftests/.runCheckingen-coverage-registry.tsaccepts optional pre-built registry rows; unit tests build the registry once per process.Harness updates: Smoke
t05-run-tests-parallelexpects unit default parallelism; coverage registry paths and ratchet tests follow the renames andrunCheck(rows)API.Reviewed by Cursor Bugbot for commit 8f45ea3. Configure here.
Summary by CodeRabbit
ドキュメント
テスト