docs(sisyphus): docs

This commit is contained in:
2026-03-06 12:06:58 +08:00
parent 5d17ad5229
commit b9161ad8b6
4 changed files with 695 additions and 1 deletions
@@ -0,0 +1,659 @@
# Major Refactor: CLI11 Unification + Real cv-mmap Primary + Dummy Backend
## TL;DR
> **Summary**: Remove manual/custom CLI/help paths, make CLI11 the single CLI surface, remove `cvmmap_sim`, and refactor ingestion to support `real` (default, cvmmap-client-cpp) and protocol-faithful `dummy` backends.
> **Deliverables**:
> - Unified CLI11 behavior across streamer + testers (no handcrafted help)
> - `cvmmap_sim` removed from build/scripts/docs
> - `FrameSource` input boundary with `real` and `dummy` backends
> - Required real cv-mmap integration profile using `/home/crosstyan/Code/cv-mmap`
> - Updated acceptance/fault/release gates + evidence paths
> **Effort**: XL
> **Parallel**: YES - 3 waves
> **Critical Path**: T1 → T2/T3/T4 → T5 → T6/T7 → T8 → T9/T10/T11 → T12
## Context
### Original Request
- Remove custom CLI flags/help and use CLI11.
- Major cleanup/refactor with `cvmmap-client-cpp` integration.
- Stop using `cvmmap_sim`; use real cv-mmap and add dummy/stub mode.
- Improve testing/integration with SRS/ZLMediaKit and real cv-mmap.
### Interview Summary
- Legacy CLI policy: **immediate removal**.
- Integration gating: **required real cv-mmap profile**; SRS/ZLMediaKit remain optional/nightly-manual.
- Default input mode: **real**.
- Dummy backend shape: **protocol-faithful SHM+ZMQ**.
- `cvmmap_sim` binary: **remove**.
- Input target must support **CVMMAP URI** compatible with `/home/crosstyan/Code/cvmmap-python-client` conventions.
- Execution model: implementation must run from a dedicated **git worktree** (branch-isolated workspace), not the primary checkout.
### Metis Review (gaps addressed)
- Guardrail added for preserving exit code semantics and evidence formats.
- Guardrail added for script updates in same refactor wave as `cvmmap_sim` removal.
- Guardrail added for protocol/fault knob parity in dummy backend.
## Work Objectives
### Core Objective
Produce a decision-complete refactor plan that eliminates CLI ambiguity, replaces simulator-binary dependency with backend architecture, and hardens verification with required real cv-mmap integration.
### Deliverables
- CLI11-only entrypoints for streamer and tester binaries.
- `FrameSource` boundary with `RealCvmmapSource` + `DummyShmZmqSource`.
- Streamer runtime option `--input-mode real|dummy` (default `real`).
- Removal of `cvmmap_sim` build target and sim-binary assumptions.
- Updated acceptance/fault/release scripts and docs.
- Required integration script/profile against `/home/crosstyan/Code/cv-mmap`.
### Definition of Done (verifiable conditions with commands)
- Work executes from a dedicated worktree path created via `git worktree add` and branch-isolated from main workspace.
- `cmake -S . -B build && cmake --build build` succeeds.
- `test ! -x build/cvmmap_sim` returns success.
- `./build/cvmmap_streamer --help` shows CLI11-generated usage/options and no handcrafted help path.
- `./build/cvmmap_streamer --input-uri "cvmmap://default" ...` (or equivalent URI input flag) resolves and starts in real mode.
- `./scripts/acceptance_standalone.sh` returns 0 with `total=5 pass=5 fail=0 skip=0`.
- `./scripts/fault_suite.sh` returns 0 baseline.
- Required real profile script returns 0 when `/home/crosstyan/Code/cv-mmap` is available.
### Must Have
- Dedicated worktree bootstrap and validation step before any refactor change.
- No `src/ipc/help.cpp` runtime dependency for CLI help.
- No manual argv scanning/parsing in tester binaries.
- Dummy backend reproduces SHM/ZMQ protocol semantics needed by acceptance/fault suites.
- Real mode uses `cvmmap-client-cpp` path by default.
- Streamer accepts CVMMAP plain names and URI form compatible with python client semantics (`cvmmap://<instance>[@<prefix>][?namespace=<namespace>]`).
### Must NOT Have (guardrails, AI slop patterns, scope boundaries)
- No compatibility aliases for removed legacy CLI flags.
- No behavioral drift in accepted exit-code contracts used by scripts.
- No mandatory SRS/ZLMediaKit gate in PR critical path.
- No new feature scope (RTSP/WebRTC/audio/etc.).
## Verification Strategy
> ZERO HUMAN INTERVENTION — all verification is agent-executed.
- Test decision: **tests-after** using existing shell suites + tester binaries.
- QA policy: Every task includes happy + edge/failure scenario.
- Evidence: `.sisyphus/evidence/task-{N}-{slug}.{ext}`
## Execution Strategy
### Parallel Execution Waves
Wave 1: worktree bootstrap + CLI contract + parser unification + foundational input abstraction
Wave 2: real/dummy backend implementation + simulator removal plumbing
Wave 3: script/gate/docs/integration profile hardening
### Dependency Matrix (full, all tasks)
- T0 blocks all implementation tasks.
- T1 blocks T2, T3, T4.
- T2/T3/T4 block T12 validation updates.
- T5 blocks T6 and T7.
- T6/T7 block T8/T9/T10.
- T8 blocks T9/T10/T11.
- T9/T10/T11 block T12.
### Agent Dispatch Summary (wave → task count → categories)
- Wave 1 → 6 tasks → quick, unspecified-high
- Wave 2 → 5 tasks → deep, unspecified-high
- Wave 3 → 3 tasks → writing, unspecified-high
## TODOs
> Implementation + Test = ONE task. Never separate.
> EVERY task MUST have: Agent Profile + Parallelization + QA Scenarios.
- [ ] 0. Bootstrap dedicated git worktree and enforce branch isolation
**What to do**: Create a dedicated git worktree for this refactor branch, validate branch isolation, and pin all subsequent build/test commands to that worktree path.
**Must NOT do**: Do not execute refactor work in primary checkout; do not reuse a dirty worktree.
**Recommended Agent Profile**:
- Category: `quick` — Reason: procedural setup with strict safeguards.
- Skills: [`git-master`] — safe git/worktree operations and verification.
- Omitted: [`feature-research`] — no architecture decision here.
**Parallelization**: Can Parallel: NO | Wave 1 | Blocks: [1,2,3,4,5,6,6A,7,8,9,10,11,12] | Blocked By: []
**References**:
- Pattern: `docs/caveats.md:49-61` — downstream path and cache-collision constraints.
- Pattern: `README.md:237-244` — sibling-path configure caveat.
- External: `https://git-scm.com/docs/git-worktree` — official worktree commands/constraints.
**Acceptance Criteria**:
- [ ] `git worktree list --porcelain` shows exactly one new path for refactor branch.
- [ ] `git -C <worktree-path> status --short` is clean before edits.
- [ ] Build/test commands in plan execution are run from `<worktree-path>`.
**QA Scenarios**:
```
Scenario: Happy path worktree bootstrap
Tool: Bash
Steps: Create worktree with new branch, verify list output and clean status.
Expected: New worktree present, branch checked out, clean tree.
Evidence: .sisyphus/evidence/task-0-worktree.txt
Scenario: Failure path dirty/non-isolated workspace
Tool: Bash
Steps: Attempt run with dirty worktree or branch already checked out elsewhere.
Expected: Preflight stops execution with clear isolation error.
Evidence: .sisyphus/evidence/task-0-worktree-error.txt
```
**Commit**: NO | Message: `n/a` | Files: `none (setup/preflight only)`
- [ ] 1. CLI contract lock + help-path inventory
**What to do**: Create an explicit CLI contract table (flags, defaults, required/optional, error codes) for `cvmmap_streamer`, `rtp_receiver_tester`, `rtmp_stub_tester`, and identify all handcrafted help/manual parser call sites to remove.
**Must NOT do**: Do not alter behavior yet; this task is contract freeze and inventory only.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: cross-file contract extraction with regression risk.
- Skills: [`explore`] — discover all parser/help call sites and script expectations.
- Omitted: [`playwright`] — no browser surface.
**Parallelization**: Can Parallel: NO | Wave 1 | Blocks: [2,3,4] | Blocked By: []
**References**:
- Pattern: `src/main_streamer.cpp:14-29` — manual help path entry.
- Pattern: `src/ipc/help.cpp:26-44` — handcrafted help + `has_help_flag`.
- Pattern: `src/testers/rtp_receiver_tester.cpp:189-232,291-299` — manual parse/help.
- Pattern: `src/testers/rtmp_stub_tester.cpp:267-303,1906-1912` — manual parse/help.
- Pattern: `src/config/runtime_config.cpp:262-447` — current CLI11 + normalization behavior.
**Acceptance Criteria**:
- [ ] A machine-readable contract file/checklist exists in plan notes with every currently supported flag and expected exit behavior.
- [ ] All help/manual parse call sites are enumerated with exact paths and replacement targets.
**QA Scenarios** (MANDATORY — task incomplete without these):
```
Scenario: Happy path inventory completeness
Tool: Bash
Steps: Run static searches for help/parser symbols and map all binaries to parser entrypoints.
Expected: No binary entrypoint remains unaccounted for in contract table.
Evidence: .sisyphus/evidence/task-1-cli-contract.txt
Scenario: Edge path missing-coverage check
Tool: Bash
Steps: Search for "--help" and manual argv scanning patterns; compare to contract table.
Expected: Zero unmatched parser/help call sites.
Evidence: .sisyphus/evidence/task-1-cli-contract-error.txt
```
**Commit**: YES | Message: `chore(cli): freeze cli contract and removal inventory` | Files: `docs/* (if used), internal planning evidence`
- [ ] 2. Remove handcrafted help path and rely on CLI11-generated help
**What to do**: Eliminate `has_help_flag` + handcrafted `print_help` call chain from runtime flow; entrypoints should delegate help/error output to CLI11 parse behavior.
**Must NOT do**: Do not reintroduce custom help text wrappers.
**Recommended Agent Profile**:
- Category: `quick` — Reason: focused code-path cleanup with clear target.
- Skills: [`code-edit`] — precise edits across small set of files.
- Omitted: [`feature-research`] — design already fixed.
**Parallelization**: Can Parallel: YES | Wave 1 | Blocks: [12] | Blocked By: [1]
**References**:
- Pattern: `src/main_streamer.cpp:14-29` — remove pre-parse manual help checks.
- Pattern: `src/ipc/help.cpp` — remove usage in runtime path (delete or dead-code prune if fully unused).
- API/Type: `src/config/runtime_config.cpp:262-292` — canonical CLI11 parse error flow.
**Acceptance Criteria**:
- [ ] `./build/cvmmap_streamer --help` exits 0 and prints CLI11 help.
- [ ] Manual help helper symbols are not referenced by production entrypoints.
**QA Scenarios**:
```
Scenario: Happy path CLI11 help output
Tool: Bash
Steps: Build then run ./build/cvmmap_streamer --help
Expected: Exit code 0 and CLI11-style usage/options output.
Evidence: .sisyphus/evidence/task-2-cli11-help.txt
Scenario: Failure path unknown option handling
Tool: Bash
Steps: Run ./build/cvmmap_streamer --definitely-invalid
Expected: Non-zero exit and parse error from CLI11 path (no handcrafted help banner).
Evidence: .sisyphus/evidence/task-2-cli11-help-error.txt
```
**Commit**: YES | Message: `refactor(cli): remove handcrafted help path` | Files: `src/main_streamer.cpp, src/ipc/help.cpp, related headers`
- [ ] 3. Migrate `rtp_receiver_tester` to CLI11-only parsing
**What to do**: Replace manual `parseArgs` and bespoke help output with CLI11 parser, preserving current option names and exit code semantics.
**Must NOT do**: Do not change tester protocol validation behavior.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: parser migration + behavior compatibility.
- Skills: [`code-edit`] — reliable targeted rewrite.
- Omitted: [`frontend-ui-ux`] — not applicable.
**Parallelization**: Can Parallel: YES | Wave 1 | Blocks: [12] | Blocked By: [1]
**References**:
- Pattern: `src/testers/rtp_receiver_tester.cpp:189-232` — manual parse path.
- Pattern: `src/testers/rtp_receiver_tester.cpp:291-299` — manual help pre-check.
- Pattern: `src/config/runtime_config.cpp` — preferred CLI11 style.
**Acceptance Criteria**:
- [ ] Existing flags (`--port`, `--expect-pt`, `--sdp`, `--decode-hook`, `--packet-threshold`, `--timeout-ms`) still function.
- [ ] `--help` and invalid flag behavior are CLI11-native; scripts relying on return-code expectations still pass.
**QA Scenarios**:
```
Scenario: Happy path tester invocation
Tool: Bash
Steps: Run ./build/rtp_receiver_tester --port 5004 --expect-pt 96 --packet-threshold 1 --timeout-ms 100
Expected: CLI parsing succeeds and tester enters runtime path.
Evidence: .sisyphus/evidence/task-3-rtp-cli11.txt
Scenario: Failure path invalid option
Tool: Bash
Steps: Run ./build/rtp_receiver_tester --not-a-real-flag
Expected: Exit code matches contract and parse fails cleanly.
Evidence: .sisyphus/evidence/task-3-rtp-cli11-error.txt
```
**Commit**: YES | Message: `refactor(testers): migrate rtp_receiver_tester to cli11` | Files: `src/testers/rtp_receiver_tester.cpp`
- [ ] 4. Migrate `rtmp_stub_tester` to CLI11-only parsing
**What to do**: Replace manual `parse_args` and custom help with CLI11, preserving modes/threshold/timeouts and existing semantics.
**Must NOT do**: Do not alter protocol parser/state machine logic.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: large file, parser section surgery.
- Skills: [`code-edit`] — scoped rewrite.
- Omitted: [`deep`] — not needed if confined to parser/help layer.
**Parallelization**: Can Parallel: YES | Wave 1 | Blocks: [12] | Blocked By: [1]
**References**:
- Pattern: `src/testers/rtmp_stub_tester.cpp:267-303` — custom usage + arg parsing helpers.
- Pattern: `src/testers/rtmp_stub_tester.cpp:1906-1912` — parser call in main.
- Test: `scripts/acceptance_standalone.sh:205-212` — expected invocation shape.
**Acceptance Criteria**:
- [ ] Modes (`h264`, `h265-enhanced`, `h265-domestic`) parse exactly as before.
- [ ] Invalid arg handling/exit behavior matches contract table.
**QA Scenarios**:
```
Scenario: Happy path mode parsing
Tool: Bash
Steps: Run ./build/rtmp_stub_tester --mode h264 --listen-host 127.0.0.1 --listen-port 1935 --video-threshold 1 --timeout-ms 100
Expected: Parser accepts args and tester starts.
Evidence: .sisyphus/evidence/task-4-rtmp-cli11.txt
Scenario: Failure path unsupported mode
Tool: Bash
Steps: Run ./build/rtmp_stub_tester --mode invalid-mode
Expected: Parse/config failure with non-zero exit per contract.
Evidence: .sisyphus/evidence/task-4-rtmp-cli11-error.txt
```
**Commit**: YES | Message: `refactor(testers): migrate rtmp_stub_tester to cli11` | Files: `src/testers/rtmp_stub_tester.cpp`
- [ ] 5. Introduce `FrameSource` boundary and input-mode contract
**What to do**: Define common source interface for frame/event ingestion and wire streamer runtime to select backend via `--input-mode real|dummy` (default `real`).
**Must NOT do**: Do not couple backend-specific SHM/ZMQ details into pipeline/controller layers.
**Recommended Agent Profile**:
- Category: `deep` — Reason: architectural seam with broad downstream impact.
- Skills: [`feature-research`] — ensure interface matches existing runtime contracts.
- Omitted: [`quick`] — insufficient for this scope.
**Parallelization**: Can Parallel: NO | Wave 1 | Blocks: [6,7] | Blocked By: [1]
**References**:
- Pattern: `src/core/ingest_runtime.cpp:155-386` — current direct SHM/ZMQ ingest flow.
- Pattern: `src/pipeline/pipeline_stub.cpp:692-1138` — duplicated ingestion/open logic.
- API/Type: `include/cvmmap_streamer/config/runtime_config.hpp` — extend with input mode enum.
**Acceptance Criteria**:
- [ ] Streamer supports explicit `--input-mode` with default `real`.
- [ ] Runtime constructs backend through interface, not direct branch sprawl.
**QA Scenarios**:
```
Scenario: Happy path default backend selection
Tool: Bash
Steps: Run streamer without --input-mode and inspect startup logs/config dump.
Expected: Backend resolves to real mode by default.
Evidence: .sisyphus/evidence/task-5-framesource.txt
Scenario: Failure path invalid mode value
Tool: Bash
Steps: Run ./build/cvmmap_streamer --input-mode nonsense ...
Expected: Immediate config error with non-zero exit.
Evidence: .sisyphus/evidence/task-5-framesource-error.txt
```
**Commit**: YES | Message: `refactor(input): add framesource interface and input-mode contract` | Files: `include/src config/core/pipeline inputs`
- [ ] 6. Implement `RealCvmmapSource` using `cvmmap-client-cpp`
**What to do**: Integrate `lib/cvmmap-client-cpp` as the real backend implementation behind `FrameSource`; map callbacks/events to existing ingest semantics.
**Must NOT do**: Do not bypass `FrameSource` or duplicate direct SHM+ZMQ open logic in pipeline/ingest loops.
**Recommended Agent Profile**:
- Category: `deep` — Reason: third-party integration + callback/contract adaptation.
- Skills: [`feature-research`] — align API/metadata contract and lifecycle.
- Omitted: [`playwright`] — irrelevant.
**Parallelization**: Can Parallel: YES | Wave 2 | Blocks: [8,12] | Blocked By: [5]
**References**:
- API/Type: `lib/cvmmap-client-cpp/include/app/cvmmap/cvmmap_client.hpp:274-309` — client API/callbacks.
- Pattern: `lib/cvmmap-client-cpp/app_cvmmap_client.cpp` — polling lifecycle and event flow.
- Pattern: `src/core/ingest_runtime.cpp` — target behavior to preserve.
**Acceptance Criteria**:
- [ ] Real backend successfully receives frames/events and feeds existing pipeline path.
- [ ] Existing coherent-frame semantics and reset handling remain valid under real backend.
- [ ] Real backend path accepts CVMMAP URI inputs and resolves endpoints consistently with python client behavior.
**QA Scenarios**:
```
Scenario: Happy path real backend ingest
Tool: Bash
Steps: Start real cv-mmap server profile, then run streamer in default mode.
Expected: Frames processed and published without backend init failures.
Evidence: .sisyphus/evidence/task-6-real-backend.txt
Scenario: Failure path server unavailable
Tool: Bash
Steps: Run streamer in real mode with unavailable cv-mmap endpoint/root.
Expected: Deterministic startup failure with actionable error and non-zero exit.
Evidence: .sisyphus/evidence/task-6-real-backend-error.txt
```
**Commit**: YES | Message: `feat(input): add real cvmmap source via client-cpp` | Files: `src/input/*, CMakeLists.txt, core/pipeline integration`
- [ ] 6A. Enforce CVMMAP URI compatibility contract; refactor `cvmmap-client-cpp` if needed
**What to do**: Validate C++ client URI parsing/resolution against `/home/crosstyan/Code/cvmmap-python-client` contract; if any divergence exists, refactor `lib/cvmmap-client-cpp` to match and expose the aligned URI path to streamer config.
**Must NOT do**: Do not invent a streamer-only URI grammar that diverges from python client contract.
**Recommended Agent Profile**:
- Category: `deep` — Reason: cross-repo contract parity and potential library-level refactor.
- Skills: [`feature-research`] — compare URI grammar, validation, derived endpoint rules.
- Omitted: [`quick`] — cross-library behavior risk.
**Parallelization**: Can Parallel: NO | Wave 2 | Blocks: [8,11,12] | Blocked By: [6]
**References**:
- External: `/home/crosstyan/Code/cvmmap-python-client/src/cvmmap/__init__.py` — authoritative URI resolver behavior.
- External: `/home/crosstyan/Code/cvmmap-python-client/README.md` — documented URI scheme and examples.
- Pattern: `lib/cvmmap-client-cpp/app_cvmmap_client.cpp:93-190,593-597` — current C++ URI resolution and constructor path.
- API/Type: `lib/cvmmap-client-cpp/include/app/cvmmap/cvmmap_client.hpp:285` — constructor contract surface.
**Acceptance Criteria**:
- [ ] Plain instance and URI forms produce the same derived base/endpoint semantics as python client for shared test vectors.
- [ ] Unsupported query keys, invalid prefixes, invalid namespace/instance tokens fail with deterministic validation errors.
- [ ] Streamer runtime can consume URI input and pass it cleanly into C++ client path.
**QA Scenarios**:
```
Scenario: Happy path URI parity vectors
Tool: Bash
Steps: Run parity checks for vectors like "cvmmap://default" and "cvmmap://camera0@/run/cvmmap?namespace=zed" through C++ client path.
Expected: Derived names/endpoints match python client contract exactly.
Evidence: .sisyphus/evidence/task-6a-uri-parity.txt
Scenario: Failure path invalid URI validation
Tool: Bash
Steps: Pass invalid forms (bad query key, traversal prefix, invalid token chars).
Expected: Deterministic validation failure and non-zero exit/error propagation.
Evidence: .sisyphus/evidence/task-6a-uri-parity-error.txt
```
**Commit**: YES | Message: `refactor(client): align cvmmap-client-cpp uri contract with python client` | Files: `lib/cvmmap-client-cpp/*, streamer runtime config/plumbing`
- [ ] 7. Implement protocol-faithful `DummyShmZmqSource` backend (in-process)
**What to do**: Add in-process dummy backend that reproduces SHM metadata + ZMQ sync/status semantics and fault knobs used by matrix/fault suites.
**Must NOT do**: Do not create a replacement standalone simulator binary.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: protocol emulation with timing/fault controls.
- Skills: [`feature-research`] — preserve wire-level behavior.
- Omitted: [`quick`] — too risky for protocol fidelity.
**Parallelization**: Can Parallel: YES | Wave 2 | Blocks: [8,12] | Blocked By: [5]
**References**:
- Pattern: `src/main_sim.cpp` — behavior source to port into backend, not binary.
- Pattern: `src/sim/wire.cpp` and `include/cvmmap_streamer/sim/wire.hpp` — protocol writers/serialization.
- Test: `scripts/fault_suite.sh:171-239` — required scenario knobs and dynamics.
**Acceptance Criteria**:
- [ ] Dummy backend supports equivalent frame generation, reset emission, and timing knobs required by existing suites.
- [ ] Standalone suite can run using streamer+testers without `build/cvmmap_sim`.
**QA Scenarios**:
```
Scenario: Happy path dummy backend matrix row
Tool: Bash
Steps: Run one acceptance row configured for dummy backend.
Expected: Streamer/tester pass with expected packet/video threshold.
Evidence: .sisyphus/evidence/task-7-dummy-backend.txt
Scenario: Failure path dummy reset storm edge
Tool: Bash
Steps: Configure high reset frequency and run fault reset scenario.
Expected: Fault suite captures expected behavior and exits per baseline criteria.
Evidence: .sisyphus/evidence/task-7-dummy-backend-error.txt
```
**Commit**: YES | Message: `feat(input): add protocol-faithful dummy shm+zmq backend` | Files: `src/input/*, migrated sim logic files`
- [ ] 8. Remove `cvmmap_sim` target and all sim-binary dependencies
**What to do**: Delete CMake target and obsolete simulator entrypoint files, and replace all build/script references with backend-mode runtime execution.
**Must NOT do**: Do not leave stale references in scripts/docs/README quickstart.
**Recommended Agent Profile**:
- Category: `quick` — Reason: deterministic deletion/plumbing updates.
- Skills: [`code-edit`] — direct target/reference cleanup.
- Omitted: [`deep`] — architecture decisions already made.
**Parallelization**: Can Parallel: NO | Wave 2 | Blocks: [9,10,11,12] | Blocked By: [6,6A,7]
**References**:
- Pattern: `CMakeLists.txt:101-105` — remove sim target block.
- Pattern: `scripts/acceptance_standalone.sh:273` and `scripts/fault_suite.sh:303` — binary preflight assumptions.
- Pattern: `README.md` quickstart sections mentioning `cvmmap_sim`.
**Acceptance Criteria**:
- [ ] `build/cvmmap_sim` is no longer generated.
- [ ] No script/doc references require `cvmmap_sim` as executable.
**QA Scenarios**:
```
Scenario: Happy path build artifact validation
Tool: Bash
Steps: Configure+build then assert build/cvmmap_sim absent.
Expected: Assertion passes and build completes.
Evidence: .sisyphus/evidence/task-8-remove-sim.txt
Scenario: Failure path stale-reference scan
Tool: Bash
Steps: Search repo scripts/docs for remaining executable references to cvmmap_sim.
Expected: Zero hard dependency references remain.
Evidence: .sisyphus/evidence/task-8-remove-sim-error.txt
```
**Commit**: YES | Message: `refactor(build): remove cvmmap_sim target and references` | Files: `CMakeLists.txt, src/main_sim.cpp, src/sim/*, scripts/docs refs`
- [ ] 9. Rewrite acceptance suite to backend-mode runner (no simulator process)
**What to do**: Update `scripts/acceptance_standalone.sh` so each row drives streamer in `--input-mode dummy` and removes sim process lifecycle/return-code handling.
**Must NOT do**: Do not change matrix semantics (5 rows/protocol+codec coverage) or summary format contract.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: gate-critical script surgery with evidence contract.
- Skills: [`code-edit`] — safe structured shell changes.
- Omitted: [`feature-research`] — behavior already specified.
**Parallelization**: Can Parallel: YES | Wave 3 | Blocks: [12] | Blocked By: [8]
**References**:
- Pattern: `scripts/acceptance_standalone.sh:129-139,224-238` — current sim process usage.
- Pattern: `scripts/acceptance_summary_helper.py` — output schema to preserve.
- Test: `README.md` mandatory acceptance expected summary.
**Acceptance Criteria**:
- [ ] Script returns 0 with `total=5 pass=5 fail=0 skip=0` on passing runs.
- [ ] Manifest/summary fields remain compatible with helper parser expectations.
**QA Scenarios**:
```
Scenario: Happy path full acceptance run
Tool: Bash
Steps: Run ./scripts/acceptance_standalone.sh after build.
Expected: Exit 0 and expected pass/fail/skip totals.
Evidence: .sisyphus/evidence/task-9-acceptance.txt
Scenario: Failure path induced row failure
Tool: Bash
Steps: Trigger one row with invalid endpoint/arg via controlled injection and run suite.
Expected: Row marked FAIL, summary reflects non-zero fail count, script exits non-zero.
Evidence: .sisyphus/evidence/task-9-acceptance-error.txt
```
**Commit**: YES | Message: `test(acceptance): migrate standalone matrix to dummy backend mode` | Files: `scripts/acceptance_standalone.sh`
- [ ] 10. Rewrite fault suite to backend-mode scenarios (no simulator process)
**What to do**: Update `scripts/fault_suite.sh` to drive fault knobs through dummy backend config in streamer path and remove sim process management.
**Must NOT do**: Do not relax baseline success criteria (`3/3 pass`) or degraded-mode semantics.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: fault semantics are fragile and gate-critical.
- Skills: [`code-edit`] — structured shell and threshold contract preservation.
- Omitted: [`quick`] — risk too high.
**Parallelization**: Can Parallel: YES | Wave 3 | Blocks: [12] | Blocked By: [8]
**References**:
- Pattern: `scripts/fault_suite.sh:208-220,258-271,301-330` — current sim-driven lifecycle.
- Pattern: `scripts/fault_summary_helper.py` — threshold expectations and summary schema.
**Acceptance Criteria**:
- [ ] Baseline mode still returns 0 only when all three scenarios pass.
- [ ] Degraded mode behavior preserved per existing semantics.
**QA Scenarios**:
```
Scenario: Happy path baseline fault suite
Tool: Bash
Steps: Run ./scripts/fault_suite.sh
Expected: Exit 0 with total=3 pass=3 fail=0.
Evidence: .sisyphus/evidence/task-10-fault-suite.txt
Scenario: Edge path degraded thresholds
Tool: Bash
Steps: Run ./scripts/fault_suite.sh --degraded
Expected: Behavior matches existing degraded contract and evidence records threshold outcomes.
Evidence: .sisyphus/evidence/task-10-fault-suite-error.txt
```
**Commit**: YES | Message: `test(fault): migrate fault suite to dummy backend scenarios` | Files: `scripts/fault_suite.sh`
- [ ] 11. Add required real cv-mmap integration profile and gate wiring
**What to do**: Add required integration script/profile using `/home/crosstyan/Code/cv-mmap`, with explicit preflight checks and deterministic fail messages when dependency is unavailable/misconfigured.
**Must NOT do**: Do not fold SRS/ZLMediaKit into required PR gate.
**Recommended Agent Profile**:
- Category: `unspecified-high` — Reason: external dependency contract and deterministic gating.
- Skills: [`feature-research`] — align with real server startup/runtime assumptions.
- Omitted: [`playwright`] — not needed.
**Parallelization**: Can Parallel: YES | Wave 3 | Blocks: [12] | Blocked By: [8]
**References**:
- External: `/home/crosstyan/Code/cv-mmap` — required integration root.
- Pattern: `scripts/release_gate.sh:101-117` — existing gate sequencing.
- Docs: `docs/smoke/srs.md`, `docs/smoke/zlm.md` — keep optional-only placement.
**Acceptance Criteria**:
- [ ] New integration profile script exits 0 when real cv-mmap profile is healthy.
- [ ] Fails with clear actionable message if profile cannot be started or connected.
**QA Scenarios**:
```
Scenario: Happy path real integration profile
Tool: Bash
Steps: Run integration script with --cvmmap-root /home/crosstyan/Code/cv-mmap and valid runtime options.
Expected: End-to-end profile passes and emits evidence bundle.
Evidence: .sisyphus/evidence/task-11-real-profile.txt
Scenario: Failure path missing cv-mmap root
Tool: Bash
Steps: Run integration script with non-existent --cvmmap-root.
Expected: Deterministic preflight failure with non-zero exit and explicit missing-path reason.
Evidence: .sisyphus/evidence/task-11-real-profile-error.txt
```
**Commit**: YES | Message: `test(integration): add required real cv-mmap profile` | Files: `scripts/*real-profile*.sh, docs/smoke/*.md, release gate wiring`
- [ ] 12. Final gate/docs alignment and regression sweep
**What to do**: Update `release_gate.sh`, README, compat/caveats docs, and any evidence expectations to reflect no simulator binary, real default mode, dummy backend usage, and required real profile.
**Must NOT do**: Do not alter scope constraints (no rtsp/webrtc/audio) or evidence key names unless helper tooling is updated in same task.
**Recommended Agent Profile**:
- Category: `writing` — Reason: high-accuracy docs+gate alignment.
- Skills: [`code-edit`] — script/doc synchronized edits.
- Omitted: [`frontend-ui-ux`] — irrelevant.
**Parallelization**: Can Parallel: NO | Wave 3 | Blocks: [] | Blocked By: [2,3,4,6,7,8,9,10,11]
**References**:
- Pattern: `scripts/release_gate.sh:119-141` — required evidence bundle checks.
- Pattern: `README.md` quickstart/manual test sections currently showing `cvmmap_sim`.
- Docs: `docs/compat_matrix.md`, `docs/caveats.md` — keep optional checks separation and scope text.
**Acceptance Criteria**:
- [ ] Release gate passes with updated mandatory checks and evidence expectations.
- [ ] Documentation examples no longer require `cvmmap_sim` and accurately describe `--input-mode` behavior.
- [ ] No stale references to removed simulator binary remain.
**QA Scenarios**:
```
Scenario: Happy path full release gate
Tool: Bash
Steps: Run ./scripts/release_gate.sh
Expected: PASS with updated gate summary and evidence bundle.
Evidence: .sisyphus/evidence/task-12-release-gate.txt
Scenario: Failure path evidence gate injection
Tool: Bash
Steps: Run ./scripts/release_gate.sh --inject-failure evidence
Expected: Deterministic FAIL at evidence gate with clear failing_gates output.
Evidence: .sisyphus/evidence/task-12-release-gate-error.txt
```
**Commit**: YES | Message: `docs(gate): align release gate and docs with real/dummy backend model` | Files: `scripts/release_gate.sh, README.md, docs/*.md, helper references`
## Final Verification Wave (4 parallel agents, ALL must APPROVE)
- [ ] F1. Plan Compliance Audit — oracle
- [ ] F2. Code Quality Review — unspecified-high
- [ ] F3. Real Manual QA — unspecified-high (+ playwright if UI)
- [ ] F4. Scope Fidelity Check — deep
## Commit Strategy
- Commit in atomic slices by wave; no cross-wave mixed commits.
- Suggested pattern:
- `refactor(cli): remove manual help paths and unify CLI11`
- `refactor(input): add real/dummy FrameSource and remove cvmmap_sim target`
- `test(integration): update acceptance/fault/release gates and real cv-mmap profile`
- `docs(runtime): align README/compat/caveats with new backend model`
## Success Criteria
- All mandatory gates pass with no simulator binary.
- Real cv-mmap integration profile is required and passing when local dependency exists.
- Dummy backend fully replaces simulator role for standalone matrix/fault coverage.
- CLI experience is deterministic, CLI11-native, and free from handcrafted help output.
- CVMMAP URI behavior in streamer/C++ client is contract-compatible with python client semantics.