23 KiB
Implementation Plan R0001: Classical Test Suite Remediation
Status: ready
Target executor: GPT-5.6-Terra
Authoritative audit:
docs/roadmap/test-suite-audit-findings.md
Active plan location: docs/roadmap/implementation.md
Objective
Replace the oversized, implementation-bound integration suites in the three completed standalone role repositories with lean classical, state-based suites. Retain tests of stable role-owned behavior and application outcomes; remove mutable-default snapshots, task-trace assertions, tests of trusted Ansible modules, redundant scenarios, and negative platform matrices.
Production role behavior is not changing. This plan changes only test implementations, test-related role documentation, and the workspace planning records identified by the audit.
Execution Rules
- Execute stages in numeric order.
- Before each stage, confirm its owning repository is clean and record its starting revision.
- Preserve unrelated and pre-existing changes.
- Do not modify production tasks, defaults, templates, argument specifications, dependency pins, or role metadata. If a retained test exposes a production defect, stop and report it instead of expanding this remediation.
- Follow the normative testing house style in
docs/conventions.mdand the classifications in the authoritative audit. - Exercise roles through their public variables and inspect final application behavior. Do not parse task names, task order, or individual task status.
- Retain only aggregate
changed=0checks on specified immediate repeat runs. Do not require a nonzero change count on preceding runs. - Do not verify ownership, permissions, path types, checkout commits, or other postconditions already declared through trusted modules.
- Do not add a test merely to replace each removed test one-for-one. The target is the smallest suite that protects the retained behavior.
- Keep each repository's shell driver self-contained. Do not create a shared cross-repository test helper or abstraction.
- Run each stage's full repository integration entry point before committing.
- Commit each completed stage separately with the plain-English intent given in that stage.
- Do not begin a dependent stage after an earlier stage fails validation.
Starting State and Preconditions
- The workspace conventions, audit plan, audit findings, status update, and this implementation plan must be reviewed and committed in the workspace repository before Stage 1 begins.
ansible-role-seriatimstarts clean atfb8dc41.ansible-role-auditastarts clean at847c4c3.ansible-role-notariusstarts clean ateb4f511.- The workspace
.venvprovides Ansible Core and ansible-lint, and the local Ubuntu 26.04x86_64host remains the approved MVP integration proxy. - The executor can use passwordless privilege escalation for the existing
/usr/localintegration-test paths and can reach Ansible Galaxy, the three application Git repositories, Snap infrastructure, and Go module sources. - Existing installed application state may be present. Each driver must remain repeatable from that state and restore its default role deployment through a best-effort cleanup trap.
- Audita exposes no native application-release identity command. Its tags
v0.9.0andv0.9.1currently resolve to the same commit. This plan deliberately omits an Audita version-selection test rather than substituting a raw-commit or Git-module assertion.
Repository Scope
Repositories that change:
ansible-role-seriatim: lean integration driver and verifier, removal of the unsupported-platform playbook, and accurate validation documentation.ansible-role-audita: lean integration driver and verifiers, removal of the unsupported-platform playbook, and accurate validation documentation.ansible-role-notarius: lean integration driver and verifiers, removal of the unsupported-platform playbook, and accurate validation documentation.- Workspace control repository: test-specific corrections to Features 0001, 0002, and 0003, remediation status, and cross-repository validation evidence.
Repositories that may be inspected but must remain unchanged:
../seriatim,../audita, and../notariusfor native CLI behavior.- Every other application, role, collection, and proof-of-concept repository.
Stage 1: Simplify the Seriatim Test Suite
Objective
Reduce Seriatim's integration suite to static validation and representative tests of default usability, explicit version selection, missing-binary recovery, caller-supplied Go, and clean repeated convergence.
Preconditions
- The workspace planning commit described above exists.
ansible-role-seriatimis clean atfb8dc41.- The existing
tests/integrationbaseline passes.
Owning Repository
ansible-role-seriatim
Required Changes
- Retain
tests/integrationas the single entry point, its private temporary directory, pinned collection installation, syntax check, production-profile ansible-lint, and best-effort cleanup convergence. - Retain a default role convergence as a smoke test. Exercise
/usr/local/bin/seriatim --versionsuccessfully without comparing it to the current default version, then immediately apply the default role again and require only the aggregate recapchanged=0andfailed=0. - Add or retain one explicit version-selection scenario using
seriatim_version: v1.4.0. Verify through the native CLI that the result is exactlyseriatim version v1.4.0. Do not resolve or assert the corresponding Git commit. - Combine missing-binary recovery and caller-supplied build tooling into one
representative scenario:
- create an executable temporary wrapper that records invocation and then
executes
/snap/bin/gowith the original arguments; - remove
/usr/local/bin/seriatim; - apply the role with
seriatim_version: v1.4.0,seriatim_manage_build_dependencies: false, andseriatim_go_binaryset to the wrapper; - require the wrapper log to show that the supplied executable was used;
- verify native output
seriatim version v1.4.0; and - immediately repeat with the same variables and require aggregate
changed=0andfailed=0.
- create an executable temporary wrapper that records invocation and then
executes
- Delete
tests/verify.ymland perform the narrow native version assertions directly in the shell driver. Do not retain source, commit, ownership, permission, file-type, or checksum inspection. - Remove the binary-mode mutation and repair scenario, every
require_changed_recapuse, every task-name or individual-status grep, the default and previous commit constants, redundant default-restoration assertions, and final duplicate shell assertions. - Delete
tests/unsupported.ymland remove it from lint and execution. Do not replace its distribution, release, or architecture cases. - Keep a cleanup trap that reapplies the default role and removes only the private temporary directory. Cleanup output may remain suppressed and must not become another behavioral assertion.
- Rewrite the README validation section to describe only the retained static checks and behavioral scenarios. Do not advertise exact-default, metadata, task-arrangement, or platform-matrix coverage.
Validation
Run:
tests/integration
git diff --check
git status --short
Expected result: static validation and every retained Seriatim scenario pass; the specified repeat runs report no changes; cleanup completes; and the only working-tree changes are the planned test and README edits.
Completion Criteria
- No test asserts Seriatim's current default version or a Git commit.
- No test inspects task names, individual task status, ownership, permissions, or the platform assertion branches.
- Explicit
v1.4.0selection is verified through Seriatim itself. - One scenario proves both missing-binary recovery and use of the configured Go executable, followed by a clean repeat.
- The complete integration entry point passes.
Commit
Commit intent: Simplify the Seriatim integration tests
Stage 2: Simplify the Audita Test Suite
Objective
Reduce Audita's integration suite to static validation and representative tests of default usability, native configuration validity, explicit configuration rendering, missing-binary recovery, caller-supplied Go, and clean repeated convergence.
Preconditions
- Stage 1 is complete and committed.
ansible-role-auditais clean at847c4c3.- The existing
tests/integrationbaseline passes.
Owning Repository
ansible-role-audita
Required Changes
- Retain
tests/integrationas the single entry point, its private temporary directory, pinned collection installation, syntax check, production-profile ansible-lint, and best-effort cleanup convergence. - Retain a default role convergence as a smoke test. Validate the managed
configuration with
/usr/local/bin/audita config validate --config /usr/local/etc/audita/config.yml, then immediately repeat the default role and require only aggregatechanged=0andfailed=0. - Replace the exhaustive configuration document and separate falsey scenario
with one representative explicit configuration. Supply these values:
audita_config_version: 1;audita_pipeline_modules: ["glossary"];audita_llm_proposal_base_url: "https://openrouter.ai/api/v1";audita_llm_proposal_model: "openrouter/google/gemma-4-31b-it";audita_llm_proposal_timeout: "10s";audita_llm_proposal_max_retries: 0;audita_context_description: "";audita_diagnostics_retention: "never";audita_llm_validation_model: null;audita_output_schema: null; andaudita_diagnostics_work_dir: null.
- In
tests/verify-config.yml, parse the rendered YAML and assert only that:versionis1;pipeline.modulesis["glossary"];- the selected proposal URL, model, timeout, and zero retry count are present;
- the empty context description and diagnostics retention value are present;
llm.validation,output, anddiagnostics.work_dirare absent; and- Audita's native configuration validation command succeeds. Do not compare the complete parsed document to an expected mapping.
- Immediately repeat the representative configuration convergence with the
same explicit variables and require aggregate
changed=0andfailed=0. - Combine missing-binary recovery and caller-supplied build tooling into one
representative scenario. Create a logging wrapper around
/snap/bin/go, remove/usr/local/bin/audita, converge withaudita_manage_build_dependencies: falseandaudita_go_binaryset to the wrapper, verify wrapper use, validate the managed configuration through Audita, and immediately repeat the same convergence with aggregatechanged=0andfailed=0. - Delete
tests/verify.ymland invoke Audita's native configuration validator directly from the shell driver for the smoke and recovery scenarios. Successful command completion is sufficient; do not separately assert the validator's fixed success text. - Remove the exact default configuration comparison, source-commit checks,
source/binary/configuration metadata checks, binary-mode repair scenario,
all
require_changed_recapuses, and every task-name or individual-status grep. - Remove the raw alternate-commit scenario entirely. Do not replace it with a
git rev-parse, tag-resolution, embedded-string, or Go build-metadata test. Do not add an Audita version-selection test until the application provides a stable native release-identity interface. - Delete
tests/unsupported.ymland remove it from lint and execution. Do not replace its platform cases. - Retain default restoration only in the cleanup trap. Remove its fixed commit, exact document, task-status, and extra idempotence assertions.
- Rewrite the README validation section to describe only the retained static checks and behavioral scenarios and to avoid claiming application-version, metadata, task-arrangement, or platform-matrix coverage.
Validation
Run:
tests/integration
git diff --check
git status --short
Expected result: static validation and every retained Audita scenario pass; both default and representative configurations validate natively; the specified repeats report no changes; cleanup completes; and the only working-tree changes are the planned test and README edits.
Completion Criteria
- No test asserts Audita's current default, a source commit, or a complete rendered configuration document.
- No test inspects task traces, trusted-module postconditions, or platform assertion branches.
- One focused explicit case proves representative nesting, null omission, and falsey preservation and passes Audita's validator.
- One scenario proves both missing-binary recovery and use of the configured Go executable, followed by a clean repeat.
- The absence of native Audita version coverage is documented accurately and is not replaced by an implementation proxy.
- The complete integration entry point passes.
Commit
Commit intent: Simplify the Audita integration tests
Stage 3: Simplify the Notarius Test Suite
Objective
Reduce Notarius's integration suite to static validation and representative tests of default usability, explicit version selection, missing-binary recovery, caller-supplied Go, configuration behavior, caller-side pipeline composition, native validation, and clean repeated convergence.
Preconditions
- Stages 1 and 2 are complete and committed.
ansible-role-notariusis clean ateb4f511.- The existing
tests/integrationbaseline passes.
Owning Repository
ansible-role-notarius
Required Changes
- Retain
tests/integrationas the single entry point, its private temporary directory, pinned collection installation, syntax check, production-profile ansible-lint, and best-effort cleanup convergence. - Retain a default convergence as a smoke test. Require
/usr/local/bin/notarius --versionand/usr/local/bin/notarius config validate --config /usr/local/etc/notarius/config.ymlto succeed without comparing the version output or complete configuration to current defaults. Immediately repeat the default role and require only aggregatechanged=0andfailed=0. - Retain one explicit version-selection scenario with
notarius_version: v0.5.0and verify exact native outputnotarius v0.5.0. Do not resolve or assert the corresponding Git commit. - Combine missing-binary recovery and caller-supplied build tooling into one
scenario. Create a logging wrapper around
/snap/bin/go, remove/usr/local/bin/notarius, converge withnotarius_version: v0.5.0,notarius_manage_build_dependencies: false, andnotarius_go_binaryset to the wrapper, verify wrapper use and native outputnotarius v0.5.0, then immediately repeat with aggregatechanged=0andfailed=0. - Replace the exhaustive configuration, separate profile-source cases,
separate falsey case, and separate pipeline-composition case with one
representative explicit configuration. Define two caller-side pipeline
mappings and set
notarius_pipelinesto their ordinarycombineresult. Supply these additional values:notarius_config_version: 4;notarius_promptkit_local_backend_endpoint: "http://localhost:8000/v1";notarius_promptkit_local_backend_concurrency_limit: 0;notarius_cache_checkpoints_enabled: false;notarius_cache_chunk_plans_directory: "";notarius_output_directory: "/tmp/notarius-output";notarius_promptkit_profile_dir: null;notarius_promptkit_profile_file: null; andnotarius_debug_directory: null. Use the two validdnd-sessionanddnd-archivepipeline definitions from the existing composition scenario.
- In
tests/verify-config.yml, parse the rendered YAML and assert only that:versionis4;- local-backend endpoint and zero concurrency are present;
- checkpoints are explicitly disabled and the empty chunk-plan directory is present;
- the selected output directory is present;
- both composed pipeline IDs and their supplied definitions are present without rewriting;
promptkit.profile_dir,promptkit.profile_file, and the top-leveldebugsection are absent; and- Notarius's native configuration validation succeeds. Do not compare the complete document to an expected mapping.
- Immediately repeat the representative configuration convergence with the
same explicit variables and require aggregate
changed=0andfailed=0. - Delete
tests/verify.yml. Perform native CLI smoke, configuration validation, and the explicitv0.5.0comparison directly in the shell driver. - Remove current-default version and commit assertions, complete default
configuration comparisons, all source/binary/configuration metadata checks,
the binary-mode repair scenario, every
require_changed_recapuse,require_configuration_change_without_build, and every task-name or individual-status grep. - Delete the standalone
profile_dirandprofile_filescenarios. Their simple leaf mappings do not require dedicated replacements. - Delete
tests/unsupported.ymland remove it from lint and execution. Do not replace its platform cases. - Retain default restoration only in the cleanup trap and remove duplicate final assertions.
- Rewrite the README validation section to describe only the retained static checks and behavioral scenarios. Do not advertise current-default, metadata, task-arrangement, profile-branch, or platform-matrix coverage.
Validation
Run:
tests/integration
git diff --check
git status --short
Expected result: static validation and every retained Notarius scenario pass; the explicit tag is verified through Notarius; representative falsey, null, and composed-pipeline behavior is verified and validates natively; the specified repeats report no changes; cleanup completes; and only the planned test and README changes remain.
Completion Criteria
- No test snapshots Notarius's current default release, commit, or complete default configuration.
- No test inspects task traces, trusted-module postconditions, or platform assertion branches.
- Explicit
v0.5.0selection is verified through Notarius itself. - One scenario proves both missing-binary recovery and use of the configured Go executable, followed by a clean repeat.
- One representative configuration case proves null omission, falsey preservation, caller-side pipeline composition, and native validity.
- The complete integration entry point passes.
Commit
Commit intent: Simplify the Notarius integration tests
Stage 4: Reconcile Workspace Documentation and Validate the Suite
Objective
Align durable test-specific roadmap language with the canonical testing policy, record the remediation implementation for review, and validate all three lean suites together.
Preconditions
- Stages 1 through 3 are complete and committed in their owning repositories.
- The workspace repository is clean at the planning commit created before Stage 1.
- The three role repositories contain only their committed remediation changes.
Owning Repository
Workspace control repository (ansible-workspace-dnd)
Required Changes
- Revise only test-specific language in Features 0001, 0002, and 0003. Retain their durable production requirements, including current defaults, paths, ownership, permissions, platform support, and convergence behavior.
- In Feature 0001, describe the exact native version assertion as coverage of an explicitly selected immutable tag rather than an assertion about the role's current default.
- In Feature 0002, remove the incorrect claim that tests execute Audita to verify its installed application version. State that the current CLI has no native release-identity command and that the suite deliberately avoids a raw-commit proxy. Retain native configuration validation.
- In Feature 0003, describe exact version coverage using explicitly selected
v0.5.0, not the current defaultv0.6.0. Keep the current default as a production requirement rather than a frozen test expectation. - Remove any implication in the three roadmaps that each platform assertion must have a negative integration-test matrix. Do not remove platform support itself from scope or acceptance criteria.
- Update
docs/roadmap/test-suite-audit-findings.mdto say remediation was implemented and is pending review. Add the three role commit hashes and the final validation results; do not erase the audit classifications. - Update
docs/status.mdsoR0001remainsin_progresspending review, its evidence names the three role commits, and the current focus is review of the implemented test-suite remediation. Do not mark remediationdone. - Add concise progress notes to this plan with the four stage commits and any deviations. Do not replace the active plan with a pending notice before review.
Validation
Run sequentially from the workspace root:
(cd ansible-role-seriatim && tests/integration)
(cd ansible-role-audita && tests/integration)
(cd ansible-role-notarius && tests/integration)
git diff --check
scripts/status
Expected result: all static and behavioral checks pass; every role cleanup path completes; the three role repositories are clean and contain their remediation commits; no unrelated repository changed; and the workspace has only the planned documentation changes before its stage commit.
Completion Criteria
- All three full integration suites pass sequentially from the workspace.
- Feature roadmaps distinguish production defaults from stable test inputs.
- Audita's native version limitation is stated accurately.
- Audit findings contain implementation and validation evidence without being rewritten as an implementation log.
- Workspace status leaves remediation pending review.
- Every repository changed by the implementation is clean after its owning commit.
Commit
Commit intent: Record the test suite remediation results
Final Validation and Handoff
- Report the Stage 1 through Stage 4 commit hashes and confirm the working-tree
state of every repository in
workspace.yml. - Summarize the retained scenarios for each role and identify any deviation from this plan.
- Report the Audita version-identity limitation; do not silently fill it with a source-control assertion.
- Report all validation commands and results.
- Do not push commits unless the user separately authorizes a push.
- Do not mark
R0001done or replace this plan with a pending notice. Final completion requires review of the implemented suites.
Progress Notes
- Planning complete; implementation has not started.
- Stage 1 complete —
ansible-role-seriatimcommite08c63c; fulltests/integrationpassed. No deviations. - Stage 2 complete —
ansible-role-auditacommitd2d0b9d; fulltests/integrationpassed. No deviations. - Stage 3 complete —
ansible-role-notariuscommitcfecf37; fulltests/integrationpassed. No deviations.