33 KiB
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 supportreal(default, cvmmap-client-cpp) and protocol-faithfuldummybackends. Deliverables:
- Unified CLI11 behavior across streamer + testers (no handcrafted help)
cvmmap_simremoved from build/scripts/docsFrameSourceinput boundary withrealanddummybackends- 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-cppintegration. - 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_simbinary: remove.- Input target must support CVMMAP URI compatible with
/home/crosstyan/Code/cvmmap-python-clientconventions. - 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_simremoval. - 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.
FrameSourceboundary withRealCvmmapSource+DummyShmZmqSource.- Streamer runtime option
--input-mode real|dummy(defaultreal). - Removal of
cvmmap_simbuild 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 addand branch-isolated from main workspace. cmake -S . -B build && cmake --build buildsucceeds.test ! -x build/cvmmap_simreturns success../build/cvmmap_streamer --helpshows 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.shreturns 0 withtotal=5 pass=5 fail=0 skip=0../scripts/fault_suite.shreturns 0 baseline.- Required real profile script returns 0 when
/home/crosstyan/Code/cv-mmapis available.
Must Have
- Dedicated worktree bootstrap and validation step before any refactor change.
- No
src/ipc/help.cppruntime 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-cpppath 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 --porcelainshows exactly one new path for refactor branch.git -C <worktree-path> status --shortis 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.txtCommit: NO | Message:
n/a| Files:none (setup/preflight only) - Category:
-
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.txtCommit: YES | Message:
chore(cli): freeze cli contract and removal inventory| Files:docs/* (if used), internal planning evidence - Category:
-
2. Remove handcrafted help path and rely on CLI11-generated help
What to do: Eliminate
has_help_flag+ handcraftedprint_helpcall 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 --helpexits 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.txtCommit: YES | Message:
refactor(cli): remove handcrafted help path| Files:src/main_streamer.cpp, src/ipc/help.cpp, related headers - Category:
-
3. Migrate
rtp_receiver_testerto CLI11-only parsingWhat to do: Replace manual
parseArgsand 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. --helpand 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.txtCommit: YES | Message:
refactor(testers): migrate rtp_receiver_tester to cli11| Files:src/testers/rtp_receiver_tester.cpp - Category:
-
4. Migrate
rtmp_stub_testerto CLI11-only parsingWhat to do: Replace manual
parse_argsand 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.txtCommit: YES | Message:
refactor(testers): migrate rtmp_stub_tester to cli11| Files:src/testers/rtmp_stub_tester.cpp - Category:
-
5. Introduce
FrameSourceboundary and input-mode contractWhat to do: Define common source interface for frame/event ingestion and wire streamer runtime to select backend via
--input-mode real|dummy(defaultreal). 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-modewith defaultreal. - 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.txtCommit: YES | Message:
refactor(input): add framesource interface and input-mode contract| Files:include/src config/core/pipeline inputs - Category:
-
6. Implement
RealCvmmapSourceusingcvmmap-client-cppWhat to do: Integrate
lib/cvmmap-client-cppas the real backend implementation behindFrameSource; map callbacks/events to existing ingest semantics. Must NOT do: Do not bypassFrameSourceor 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.txtCommit: YES | Message:
feat(input): add real cvmmap source via client-cpp| Files:src/input/*, CMakeLists.txt, core/pipeline integration - Category:
-
6A. Enforce CVMMAP URI compatibility contract; refactor
cvmmap-client-cppif neededWhat to do: Validate C++ client URI parsing/resolution against
/home/crosstyan/Code/cvmmap-python-clientcontract; if any divergence exists, refactorlib/cvmmap-client-cppto 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.txtCommit: YES | Message:
refactor(client): align cvmmap-client-cpp uri contract with python client| Files:lib/cvmmap-client-cpp/*, streamer runtime config/plumbing - Category:
-
7. Implement protocol-faithful
DummyShmZmqSourcebackend (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.cppandinclude/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.txtCommit: YES | Message:
feat(input): add protocol-faithful dummy shm+zmq backend| Files:src/input/*, migrated sim logic files - Category:
-
8. Remove
cvmmap_simtarget and all sim-binary dependenciesWhat 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:273andscripts/fault_suite.sh:303— binary preflight assumptions. - Pattern:
README.mdquickstart sections mentioningcvmmap_sim.
Acceptance Criteria:
build/cvmmap_simis no longer generated.- No script/doc references require
cvmmap_simas 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.txtCommit: YES | Message:
refactor(build): remove cvmmap_sim target and references| Files:CMakeLists.txt, src/main_sim.cpp, src/sim/*, scripts/docs refs - Category:
-
9. Rewrite acceptance suite to backend-mode runner (no simulator process)
What to do: Update
scripts/acceptance_standalone.shso each row drives streamer in--input-mode dummyand 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.mdmandatory acceptance expected summary.
Acceptance Criteria:
- Script returns 0 with
total=5 pass=5 fail=0 skip=0on 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.txtCommit: YES | Message:
test(acceptance): migrate standalone matrix to dummy backend mode| Files:scripts/acceptance_standalone.sh - Category:
-
10. Rewrite fault suite to backend-mode scenarios (no simulator process)
What to do: Update
scripts/fault_suite.shto 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.txtCommit: YES | Message:
test(fault): migrate fault suite to dummy backend scenarios| Files:scripts/fault_suite.sh - Category:
-
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.txtCommit: YES | Message:
test(integration): add required real cv-mmap profile| Files:scripts/*real-profile*.sh, docs/smoke/*.md, release gate wiring - Category:
-
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.mdquickstart/manual test sections currently showingcvmmap_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_simand accurately describe--input-modebehavior. - 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.txtCommit: 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 - Category:
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 CLI11refactor(input): add real/dummy FrameSource and remove cvmmap_sim targettest(integration): update acceptance/fault/release gates and real cv-mmap profiledocs(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.