512 lines
23 KiB
Markdown
512 lines
23 KiB
Markdown
# 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.md` and 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=0` checks 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-seriatim` starts clean at `fb8dc41`.
|
|
- `ansible-role-audita` starts clean at `847c4c3`.
|
|
- `ansible-role-notarius` starts clean at `eb4f511`.
|
|
- The workspace `.venv` provides Ansible Core and ansible-lint, and the local
|
|
Ubuntu 26.04 `x86_64` host remains the approved MVP integration proxy.
|
|
- The executor can use passwordless privilege escalation for the existing
|
|
`/usr/local` integration-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.0` and `v0.9.1` currently 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 `../notarius` for 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-seriatim` is clean at `fb8dc41`.
|
|
- The existing `tests/integration` baseline passes.
|
|
|
|
### Owning Repository
|
|
|
|
`ansible-role-seriatim`
|
|
|
|
### Required Changes
|
|
|
|
1. Retain `tests/integration` as the single entry point, its private temporary
|
|
directory, pinned collection installation, syntax check, production-profile
|
|
ansible-lint, and best-effort cleanup convergence.
|
|
2. Retain a default role convergence as a smoke test. Exercise
|
|
`/usr/local/bin/seriatim --version` successfully without comparing it to the
|
|
current default version, then immediately apply the default role again and
|
|
require only the aggregate recap `changed=0` and `failed=0`.
|
|
3. Add or retain one explicit version-selection scenario using
|
|
`seriatim_version: v1.4.0`. Verify through the native CLI that the result is
|
|
exactly `seriatim version v1.4.0`. Do not resolve or assert the corresponding
|
|
Git commit.
|
|
4. 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/go` with the original arguments;
|
|
- remove `/usr/local/bin/seriatim`;
|
|
- apply the role with `seriatim_version: v1.4.0`,
|
|
`seriatim_manage_build_dependencies: false`, and
|
|
`seriatim_go_binary` set 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=0` and `failed=0`.
|
|
5. Delete `tests/verify.yml` and perform the narrow native version assertions
|
|
directly in the shell driver. Do not retain source, commit, ownership,
|
|
permission, file-type, or checksum inspection.
|
|
6. Remove the binary-mode mutation and repair scenario, every
|
|
`require_changed_recap` use, every task-name or individual-status grep, the
|
|
default and previous commit constants, redundant default-restoration
|
|
assertions, and final duplicate shell assertions.
|
|
7. Delete `tests/unsupported.yml` and remove it from lint and execution. Do not
|
|
replace its distribution, release, or architecture cases.
|
|
8. 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.
|
|
9. 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:
|
|
|
|
```text
|
|
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.0` selection 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-audita` is clean at `847c4c3`.
|
|
- The existing `tests/integration` baseline passes.
|
|
|
|
### Owning Repository
|
|
|
|
`ansible-role-audita`
|
|
|
|
### Required Changes
|
|
|
|
1. Retain `tests/integration` as the single entry point, its private temporary
|
|
directory, pinned collection installation, syntax check, production-profile
|
|
ansible-lint, and best-effort cleanup convergence.
|
|
2. 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 aggregate
|
|
`changed=0` and `failed=0`.
|
|
3. 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`; and
|
|
- `audita_diagnostics_work_dir: null`.
|
|
4. In `tests/verify-config.yml`, parse the rendered YAML and assert only that:
|
|
- `version` is `1`;
|
|
- `pipeline.modules` is `["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`, and `diagnostics.work_dir` are absent; and
|
|
- Audita's native configuration validation command succeeds.
|
|
Do not compare the complete parsed document to an expected mapping.
|
|
5. Immediately repeat the representative configuration convergence with the
|
|
same explicit variables and require aggregate `changed=0` and `failed=0`.
|
|
6. 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 with
|
|
`audita_manage_build_dependencies: false` and `audita_go_binary` set to the
|
|
wrapper, verify wrapper use, validate the managed configuration through
|
|
Audita, and immediately repeat the same convergence with aggregate
|
|
`changed=0` and `failed=0`.
|
|
7. Delete `tests/verify.yml` and 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.
|
|
8. Remove the exact default configuration comparison, source-commit checks,
|
|
source/binary/configuration metadata checks, binary-mode repair scenario,
|
|
all `require_changed_recap` uses, and every task-name or individual-status
|
|
grep.
|
|
9. 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.
|
|
10. Delete `tests/unsupported.yml` and remove it from lint and execution. Do not
|
|
replace its platform cases.
|
|
11. Retain default restoration only in the cleanup trap. Remove its fixed
|
|
commit, exact document, task-status, and extra idempotence assertions.
|
|
12. 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:
|
|
|
|
```text
|
|
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-notarius` is clean at `eb4f511`.
|
|
- The existing `tests/integration` baseline passes.
|
|
|
|
### Owning Repository
|
|
|
|
`ansible-role-notarius`
|
|
|
|
### Required Changes
|
|
|
|
1. Retain `tests/integration` as the single entry point, its private temporary
|
|
directory, pinned collection installation, syntax check, production-profile
|
|
ansible-lint, and best-effort cleanup convergence.
|
|
2. Retain a default convergence as a smoke test. Require
|
|
`/usr/local/bin/notarius --version` and
|
|
`/usr/local/bin/notarius config validate --config /usr/local/etc/notarius/config.yml`
|
|
to succeed without comparing the version output or complete configuration
|
|
to current defaults. Immediately repeat the default role and require only
|
|
aggregate `changed=0` and `failed=0`.
|
|
3. Retain one explicit version-selection scenario with
|
|
`notarius_version: v0.5.0` and verify exact native output
|
|
`notarius v0.5.0`. Do not resolve or assert the corresponding Git commit.
|
|
4. 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 with `notarius_version: v0.5.0`,
|
|
`notarius_manage_build_dependencies: false`, and `notarius_go_binary` set to
|
|
the wrapper, verify wrapper use and native output `notarius v0.5.0`, then
|
|
immediately repeat with aggregate `changed=0` and `failed=0`.
|
|
5. 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_pipelines` to their ordinary `combine` result.
|
|
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`; and
|
|
- `notarius_debug_directory: null`.
|
|
Use the two valid `dnd-session` and `dnd-archive` pipeline definitions from
|
|
the existing composition scenario.
|
|
6. In `tests/verify-config.yml`, parse the rendered YAML and assert only that:
|
|
- `version` is `4`;
|
|
- 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-level
|
|
`debug` section are absent; and
|
|
- Notarius's native configuration validation succeeds.
|
|
Do not compare the complete document to an expected mapping.
|
|
7. Immediately repeat the representative configuration convergence with the
|
|
same explicit variables and require aggregate `changed=0` and `failed=0`.
|
|
8. Delete `tests/verify.yml`. Perform native CLI smoke, configuration
|
|
validation, and the explicit `v0.5.0` comparison directly in the shell
|
|
driver.
|
|
9. 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_recap` use,
|
|
`require_configuration_change_without_build`, and every task-name or
|
|
individual-status grep.
|
|
10. Delete the standalone `profile_dir` and `profile_file` scenarios. Their
|
|
simple leaf mappings do not require dedicated replacements.
|
|
11. Delete `tests/unsupported.yml` and remove it from lint and execution. Do not
|
|
replace its platform cases.
|
|
12. Retain default restoration only in the cleanup trap and remove duplicate
|
|
final assertions.
|
|
13. 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:
|
|
|
|
```text
|
|
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.0` selection 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
|
|
|
|
1. 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.
|
|
2. 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.
|
|
3. 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.
|
|
4. In Feature 0003, describe exact version coverage using explicitly selected
|
|
`v0.5.0`, not the current default `v0.6.0`. Keep the current default as a
|
|
production requirement rather than a frozen test expectation.
|
|
5. 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.
|
|
6. Update `docs/roadmap/test-suite-audit-findings.md` to 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.
|
|
7. Update `docs/status.md` so `R0001` remains `in_progress` pending review, its
|
|
evidence names the three role commits, and the current focus is review of
|
|
the implemented test-suite remediation. Do not mark remediation `done`.
|
|
8. 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:
|
|
|
|
```text
|
|
(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 `R0001` done or replace this plan with a pending notice. Final
|
|
completion requires review of the implemented suites.
|
|
|
|
## Progress Notes
|
|
|
|
- Planning complete; implementation has not started.
|
|
- [x] Stage 1 complete — `ansible-role-seriatim` commit `e08c63c`; full
|
|
`tests/integration` passed. No deviations.
|
|
- [x] Stage 2 complete — `ansible-role-audita` commit `d2d0b9d`; full
|
|
`tests/integration` passed. No deviations.
|
|
- [x] Stage 3 complete — `ansible-role-notarius` commit `cfecf37`; full
|
|
`tests/integration` passed. No deviations.
|