fix(review): make capture-evidence transitions executable - #2640
Conversation
…5-contract fix(review): add STATUS v5 capture descriptor contract
…r' into fix/2248-capture-evidence-runtime
…evidence-runtime fix(review): execute capture evidence descriptors
…r' into fix/2248-capture-evidence-bench
…evidence-bench test(bench): drive capture evidence descriptors
📝 WalkthroughWalkthroughThe change adds the ChangesV5 status contract and compatibility
Descriptor publication and execution
Journey coverage and acceptance validation
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ReviewFacade
participant ReviewNextTransition
participant CaptureEvidenceCLI
participant RepositoryLocator
ReviewFacade->>ReviewNextTransition: publish v5 capture-evidence descriptor
ReviewNextTransition->>CaptureEvidenceCLI: pass bound arguments and substitutions
CaptureEvidenceCLI->>RepositoryLocator: resolve repository context
RepositoryLocator-->>CaptureEvidenceCLI: return matching repository
CaptureEvidenceCLI-->>ReviewFacade: submit verification evidence
Possibly related issues
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
internal/cli/review_artifact.go (1)
41-69: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winRequire an explicit repository resolver.
The validation at Line 53 claims that
--repository-contextor--cwdis required, but it does not test either flag. Because--cwddefaults to".", a caller can omit both flags and resolve the process working directory at Line 68. This violates the provider-bound descriptor contract and can target an unrelated repository.Require
reviewFlagWasProvided(flags, "cwd")whencontextHandleis empty.Suggested validation change
+ contextHandle := strings.TrimSpace(*repositoryContext) if flags.NArg() != 0 || strings.TrimSpace(*lineage) == "" || strings.TrimSpace(*target) == "" || strings.TrimSpace(*revision) == "" || strings.TrimSpace(*outcome) == "" || strings.TrimSpace(*input) == "" { + // Also reject an invocation with neither an opaque context nor an explicit cwd. } - contextHandle := strings.TrimSpace(*repositoryContext)🤖 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 `@internal/cli/review_artifact.go` around lines 41 - 69, Require an explicit repository resolver in the review capture-evidence preflight: when repositoryContext is empty, validate reviewFlagWasProvided(flags, "cwd") before calling resolveReviewMutationRoot. Preserve the existing mutually exclusive handling for --repository-context and --cwd, while rejecting invocations that omit both flags.
🤖 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 `@bench/journeys_wave1.go`:
- Around line 79-81: Restore the ArtifactSubject field, including its
SubjectHash member, in the decoded Inputs type used by
captureCorrectableFindingFor, while preserving its existing JSON mapping;
alternatively update captureCorrectableFindingFor to use an equivalent field
already defined by Inputs.
In `@internal/cli/review_binary_acceptance_test.go`:
- Around line 386-388: Update the assertion around
captureEvidenceSubmissionInput to compare the complete
ReviewTransitionSubmission before and after rejection, rather than joining only
ArgumentTokens. Capture both submissions and assert their full descriptors are
equal, preserving the existing failure context.
In `@internal/cli/review_schema.go`:
- Around line 20-26: Update reviewVerificationEvidenceSchema and its related
validation to match readFacadeBytes byte-based enforcement: publish a
conservative character maxLength derived from reviewResultArtifactLimit, or
otherwise enforce a byte-accurate contract. Update the schema test to assert the
resulting limit and preserve acceptance of non-empty evidence within the actual
artifact bound.
---
Outside diff comments:
In `@internal/cli/review_artifact.go`:
- Around line 41-69: Require an explicit repository resolver in the review
capture-evidence preflight: when repositoryContext is empty, validate
reviewFlagWasProvided(flags, "cwd") before calling resolveReviewMutationRoot.
Preserve the existing mutually exclusive handling for --repository-context and
--cwd, while rejecting invocations that omit both flags.
🪄 Autofix
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: Repository UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 512c20a8-9fa7-4a79-9b09-882dbd65aa18
📒 Files selected for processing (21)
bench/journeys.gobench/journeys_capture_evidence_v5.gobench/journeys_id_collision_test.gobench/journeys_sdd_test.gobench/journeys_wave1.gocontracts/review-integration/v2/fixtures/capabilities-v2.2.fixture.jsoncontracts/review-integration/v2/fixtures/status-v5.fixture.jsoncontracts/review-integration/v2/schemas/capabilities-v2.2.schema.jsoncontracts/review-integration/v2/schemas/status-v5.schema.jsoninternal/cli/review_artifact.gointernal/cli/review_artifact_test.gointernal/cli/review_binary_acceptance_test.gointernal/cli/review_facade.gointernal/cli/review_next_transition.gointernal/cli/review_next_transition_test.gointernal/cli/review_provider_artifact_contract_test.gointernal/cli/review_schema.gointernal/cli/review_status_contract.gointernal/cli/review_status_contract_test.gointernal/cli/review_submission_descriptor_test.gointernal/reviewtransaction/repository_locator.go
| Name string `json:"name"` | ||
| CaptureOperation string `json:"capture_operation"` | ||
| Submission *waveSubmissionDescriptor `json:"submission"` |
There was a problem hiding this comment.
🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win
Restore ArtifactSubject in the decoded input type.
captureCorrectableFindingFor still evaluates input.ArtifactSubject.SubjectHash at Line 447. The new Inputs type does not declare ArtifactSubject. This file will not compile. Preserve the existing JSON field and its SubjectHash member, or update captureCorrectableFindingFor to use a field provided by the new type.
🤖 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 `@bench/journeys_wave1.go` around lines 79 - 81, Restore the ArtifactSubject
field, including its SubjectHash member, in the decoded Inputs type used by
captureCorrectableFindingFor, while preserving its existing JSON mapping;
alternatively update captureCorrectableFindingFor to use an equivalent field
already defined by Inputs.
| if got := captureEvidenceSubmissionInput(t, after).Submission; strings.Join(got.ArgumentTokens, "\x00") != | ||
| strings.Join(captureEvidenceSubmissionInput(t, before).Submission.ArgumentTokens, "\x00") { | ||
| t.Fatalf("rejected capture-evidence changed its pending descriptor: %#v", after.NextTransition) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Compare the complete pending descriptor after rejection.
Line 386 compares only ArgumentTokens. A rejected request could change operation_token or values while this test passes. Compare the complete ReviewTransitionSubmission before and after the refusal.
🤖 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 `@internal/cli/review_binary_acceptance_test.go` around lines 386 - 388, Update
the assertion around captureEvidenceSubmissionInput to compare the complete
ReviewTransitionSubmission before and after rejection, rather than joining only
ArgumentTokens. Capture both submissions and assert their full descriptors are
equal, preserving the existing failure context.
| // reviewVerificationEvidenceSchema describes the input review capture-evidence | ||
| // actually accepts and readCapturedFinalEvidence actually enforces: raw, | ||
| // non-empty final test/verification evidence content, not a structured JSON | ||
| // object, bounded by the same native artifact limit every captured artifact | ||
| // uses (reviewResultArtifactLimit). | ||
| var reviewVerificationEvidenceSchema = fmt.Sprintf( | ||
| `{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://gentle-ai.dev/schema/review/verification-evidence/v1","title":"Gentle AI captured final verification evidence","description":"Raw final test or verification evidence content captured by review capture-evidence. It is not a structured JSON document: any non-empty content up to the native artifact bound is accepted.","type":"string","minLength":1,"maxLength":%d}`, | ||
| `{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"`+reviewVerificationEvidenceSchemaID+`","title":"Gentle AI captured final verification evidence","description":"Raw final test or verification evidence content captured by review capture-evidence. It is not a structured JSON document: any non-empty content up to the native artifact bound is accepted.","type":"string","minLength":1,"maxLength":%d}`, |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
ast-grep outline internal/cli/review_schema.go --items all
rg -n -C 5 'reviewResultArtifactLimit|func\s+readCapturedFinalEvidence|len\(|LimitReader' internal/cliRepository: Gentleman-Programming/gentle-ai
Length of output: 50388
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== review_schema.go outline =="
ast-grep outline internal/cli/review_schema.go --items all || true
echo "== targeted symbols =="
rg -n -C 8 'reviewVerificationEvidenceSchema|reviewResultArtifactLimit|readCapturedFinalEvidence|capture-evidence|OperationToken|submission' internal/cli internal/review transaction || true
echo "== likely files =="
git ls-files internal/cli | rg 'review.*(capture|finalize|submission|schema|artifact|transaction|command|start_contract|transition|scope|next_transition)' | sort
echo "== source slices =="
for f in internal/cli/review_schema.go internal/cli/review_capture.go internal/cli/review_finalize.go internal/cli/review_submission_descriptor.go internal/cli/review_start_contract.go internal/review/review.go; do
if [ -f "$f" ]; then
echo "--- $f $(wc -l < "$f") ---"
sed -n '1,220p' "$f"
fi
doneRepository: Gentleman-Programming/gentle-ai
Length of output: 50388
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== internal/cli file size list =="
for f in internal/cli/review_schema.go internal/cli/review_submission_descriptor.go internal/cli/review_schema_test.go internal/cli/review_submission_descriptor_test.go internal/cli/review_capture.go internal/cli/review.go internal/reviewtransaction/*.go; do
[ -f "$f" ] || continue
printf '%s=%s\n' "$f" "$(wc -l < "$f")"
done
echo "== review_schema.go =="
sed -n '1,80p' internal/cli/review_schema.go
echo "== review_schema_test.go evidence test =="
sed -n '70,115p' internal/cli/review_schema_test.go
echo "== targeted references limited to internal/cli/internal/reviewtransaction =="
rg -n -C 4 'reviewResultArtifactLimit|readCapturedFinalEvidence|VerificationEvidenceRecordSchema|verification-evidence|capture-evidence|OperationToken|LimitReader|Limit\(' internal/cli internal/reviewtransaction -g '*.go' | head -n 300
echo "== read function definitions =="
rg -n 'func\s+\w*[Rr]ead[A-Za-z]*Evidence|func\s+\w*[Aa]rtifact|func\s+read.*[Ll]imit|type\s+.*Limit' internal/cli/internal/reviewtransaction/* | sed -n '1,120p'
for f in $(rg -l 'func\s+\w*[Rr]ead[A-Za-z]*Evidence|reviewResultArtifactLimit|VerificationEvidenceRecordSchema' internal/reviewtransaction -g '*.go'); do
echo "--- $f"
ast-grep outline "$f" --items all | sed -n '1,120p'
doneRepository: Gentleman-Programming/gentle-ai
Length of output: 47695
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate readCapturedFinalEvidence and artifact limits =="
rg -n -C 6 'func readCapturedFinalEvidence|ReviewArtifactManifest|reviewResultArtifactLimit|AdmitArtifact|LimitReader|ReadAll\(file' internal/cli internal/reviewtransaction -g '*.go' | sed -n '1,260p'
echo "== read function implementation slices =="
for f in internal/cli/review_facade.go internal/reviewtransaction/artifact_admission.go internal/reviewtransaction/verification_evidence.go internal/cli/review_collection.go internal/cli/review_artifact.go; do
[ -f "$f" ] || continue
echo "--- $f ---"
rg -n 'readCapturedFinalEvidence|ReviewArtifactManifest|readReviewerArtifactManifest|reviewResultArtifactLimit|ReadAll|LimitReader' "$f" || true
done
echo "== focused file slices =="
sed -n '4230,4288p' internal/cli/review_facade.go
sed -n '1,140p' internal/reviewtransaction/artifact_admission.go
sed -n '1,180p' internal/reviewtransaction/verification_evidence.go
echo "== static verifier for input limit contract vs acceptance implementation =="
python3 - <<'PY'
import re, pathlib
cli = pathlib.Path('internal/cli/review_facade.go').read_text()
adm = pathlib.Path('internal/reviewtransaction/artifact_admission.go').read_text()
ver = pathlib.Path('internal/reviewtransaction/verification_evidence.go').read_text()
schema = pathlib.Path('internal/cli/review_schema_test.go').read_text()
checks = {
'limit_constant_name': 'reviewResultArtifactLimit: int8Limit',
'read_all_limit_reader': 'io.LimitReader(file, reviewResultArtifactLimit+1)',
'check_len_after_read': 'len(payload) > reviewResultArtifactLimit',
'limit_reader_read_all_pattern': bool(re.search(r'io\.LimitReader\([^)]+, reviewResultArtifactLimit\+1\)', cli)),
}
for k,_ in checks.items():
print(f'{k}: {checks[k]}')
m = re.search(r'func\s+readCapturedFinalEvidence\([^)]*\)\s*\{(?P<body>.*?)(?=\nfunc\s+\w+|\Z)', cli, re.S)
print('readCapturedFinalEvidence_found:', bool(m))
print('readCapturedFinalEvidence_mentions_limit_reader:', 'LimitReader' in (m.group(0) if m else ''))
print('readCapturedFinalEvidence_mentions_byte_check:', 'len(payload)' in (m.group(0) if m else ''))
print('schema_test_validates_character_bound_value:', 'schema["maxLength"]' in schema and 'reviewResultArtifactLimit' in schema)
print('artifact_admission_byte_check:', 'len(payload)' in adm and 'Acceptable' in adm)
PYRepository: Gentleman-Programming/gentle-ai
Length of output: 40414
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== ReadCapturedVerificationEvidence implementation =="
rg -n -C 8 'func ReadCapturedVerificationEvidence|ReadCaptured.*Evidence|readCaptured.*Evidence' internal/reviewtransaction internal/cli -g '*.go' | sed -n '1,260p'
echo "== ReadCapturedVerificationEvidence implementation slice =="
for f in internal/reviewtransaction/final_verification_retry.go internal/reviewtransaction/verification_evidence.go internal/reviewtransaction/compact_result_reopen_test.go internal/reviewtransaction/reviewer_context_level.go; do
[ -f "$f" ] || continue
echo "--- $f ---"
rg -n -C 8 'ReadCaptured.*Evidence|verificationEvidenceRecordLimit|validation\|ValidatePayload|Verify.*Evidence|record\]' "$f" || true
done
echo "== static verifier of readCapturedFinalEvidence call chain =="
python3 - <<'PY'
import pathlib, re
files = {
'cli_facade': pathlib.Path('internal/cli/review_facade.go'),
'cli_artifact': pathlib.Path('internal/cli/review_artifact.go'),
'verification_evidence': pathlib.Path('internal/reviewtransaction/verification_evidence.go'),
}
def text(p): return p.read_text()
m = re.search(r'func\s+readCapturedFinalEvidence\([^)]*(state.*\*\w+\s*\*)?\)\s*\{(?P<body>.*?)(?=\nfunc\s+\w+|\Z)', text(files['cli_artifact']), re.S)
print('readCapturedFinalEvidence_body:', 'ReadCapturedVerificationEvidence' in m.group('body') if m else '')
if m:
print('readCapturedFinalEvidence_body:', m.group('body').strip().replace('\n',' ')[:1500])
m2 = re.search(r'func\s+ReadCapturedVerificationEvidence\([^)]*\)\s*\{(?P<body>.*?)(?=\nfunc\s+\w+|\Z)', text(files['verification_evidence']), re.S)
print('ReadCapturedVerificationEvidence_body:', 'ValidatePayload' in m2.group('body') if m2 else '')
if m2:
body = m2.group('body')
for pat in [r'ValidatePayload', r'\blen\(payload\)', r'\blimited', r'iconversion\(len\(payload[\*\)\]\)']:
print(pat, 'found:', bool(re.search(pat, body)))
PYRepository: Gentleman-Programming/gentle-ai
Length of output: 29445
Make the published evidence limit byte-accurate.
readFacadeBytes(...-input) enforces reviewResultArtifactLimit as bytes. The published schema uses the same value as JSON Schema maxLength, which counts Unicode characters. A non-ASCII proof can satisfy the schema and then be rejected by review capture-evidence. Publish a byte-accurate length contract, or use a conservative character limit and update the schema test against it.
🤖 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 `@internal/cli/review_schema.go` around lines 20 - 26, Update
reviewVerificationEvidenceSchema and its related validation to match
readFacadeBytes byte-based enforcement: publish a conservative character
maxLength derived from reviewResultArtifactLimit, or otherwise enforce a
byte-accurate contract. Update the schema test to assert the resulting limit and
preserve acceptance of non-empty evidence within the actual artifact bound.
There was a problem hiding this comment.
Pull request overview
Advances the negotiated review integration v2 STATUS envelope to a strict v5 schema that publishes executable, provider-bound review.capture-evidence submission descriptors (using opaque repository context), while preserving v4 readability. This closes the gap from #2248 where the advertised capture-evidence transition was not directly invocable using only the advertised parameters.
Changes:
- Introduces STATUS v5 contract artifacts (schema + fixture) and updates capabilities pins/fixtures to advertise v5.
- Emits and validates v5 capture-evidence submission descriptors that bind lineage/revision/target/repository-context and expose only
outcome+ raw evidenceinputas substitution slots. - Adds end-to-end proof via CLI tests and bench journeys, including arbitrary-CWD built-binary execution and negative/refusal cases.
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| internal/reviewtransaction/repository_locator.go | Extends live repository-context validation to validating-state authority snapshots. |
| internal/cli/review_submission_descriptor_test.go | Updates descriptor execution tests to consume and execute the published v5 capture-evidence submission descriptor. |
| internal/cli/review_status_contract.go | Adds v4/v5 schema support, validates capture-evidence descriptors/bindings, and extends transition validation to allow capture-evidence submissions. |
| internal/cli/review_status_contract_test.go | Adds a regression test ensuring v4 STATUS payloads remain readable alongside v5 defaults. |
| internal/cli/review_schema.go | Factors the verification-evidence schema $id into a constant for reuse across v5 surfaces. |
| internal/cli/review_provider_artifact_contract_test.go | Pins v5 status schema/fixture digests and validates v5 artifacts alongside existing provider contract artifacts. |
| internal/cli/review_next_transition.go | Publishes capture-evidence inputs as provider-bound submission descriptors (contract v2) with repository-context and outcome/input slots. |
| internal/cli/review_next_transition_test.go | Adds a validator helper for v5 next_transition schema validation. |
| internal/cli/review_facade.go | Publishes opaque repository context in validating and correction-required states and hardens finalize submission validation against wrong descriptor kinds. |
| internal/cli/review_binary_acceptance_test.go | Proves built-binary descriptor execution from unrelated CWD, plus mutation-safe refusal cases for capture-evidence. |
| internal/cli/review_artifact.go | Adds --repository-context resolver for capture-evidence, mutually exclusive with --cwd, with improved diagnostics. |
| internal/cli/review_artifact_test.go | Adds unit coverage for capture-evidence resolver diagnostics and mutual-exclusion behavior. |
| contracts/review-integration/v2/schemas/status-v5.schema.json | Adds STATUS v5 JSON Schema defining capture-evidence submission descriptors and strict next_transition shapes. |
| contracts/review-integration/v2/schemas/capabilities-v2.2.schema.json | Updates capabilities v2.2 to advertise STATUS v5 instead of v4. |
| contracts/review-integration/v2/fixtures/status-v5.fixture.json | Adds a v5 STATUS fixture for artifact validation and pinning. |
| contracts/review-integration/v2/fixtures/capabilities-v2.2.fixture.json | Updates capabilities v2.2 fixture to include STATUS v5. |
| bench/journeys.go | Registers the new capture-evidence descriptor journey source in the bench suite. |
| bench/journeys_wave1.go | Extends wave status decoding to understand v5 schema and multi-slot submission descriptors. |
| bench/journeys_sdd_test.go | Updates the core journey count pin to include the new journeys (64 → 66). |
| bench/journeys_id_collision_test.go | Adds the new journey source to the global ID-collision guard. |
| bench/journeys_capture_evidence_v5.go | Adds built-binary journeys proving normal + correction capture-evidence descriptors execute using only published tokens. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| } | ||
| } | ||
| if len(submission.ArgumentTokens) != 6 || len(submission.Values) != 2 { | ||
| return errors.New("submission descriptor value substitution is malformed") // refusal:by-design world-action: only a provider code fix can restore the single value slot |
…r' into fix/2248-capture-evidence-tracker # Conflicts: # bench/journeys_sdd_test.go
There was a problem hiding this comment.
♻️ Duplicate comments (1)
bench/journeys_wave1.go (1)
80-103: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick winPreserve
ArtifactSubjectin the decoded collect input.
captureCorrectableFindingForstill readsinput.ArtifactSubject.SubjectHashat Line 447. Ensure the expandedNextTransition.Collect.Inputstype declares the existingartifact_subjectJSON field and itsSubjectHashmember. Otherwise thebenchpackage fails to compile.This repeats the previous review finding. Verify the current type before merging.
#!/bin/bash set -euo pipefail ast-grep outline bench/journeys_wave1.go --items all rg -n -C 8 'ArtifactSubject|captureCorrectableFindingFor|waveCorrectionStatus' bench/journeys_wave1.go🤖 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 `@bench/journeys_wave1.go` around lines 80 - 103, Add the missing ArtifactSubject field to the expanded NextTransition.Collect.Inputs type, including its SubjectHash member and correct artifact_subject JSON tag, so captureCorrectableFindingFor can continue accessing input.ArtifactSubject.SubjectHash.
🤖 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.
Duplicate comments:
In `@bench/journeys_wave1.go`:
- Around line 80-103: Add the missing ArtifactSubject field to the expanded
NextTransition.Collect.Inputs type, including its SubjectHash member and correct
artifact_subject JSON tag, so captureCorrectableFindingFor can continue
accessing input.ArtifactSubject.SubjectHash.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 13631d5a-b712-4139-a94a-1a9247c49904
📒 Files selected for processing (4)
bench/journeys_capture_evidence_v5.gobench/journeys_sdd_test.gobench/journeys_wave1.gointernal/cli/review_facade.go
Closes #2248
Summary
review.capture-evidencewhile preserving V4 readability and the v1 shape.outcomeand raw evidenceinputsubstitution slots.Chain
--cwdcompatibility.main; its selector-less committed-correction journey ownsj65.All child slices were independently verified and merged into this tracker. The tracker contains no additional functional commits beyond those reviewed slices and normal base integration.
Main Integration
origin/main@91645ffb480645b089c044ab61c7564986866c25without rebase or force-push.origin/fix/2248-capture-evidence-tracker@ff81508e04f6f1e058d721777ac0710209956c14; this surfaced the sole genuine conflict inbench/journeys_sdd_test.go.j65-selectorless-committed-correction-continuation.j65-v5-capture-evidence-descriptors-execute->j66-v5-capture-evidence-descriptors-execute;j66-v5-capture-evidence-correction-descriptor-executes->j67-v5-capture-evidence-correction-descriptor-executes.j57remains unchanged.Verification
--cwd, raw v1-to-bound-v2 record, and arbitrary-CWD binary positive/negative tests passed, including race coverage.j65selector-less correction,j66ordinary V5 capture, andj67correction V5 capture completed.j57remained unsupported without its fixture and completed with the fixture.RDD remained disabled/unmanaged. No Windows Full Suite, review action, merge, or release action was run.
Size Exception
The composed tracker changes 1,019 lines across 21 files (
+923/-96) against currentmain. This is the already reviewed composition of three bounded child PRs plus the required proof-only journey renumbering. Splitting the final integration again would not reduce reviewer burden because the contract, runtime, and executable proof have already been reviewed separately; this PR verifies their exact composition againstmain.Summary by CodeRabbit