Rule: When a derisking spike hits its kill-condition on a SPECIFIC tool / mechanism / pathway, SURFACE ALTERNATIVES BEFORE collapsing the whole synthesis option to its documented fallback. The kill-condition is about the predefined pathway; alternatives may exist that satisfy the underlying intent through a different mechanism.
Pattern (concrete; from S2 → S2.5 2026-05-02 BST):
| Phase | Action | Outcome |
|---|---|---|
| 1. Kill-condition hits | S2: schema-automator+funowl fails on CCO/IAO/IOF (3 distinct hard-fail modes; 21s combined wall-clock) | Original Layer 1 mechanism INFEASIBLE in 2026 |
| 2. STOP + surface alternatives | S2.5 mini-spike: test alternative OWL loaders (owlready2 + py-horned-owl + rdflib) | ~30-60 min investment |
| 3. Test alternatives against same kill-condition | owlready2 0.50 reads all 3 ontologies in 1.2s combined | Alternative loader VALIDATED |
| 4. End-to-end pipeline test on alternative | ~100-line emitter PoC + gen-pydantic + gen-typescript + gen-json-schema; 9 i-ζ classes instantiate with MRO to BFO root | Distinctiveness PRESERVED |
| 5. Cost-row update reflects alternative | ~16-24h emitter author vs ~10h hand-curation = +£500-1K | Rounding-error vs acquirer-narrative-value |
Why: Synthesis options like ε.ι (ε.ε baseline + LinkML structured_imports + OntoUML phase + OntoGPT) derive their VALUE from the combination of distinguishing components. If component A fails and you immediately fall back to baseline, you lose the entire synthesis premise. But “component A through tool X fails” ≠ “component A is infeasible” — there may be tool Y that does the same job. The synthesis dies only if ALL plausible alternatives fail.
Per Rich-directive 2026-05-02T~11:50 BST after S2 MITIGATED: “S2 was not a success. i believe we should try to find alternatives now”. This directive operationalised the pattern. Forward action: every spike kill-condition-met outcome triggers an automatic ~30-60 min alternatives mini-spike before fallback collapse.
How to apply:
-
In spike kill-condition handling — when a kill-condition is met for a specific tool/mechanism, do NOT immediately mark
maturity: outcome-MITIGATEDand execute the predefined fallback. FIRST run a short alternatives mini-spike (~30-60 min):- Identify 2-3 alternative tools that perform the same role
- Run smoke tests against the same inputs that broke the original tool
- If at least one alternative passes the smoke test, run an end-to-end pipeline test on that alternative
- If alternative validates: mark T-file
maturity: outcome-VALIDATED(distinguishes from MITIGATED; the synthesis option survives) - If all alternatives fail: only THEN mark
maturity: outcome-MITIGATEDwith documented fallback + alternatives-tried list in T-file §6 honesty caveats
-
In subagent prompts for spike dispatch — explicitly require alternatives-first discipline. Per the S3 prompt 2026-05-02 BST: “If S3 hits its kill condition (annotation-transfer fails at any codegen layer OR Catala scope-binding can’t reference annotation metadata), DO NOT immediately drop OntoUML phase to fallback
slot_usage: { active: false }boolean. FIRST surface alternatives […] ONLY collapse to fallback if ALL alternatives fail.” -
In cost-modelling at lock-time — alternatives-path cost ≠ baseline-fallback cost. Lock decision should compare:
- Synthesis-via-original-tool: infeasible (kill-condition-met)
- Synthesis-via-alternative-tool: usually +N% one-shot cost; preserves distinctiveness (use this for lock)
- Baseline-fallback: collapses distinctiveness; usually represents what ε.ε / ω.η alone would give
-
In documentation — T-files for kill-condition-met spikes that surfaced alternatives should be SUPERSEDED-BY-S{N}.5 with the rescue spike’s T-file as the lock-time reference. arch-state §11 + Q-* file should mark the original spike row as SUPERSEDED-BY-S{N}.5.
-
Mini-spike numbering — adopt SX.5 convention (S2 → S2.5; S5 → S5.5 if needed). Doesn’t need its own slot in the plan; it’s a follow-on to the parent spike triggered by kill-condition-met.
Boundary tests (when this rule fires STRONGLY):
- ✓ Synthesis options where component A failure would collapse distinctiveness to baseline
- ✓ Tool-specific kill-conditions (e.g. “schema-automator broken” not “auto-import infeasible”)
- ✓ Components where 2+ alternative tools/approaches plausibly exist (OWL loaders; codegen pipelines; Catala scope-binding patterns; etc.)
- ✓ Pre-lock decisions where a 30-60 min mini-spike could change the lock-time framing
Boundary tests (when this rule does NOT apply):
- ✓ Genuine kill-conditions where the FUNCTIONAL category is broken (not just the specific tool) — e.g. “Catala 1.1.0 doesn’t compile on WSL” is tool-specific; “no formal-verification language can express English-IHT-rules at acceptable expressiveness” is category-level.
- ✓ Spike outcomes where the synthesis baseline is already strong + the additional component is gravy (in which case the alternatives-mini-spike is optional)
- ✓ Time-pressured lock-decisions where 30-60 min isn’t available
Codification trigger: Rich-directive 2026-05-02T~11:50 BST after S2 MITIGATED outcome surfaced concern that ε.ι Layer 1 distinctiveness collapsed to ω.η pattern under the predefined fallback. S2.5 mini-spike validated owlready2 alternative; ε.ι Layer 1 reinstated. Pattern fully validated; codified now.
Related memories:
project_zeta_q3_eps_iota_S2_2026_05_02.md— S2 MITIGATED outcome (the trigger)project_zeta_q3_eps_iota_S2_5_owlready2_rescue_2026_05_02.md— S2.5 alternatives-first rescuefeedback_bold_front_loaded_synthesis_preference.md— synthesis-over-baseline preference for foundational decisionsfeedback_iri_verification_before_lock.md— analogous pre-lock-validation discipline for IRI choices
Forward integration:
- Refined-prompt v3.6 candidate: add “alternatives-first” sub-clause to Step 6e SPIKES (or new Step 11 after kill-condition handling)
- Plan §0 logging contract: add post-kill-condition step “run alternatives mini-spike before fallback execution”
- Frontmatter contract §1.1: add
alternatives_tried:list field for MITIGATED outcomes