4.8 KiB
Task 5A validation — frontend PPI owner state and isolation
Date: 2026-07-21
Target: planai5090:/home/xzq/5090/PlantAI-dev4090-7/PlantAI-dev
Gate result: PASS
Scope
Task 5A changes only the frontend owner state machine and request isolation. Ortholog reuse sidecars and backend producer identity are explicitly deferred to Task 5B. No backend algorithm, Task 6 status/manifest behavior, service process, or real reference download was changed.
TDD evidence
The original focused suite reproduced the known state as 3 passed, 1 failed.
After adding owner-state requirements before implementation, the focused suite
was RED with 3 passed, 6 failed. The six failures independently covered:
- explicit
confirmation_requiredhandling and second preflight; - PPI-owner-only selection storage;
- owner fields read by the dependency request;
- download completion owner writeback;
- At fallback defaulting to unselected;
- PPI and KaKs owner isolation.
After the minimal frontend implementation:
tests/unit/test_ppi_owner_scheduling_task5.py
9 passed in 18.64s
The first frontend/task regression run produced 41 passed, 1 failed; the
failure was an obsolete assertion requiring recovered PPI reference data to be
written into shared ppiKaksReferenceSpecies. That assertion directly
contradicted the approved Task 5 isolation contract and was migrated to require
PPI-owner-only fields. The bounded rerun passed:
tests/unit/test_ppi_frontend_display_contract.py
tests/unit/test_task_status_attachment.py
tests/unit/test_ppi_owner_scheduling_task5.py
42 passed in 14.31s
Verified behavior
- A
confirmation_requiredresponse displays backend candidates in their original order, including TaxID, LCA, topology distance, and STRING version. - Confirmation writes only
ppiReferenceTaxonId,ppiReferenceStorageKey,ppiReferenceSelectionMode,ppiReferenceUserConfirmed, anddependencyOwner="ppi", then performs a second preflight. - Cancellation pauses PPI without submitting Ortholog or PPI.
- Batch, plan, PPI stage, and request owner fields are synchronized without
adding the PPI selection to shared
referenceSpecies,refSpeciesList,ppiKaksReferenceSpecies, or scope mode. - PPI and KaKs build separate owner requests. KaKs receives no PPI owner TaxID or storage key.
- Synchronous and asynchronous reference-download completion reapply the PPI owner selection. Shared reference merging remains only inside the explicit KaKs branch.
- The Arabidopsis model fallback defaults to
skip;model_fallbackowner state is written only after an explicitathdecision. - Selecting a generic project reference is rejected for PPI instead of leaking it into the PPI owner.
Deferred to Task 5B
- PPI-owned Ortholog storage-key consumption in the backend producer.
- Ortholog run sidecar with reference TaxID, reference PEP SHA256, target/member identity, mapping identity, and mapping path.
- Strict final/intermediate mapping reuse by exact identity.
No service restart or real download was performed.
P0 review revision
The first Task 5A review requested three additional behavior-level gates. Three Node-backed tests were added before implementation; all three were RED because the pure final-request and post-download orchestration helpers did not yet exist.
The dynamic tests execute helper source extracted from the shipped
index.html, rather than only checking for source strings:
- A final PPI request retains all five owner fields, removes legacy technical reference fields, and preserves a legitimate project analysis scope.
- A simulated PPI + KaKs batch proves the PPI request cannot see
KaKsRef. - A simulated post-download/post-fallback preflight returning
needs_orthologrecords the call orderortholog, thenresume.
Incremental GREEN evidence:
final PPI request + joint owner isolation: 2 passed
post-reference orchestration: 1 passed
full Task 5A focused suite: 12 passed in 13.53s
The final bounded frontend/task regression passed:
tests/unit/test_ppi_frontend_display_contract.py
tests/unit/test_task_status_attachment.py
tests/unit/test_ppi_owner_scheduling_task5.py
45 passed in 16.56s
The final request path now applies PPI owner fields after gene-family context
construction. PPI no longer participates in the legacy technical-reference
override used by Ortholog and KaKs. This preserves legitimate project
referenceSpecies, refSpeciesList, and scope identity while preventing
ppiKaksReferenceSpecies, ppiReferenceSpecies, and
referenceBundleSpecies from entering the PPI request.
Both synchronous and asynchronous download completion, and the explicitly
confirmed At fallback, now re-enter PPI owner preflight orchestration. A
needs_ortholog result must successfully insert or reuse the Ortholog producer
before paused PPI work is resumed.