Nick
ca4f7593d7
feat(corrections): #314 defect fix, credential rotation, release guard, task lifecycle, route scoping, PL1 records + metrics
...
CI Pipeline / best-practices (push) Successful in 8s
Auto-version and Release / release (push) Failing after 14s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / lint (push) Failing after 34s
CI Pipeline / canary (push) Successful in 37s
CI Pipeline / type-check (push) Successful in 31s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / unit-tests (push) Successful in 1m4s
CI Pipeline / required-checks (push) Successful in 1s
deploy / deploy (push) Successful in 48s
CORRECTION 1: #314 reopened — recall_with_associations mode field defect
CONFIRMED in current source and FIXED (mode: association_merged).
CORRECTION 3: Gitea credential removed from remote URL (credential helper).
TOKEN EXPOSED: yes (in diagnostic output). TOKEN ROTATED: not yet (requires
Gitea web UI access). Remote URL now shows username only, no secret.
CORRECTION 4: duplicate-release-commit defect ROOT CAUSE: convergence
computed warranted bump from commits-since-tag without checking if master
version already satisfies the bump. FIX: already-converged guard in
version_convergence.py (master version > last tag → no commit). Repo-aware
(args.repo passed to read_version/latest_tag).
CORRECTION 6: lifecycle terminalization — execution exception now
guarantees task terminalizes as failed with evidence (no immortal RUNNING).
CORRECTION 7: route instruction task-scoped on RuneTask.route_instruction
(NOT shared operator state). Read-only leading-verb override. Isolation
tests prove no cross-contamination between interleaved tasks.
PL1-01/02/03/05: pl1_records.py (route resolution, proof level, failure
class, candidate status), metrics with honest NOT_YET_MEASURABLE semantics,
route-instruction learning loop (PE-1789102658-0269 SEED).
1253 tests green; ratchet 352/80 (shrink); henxels clean.
2026-09-11 15:36:08 +01:00
Nick
a553fb1363
feat(research): adversarial-gated refinement + narrowed QUALIFY (pipeline correction 2026-09-09)
...
ADVERSARIAL owns epistemic refinement. QUALIFY owns implementation-readiness.
- ADVERSARIAL_DISPOSITIONS enum: SURVIVES / SURVIVES_WITH_MITIGATIONS /
EVIDENCE_DEFICIENT / APPLICABILITY_DEFICIENT / INNOVATION_WARRANTED /
NO_VIABLE_CANDIDATE. Only SURVIVES* unlock SYNTHESIS; every other
disposition routes targeted refinement to the earliest repairable stage
(EVIDENCE_DEFICIENT/NO_VIABLE_CANDIDATE → OUTWARD,
APPLICABILITY_DEFICIENT → APPLICABILITY, INNOVATION_WARRANTED → INNOVATION)
- advance() REQUIRES a valid adversarial disposition — an adversarial pass
without a disposition cannot unlock anything
- synthesis_readiness() deterministic invariant (§7): disposition unlocks AND
≥1 surviving candidate AND mitigations represented (for
SURVIVES_WITH_MITIGATIONS) AND blocking unknowns = 0
- Falsification tests + required mitigations are first-class capsule fields —
they reach SYNTHESIS as mandatory inputs, not optional prose (§5)
- QUALIFY narrowed (§8–10): outcomes PROCEED / REFINE_SYNTHESIS (routes to
SYNTHESIS only) / REOPEN_EARLIER_STAGE (exceptional; requires reason,
return_to, new_blocking_fact, why_previous_gate_could_not_reasonably_
have_caught_it). Generic MORE_RESEARCH removed as a QUALIFY outcome.
- Fake worker + all chain tests updated to the disposition/outcome contract
Acceptance §18: 18/18 PASS (test_adversarial_gated_refinement.py).
148 tests pass, ruff clean.
2026-09-09 01:03:13 +01:00
Nick
54e6967d79
feat(research): conditional INNOVATION routing — INNOVATION is never ceremonial
...
Semantic correction per RP2 review (2026-09-09):
- APPLICABILITY artifact carries a route decision:
STANDARD_SOLUTION_SUFFICIENT → ADVERSARIAL (INNOVATION skipped)
INNOVATION_WARRANTED → INNOVATION → ADVERSARIAL
- Default when artifact is silent: skip INNOVATION (do not manufacture novelty)
- Invalid route values rejected; NO_INNOVATION_WARRANTED is a valid success
- ISSUE gate strictly deterministic: needs_mimo hardwired False (compat shim,
marked REMOVE AFTER), ambiguity recorded as signal for downstream stages
- Contract compiler uses canonical stage names only (no retired names in
required/skipped fields); INNOVATION included only when warranted
- Refinement may route around INNOVATION (innovation → INNOVATION;
mechanism weakness → ADVERSARIAL directly)
Acceptance (all PASS): canonical order retained; INNOVATION conditional;
APPLICABILITY→ADVERSARIAL bypass; APPLICABILITY→INNOVATION route;
NO_INNOVATION_WARRANTED valid; ISSUE deterministic/no-MiMo; earliest-
affected-stage refinement; no blind mandatory walk.
112 tests pass, ruff clean.
2026-09-08 23:59:31 +01:00
Nick
8551cd723d
feat(research): RP2 — canonical stage model (ISSUE→INWARD→OUTWARD→APPLICABILITY→INNOVATION→ADVERSARIAL→SYNTHESIS→QUALIFY)
...
Canonical handoff 2026-09-08 (epic #257 , children #264-#277):
- ISSUE (deterministic issue-quality gate) replaces DEFINE as stage 0 —
the Gitea issue is the authoritative definition; no cognitive DEFINE stage
- APPLICABILITY added after OUTWARD with canonical candidate classifications
- INNOVATION precedes ADVERSARIAL (canonical order per §1)
- OUTWARD unified (OR1 preserved): discovery+reading are artifact subsections
- RETIRED_STAGES declared: DEFINE/OUTWARD_DISCOVERY/OUTWARD_READING cannot
be advanced or dispatched through the canonical path (RETIRED_STAGE status)
- more_research → targeted refinement routing to EARLIEST deficient stage;
external unknowns route to unified OUTWARD, never the retired split stages
- fake worker, integration/boundary/reliability tests rewritten for canonical
chain; legacy-state tree at a retired stage raises on advance
- new prompt templates: issue.md, applicability.md (with MUST NOT contracts)
Tests: 104 passed. Ruff clean. Pre-existing henxels digest failure unchanged
(missing henxels.contract module in env, fails identically on clean tree).
closes #264 (RP1 stage model); runner-placement enforcement (RP2/#265) next
2026-09-08 23:50:10 +01:00
Nick
9d1e0da8e5
feat(research): OR1 — unify OUTWARD_DISCOVERY+OUTWARD_READING into OUTWARD
...
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / lint (push) Failing after 43s
CI Pipeline / canary (push) Failing after 40s
CI Pipeline / type-check (push) Successful in 37s
CI Pipeline / unit-tests (push) Failing after 1m11s
CI Pipeline / required-checks (push) Successful in 2s
One coherent MiMo external-research pass. Discovery and reading remain
visible as subsections inside the artifact, not separate top-level stages.
Artifact has discovery and reading subsections. Event relay streams both.
2026-09-08 23:17:51 +01:00
Nick
03e994ebb3
feat(research): RSC0-9 core — idempotency guard, live event relay, per-stage executor, stage-scoped prompts, MORE_RESEARCH targeting, durable state persistence
...
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Failing after 24s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / canary (push) Successful in 39s
CI Pipeline / type-check (push) Successful in 26s
CI Pipeline / unit-tests (push) Failing after 57s
CI Pipeline / required-checks (push) Successful in 1s
- research-dispatcher.yml: label event → API query → stage dispatch (automatic)
- research_event_relay.py: live event relay (QueryIssued/SourceRead/ToolFailed etc.)
- research_task_tree.py: process lock (idempotency), round sync from persisted state
- research_prompt_compiler.py: dynamic stage-scoped prompts from tree state
- run_research_stage.py: one-stage executor + tree persistence to master
- fake_worker.py: deterministic 8-stage integration harness (15 tests green)
- Pipeline extension guide committed
15 relevant pipeline tests passed. Proven: 8-stage chain, MORE_RESEARCH
targeted branch, cross-workspace persistence, evidence handoff.
2026-09-08 18:24:18 +01:00
Nick
baf97b568a
fix(research): round number synced from persisted state on load — tree.round was a Python attribute not synced from state['round']
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Failing after 24s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / type-check (push) Successful in 26s
CI Pipeline / gitea-offline (push) Successful in 15s
CI Pipeline / unit-tests (push) Failing after 48s
CI Pipeline / required-checks (push) Successful in 1s
2026-09-08 17:34:21 +01:00
Nick
82888ee8ab
feat(research): RSC1-3 — ResearchTaskTree (canonical state), dynamic stage prompt compiler, bounded one-stage executor
...
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 31s
CI Pipeline / lint (push) Failing after 37s
CI Pipeline / type-check (push) Successful in 27s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Successful in 53s
CI Pipeline / required-checks (push) Successful in 1s
RSC1: ResearchTaskTree tracks issue+round+stage+completed+artifacts+blocking_unknowns.
Persists to task_tree.json per issue. advance/fail/more_research/capsule/get_prior_artifacts.
RSC2: compile_research_prompt(tree, stage) builds a task-specific prompt from
the stage template + process capsule + prior artifacts + blocking unknowns.
RSC3: run_research_stage.py executes ONE MiMo invocation for ONE stage.
Compiles prompt → invokes mimo → extracts text → advances tree → returns next stage.
The workflow dispatches per-stage (Gitea event model IS the scheduler).
2026-09-08 14:51:51 +01:00