Skip to content
Closed
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6088cc4
Strengthen APMLifecycle observation and modeling
Copilot Sep 4, 2026
36a2996
Merge remote-tracking branch 'origin/main' into copilot/analyze-apmli…
Copilot Sep 4, 2026
bd5f9fa
Enforce generated lifecycle write sets
Copilot Sep 4, 2026
97c9024
Keep lifecycle gap ledger extensible
Copilot Sep 4, 2026
3b20446
Harden lifecycle contract introspection
Copilot Sep 4, 2026
9cc1b09
Use exact dry-run evidence
Copilot Sep 4, 2026
7ca6f65
Merge remote-tracking branch 'origin/main' into copilot/apmlifecycle-…
Copilot Sep 5, 2026
f810c51
Add exhaustive lifecycle routing interactions
Copilot Sep 5, 2026
23e9217
Merge remote-tracking branch 'origin/main' into copilot/apmlifecycle-…
Copilot Sep 5, 2026
fb33889
test: checkpoint lifecycle models, interactions and evidence
danielmeppiel Sep 5, 2026
d83a3a6
Merge current main into lifecycle checkpoint
danielmeppiel Sep 5, 2026
3c410e8
Merge main before lifecycle mutation checkpoint
danielmeppiel Sep 5, 2026
8499f49
test(lifecycle): prove and gate bounded source mutations
danielmeppiel Sep 5, 2026
fbb7244
Merge main before framework review folds
danielmeppiel Sep 6, 2026
14403a6
test(lifecycle): bind audit and routing credit to authored intent
danielmeppiel Sep 6, 2026
63624b0
test(lifecycle): bind mutation kills to exact fixture effects
danielmeppiel Sep 6, 2026
d3677f8
test(lifecycle): preserve obligations and rejected evidence
danielmeppiel Sep 6, 2026
03384f7
test(lifecycle): isolate Copilot fixture Git identity
danielmeppiel Sep 6, 2026
7fae43d
test(lifecycle): bind model audit credit to independent intent
danielmeppiel Sep 7, 2026
699f8e5
test(lifecycle): isolate shared native execution and attribute refusals
danielmeppiel Sep 7, 2026
468756b
test(lifecycle): require tag advancement and release malformed XML trees
danielmeppiel Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ jobs:
tests/quality/test_test_taxonomy.py \
tests/quality/test_quality_baselines.py \
tests/quality/test_lifecycle_bug_ledger.py \
tests/quality/test_lifecycle_interaction_coverage.py \
tests/quality/test_ci_topology.py

- name: Run bounded architecture scaling gate
Expand Down
4 changes: 3 additions & 1 deletion docs/src/content/docs/contributing/integration-testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ APM uses a tiered approach to integration testing:
- **Fixture controls**: lifecycle helpers set `APM_TEST_LOOPBACK_PORTS` for a port-scoped local registry and `APM_TEST_FAIL_LOCK_REPLACE=1` for atomic-write fault injection. These are internal test controls, not user-facing APM settings.
- **Learning ledger**: `tests/fixtures/lifecycle_bug_ledger.json` records representative escaped defects, their generalized laws, oracle tiers, implementation phases, and executable regression node IDs. It is deliberately not a bug-count census; `tests/quality/test_lifecycle_bug_ledger.py` validates its taxonomy and links in the required ratchet job.
- **Generated lifecycle model**: `test_generated_lifecycle_state_machine.py` uses Hypothesis to generate guarded install, dry-run, audit, tamper, repair, declaration, and prune sequences against the real CLI. The model tracks declaration, materialization, integrity, and lock state independently of the product lockfile. Every transition captures complete project and user roots, and mutating commands must stay inside reviewed write sets. It stays in the merge-group family until hosted runtime supports promotion to the bounded PR-time smoke set.
- **Known gap**: a late lockfile replacement failure can leave target files on the newly declared target while retaining the prior lockfile. The required lifecycle suite bounds that blast radius and proves the next install converges; expanding the install transaction is a separate design decision recorded in the ledger.
- **Routing-cell coverage**: `test_primitive_target_covering_array.py` derives rows from `KNOWN_TARGETS` and exercises every valid primitive, target, and project/user-scope cell. Each install and uninstall must stay within reviewed project and user trees, and each reinstall must be byte-stable unless the cell is an explicit known gap. `tests/quality/test_lifecycle_interaction_coverage.py` is the required, subprocess-free ratchet: it checks complete catalog coverage, unique row IDs, and a 100-cell runtime ceiling. The executable rows remain merge-group-only.
- **Known gap (lockfile replacement)**: a late lockfile replacement failure can leave target files on the newly declared target while retaining the prior lockfile. The required lifecycle suite bounds that blast radius and proves the next install converges; expanding the install transaction is a separate design decision.
- **Known gap (Copilot user instructions)**: a repeated global Copilot instruction install adds a duplicate block under the lock identity before a third install converges byte-stable. The covering array restricts the second-pass changes to the lockfile and instruction file, asserts the duplicate exactly, and requires third-pass convergence. Unifying remote and lock identities is a separate production fix. Both known gaps are recorded in `tests/fixtures/lifecycle_bug_ledger.json`.
- **Run it locally** (the exact command CI runs):
```bash
APM_E2E_TESTS=1 uv run --extra dev pytest -p no:cacheprovider -q --strict-markers \
Expand Down
7 changes: 7 additions & 0 deletions tests/fixtures/lifecycle_bug_ledger.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,13 @@
"properties": ["transaction.failed_command_preserves_state"],
"bounded_by": "tests/integration/test_required_lifecycle_state_machine.py::test_required_failed_lock_write_bounds_partial_state_and_recovers",
"next_decision": "Full install transaction expansion remains deferred with phases 2-4."
},
{
"id": "copilot-user-instruction-second-pass-convergence",
"summary": "The first repeated global Copilot instruction install adds a duplicate block under the lock identity before a third install converges.",
"properties": ["idempotency.byte_stable", "ownership.preserve_unowned"],
"bounded_by": "tests/integration/test_primitive_target_covering_array.py::test_primitive_target_covering_array",
"next_decision": "Unify remote and lock identities for user-root instruction ownership in a focused production fix."
}
]
}
Loading
Loading