Skip to content

Add zslice_asym variant: upgrade-only override (negative — subagent has no signal) - #4

Closed
trisha-ant wants to merge 2 commits into
trisha/gently-zslice-variantfrom
trisha/gently-zslice-asym
Closed

Add zslice_asym variant: upgrade-only override (negative — subagent has no signal)#4
trisha-ant wants to merge 2 commits into
trisha/gently-zslice-variantfrom
trisha/gently-zslice-asym

Conversation

@trisha-ant

Copy link
Copy Markdown
Owner

Stacked on #3 (which is stacked on #2, #1).

Why

The symmetric zslice variant (#3) regressed pretzel 88%→7% because the segment-counting subagent returns ≤2 on almost every midplane slice — body folds sit at different z-depths, so a single plane rarely intersects 3+ segments at separable locations. This variant tests whether an upgrade-only override (1.5fold→2fold→pretzel, never backward) can salvage any signal while capping the pretzel downside.

What

perception/zslice_asym.py (59 lines), registered as zslice_asym:

  • Reuses _count_segments / _segment_count_to_stage from zslice.py.
  • Triggers only on primary ∈ {1.5fold, 2fold} (pretzel passes through — nothing to upgrade to).
  • Applies the override only if _FOLD_ORDER[sub_stage] > _FOLD_ORDER[primary.stage]; otherwise keeps primary and notes the count.

Result (n=233 hard-stage frames, 4 embryos partial)

Stage scientific zslice (sym) zslice_asym
1.5fold (41) 65.9% 51.2% 19.5%
2fold (59) 61.0% 59.3% 79.7%
pretzel (133) 88.0% 6.8% 85.0%
Overall 77.3% 27.9% 72.1%
Adjacent 99.6% 89.3% 100%

Override attribution (the headline per-stage swings are misleading):

  • Subagent triggered on 88/233 frames; segment-count distribution {1:40, 2:46, 3:2}.
  • Override actually fired only 7 times — all 7 wrong (5× 1.5fold→2fold on GT=1.5fold, 2× 2fold→pretzel on GT=2fold). Net contribution: −3.0%.
  • The large 1.5fold/2fold swings vs scientific are run-to-run variance in the primary classifier, not the override.

Conclusion

Asymmetric design works as intended for damage control — pretzel holds at 85%, adjacent accuracy is restored to 100%. But the segment-counting subagent itself carries no usable signal: it returns ≤2 in 86/88 calls regardless of true stage. The midplane-slice approach is dead; remaining paths are multi-plane max-count or a different subagent task.

Verification

  • Import + registration: 17 variants, _accepted_optional_kwargs(zslice_asym) == {'midplane_b64'}.
  • Ablation run end-to-end on 233 frames; result JSON + chart committed.
  • Override-attribution computed from reasoning field in saved predictions.

Same segment-counting subagent as zslice, but only applies the override when
the count maps to a *later* stage than the primary (1.5fold->2fold->pretzel).
Trigger excludes pretzel since there is nothing to upgrade to, so the worst
case on pretzel is parity with scientific. Targets the 1.5fold/2fold gap
without the catastrophic pretzel downgrade observed in the symmetric variant.
…gent has no signal

Overall 72.1% vs scientific 77.3% (n=233). Asymmetric design successfully
caps the pretzel catastrophe (85% vs 7% for symmetric zslice), but
attribution shows the override itself only fired 7 times and was wrong every
time (5x 1.5fold->2fold on GT=1.5fold, 2x 2fold->pretzel on GT=2fold).

Segment-count distribution across 88 triggers: {1:40, 2:46, 3:2} -- the
subagent returns <=2 in 98% of cases regardless of true stage, because a
single midplane slice genuinely doesn't show >2 separable cross-sections.
The large per-stage swings (1.5fold -46, 2fold +19) are run-to-run variance
in the primary classifier, not the override.

Conclusion: midplane segment-counting carries no signal; multi-plane
sampling or a different subagent task is the remaining path.
@trisha-ant

Copy link
Copy Markdown
Owner Author

Subsumed into #5 — all commits are in that branch and the retrospective there covers this variant.

@trisha-ant trisha-ant closed this Apr 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant