Commit Graph
339 Commits
Author SHA1 Message Date
Nick 43ef8e43e7 feat(research): RP8 — QUALIFY executor + gate, narrowed semantics (closes #271)
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / lint (push) Failing after 28s
CI Pipeline / canary (push) Successful in 32s
CI Pipeline / type-check (push) Successful in 27s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Failing after 50s
CI Pipeline / required-checks (push) Successful in 1s
- _execute_qualify: deterministic-first — 13 implementation-readiness checks
  (design explicit, interfaces concrete, authority boundaries, data flow,
  sequence, invariants, tests, acceptance, failure modes, rollback,
  adversarial mitigations included, falsification tests included, blocking
  unknowns absent) run BEFORE any MiMo call
- MiMo semantic judgment ONLY when deterministic checks pass: judge whether
  a coder could implement without guessing — not re-research, not re-litigating
  the design (ADVERSARIAL owns epistemics)
- Verdict assembly: deterministic failures → REFINE_SYNTHESIS without a model
  call; worker verdicts constrained to PROCEED/REFINE_SYNTHESIS; informal
  reopen attempts downgraded to REFINE_SYNTHESIS; formal reopen requires the
  four justification fields (gate-enforced)
- Malformed worker verdicts treated as REFINE_SYNTHESIS (fail-safe)
- 9 new tests; suite 174 pass, ruff clean
2026-09-09 01:25:56 +01:00
Nick b0b9c3165c fix(research): RP7 gate — mitigation representation is substantive, not verbatim
Real-run finding from #161: the worker integrated all 10 adversarial
mitigations into its design language (60-100% key-concept overlap in
structural fields) but did not quote the mitigation sentences verbatim.
Literal substring matching tested copy-paste, not design coverage. The gate
now measures keyword-overlap coverage (≥50% of non-stopword key concepts)
across invariants/interfaces/data_flow/tests/acceptance.

Verified: 10/10 mitigations represented, 7 kill-tests converted to 13
invariants, 11-step implementation sequence → GATE PASSED (e584bbf895b3),
tree at QUALIFY.
2026-09-09 01:22:13 +01:00
Nick a0e0b02449 feat(research): RP7 — SYNTHESIS executor + gate (closes #270)
- _execute_synthesis: deterministic readiness invariant enforced BEFORE the
  MiMo call (no cognition on untrustworthy foundations); bounded prompt
  carries survivors, rejected candidates + reasons, required mitigations,
  and kill-tests as ACCEPTED CONSTRAINTS
- Worker produces build instructions: selected_design, why-this-design-won,
  rejected_alternatives, components_affected, authority_boundaries,
  interfaces, data_flow, implementation_sequence, invariants, tests_required,
  acceptance_criteria, failure_modes, rollback, deliberately_excluded
- Gate (_validate_synthesis): all core fields present (design, sequence,
  interfaces, acceptance, rollback); every falsification test converted into
  an invariant; every required mitigation represented STRUCTURALLY
  (invariants/interfaces/data_flow/tests/acceptance — prose mention in the
  design summary is not representation); rejected-candidate resurrection
  forbidden (id scan across design + components)
- Artifact carries provenance: adversarial_disposition, carried_mitigations,
  carried_falsification_tests, carried_survivors — the literal-handoff input
  shows exactly which constraints the design was built under
- 8 new tests; suite 165 pass, ruff clean
2026-09-09 01:14:11 +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 bac9f583f9 fix(research): RP6 gate — normalize worker dimension naming, accept dedicated falsification_tests
Real-run findings from #161: worker emits snake_case dimensions
(weak_assumptions, Rune_constraint_violations) — gate now normalizes
snake/kebab to spaces before matching. Falsification may be satisfied either
as an attack dimension or as dedicated falsification_tests (kill-tests) —
the worker produced 2 concrete kill-tests (e.g. FT1: run harness with
embedding backend unreachable; any unlabeled mode switch voids validation).

Verified: 16 attacks, 6 survivors, 1 rejection (memory-adapter-protocol —
duplicate authority vs memory_selector.py source registry), 2 external
checks, 25 repo-verification tool calls → GATE PASSED (3827446e701a),
tree at SYNTHESIS.
2026-09-09 00:47:03 +01:00
Nick fb70092fed feat(research): RP6 — ADVERSARIAL executor + gate (closes #269)
- _execute_adversarial: one bounded MiMo red-team pass on the leading
  APPLICABILITY candidates; targeted external checks permitted with receipts
- Dossier: surviving/rejected candidates, attacks (dimension+finding+evidence+
  severity), critical assumptions, required mitigations, research gaps,
  falsification tests
- Gate (_validate_adversarial): rubber-stamp fails (zero attacks); all seven
  attack dimensions must be addressed; every leading candidate must be
  attacked at least once; a fatal attack on a surviving candidate requires
  an explicit rebuttal
- File channel accepted whenever stdout parse yields nothing (established
  worker pattern); stage-ordering guard (no APPLICABILITY → STAGE_FAILED)
- 7 new tests; suite 130 pass, ruff clean
2026-09-09 00:37:59 +01:00
Nick 3b41e06303 fix(research): RP4 — prefer worker dossier file whenever stdout parse yields no candidates
Prose-only stdout with a valid applicability.json on disk previously produced
an empty artifact stub (gate-fail with misleading 'no candidates' error).
Now: stdout JSON parsed first; if no candidates, the dossier file channel is
checked. Structured artifact remains the authority. Verified on real #161 run:
9 candidates + repo-verified receipts → GATE PASSED (f477543dc8c9),
route STANDARD_SOLUTION_SUFFICIENT → ADVERSARIAL (INNOVATION skipped on merit).
2026-09-09 00:30:44 +01:00
Nick 81aef725e0 feat(research): RP4 — APPLICABILITY executor + gate (closes #267)
- _execute_applicability: one bounded MiMo pass consuming ISSUE+INWARD+OUTWARD
  artifacts; bounded inputs (source/claim ids, not prose); structured dossier
  written by worker to applicability.json — file channel accepted (structured
  artifact is the authority), stdout JSON also parsed
- Gate (_validate_applicability): route must be STANDARD_SOLUTION_SUFFICIENT
  or INNOVATION_WARRANTED; candidates must use canonical classifications;
  viable candidates (DIRECTLY_APPLICABLE/APPLICABLE_WITH_ADAPTATION/
  PROMISING_FOR_INNOVATION) require integration_point AND evidence ids;
  source_ids must resolve to accepted OUTWARD sources (no fabricated citations)
- Route decision drives conditional INNOVATION routing at advance()
- Stage-ordering guard: no OUTWARD artifact → STAGE_FAILED without MiMo call
- 6 new tests; suite 123 pass, ruff clean
2026-09-09 00:21:46 +01:00
Nick 5b92068899 fix(research): RP3 — accept worker-written dossier file as artifact channel
The structured artifact IS the authority (§5); stdout text is just one
delivery channel. When the relay collects no stdout texts but the worker
wrote a valid dossier to the stage artifact file, the executor normalizes
it into the canonical unified structure (_normalize_outward_artifact) and
gates it the same way. Gate semantics unchanged: ≥2 sources, real read
receipts required, tool receipts required.

Verified against the real #161 OUTWARD run: worker dossier (16 sources,
4 read with 22 claims, 4 contradictions, 8 limitations) + relay receipts
extracted from the live events file (4 queries, 4 reads, 22 tools) →
GATE PASSED, tree advanced to APPLICABILITY. Artifact hash bc57c4600880.
2026-09-09 00:16:02 +01:00
Nick 416df5c08f fix(research): RP3 OUTWARD evidence chain — real read receipts, unified gate reads nested artifact
- ResearchEventRelay captures per-event tool receipts (QUERY / SOURCE_READ /
  TOOL / TOOL_FAILED with url + timestamp) — the QUERY→SOURCE→READ→CLAIM
  chain now has real provenance, not just counts
- OUTWARD artifact embeds tool_receipts; sources carry read_receipt flag —
  a source counts as read only if the relay captured a real fetch
- _validate_outward fixed to read the unified (discovery/reading) artifact
  structure — previous validator read top-level keys that never existed,
  so any real run would have gate-failed; now also enforces ≥1 actually-read
  source and non-empty tool receipts (search snippets alone ≠ evidence)

125 tests pass, ruff clean.
2026-09-09 00:07:12 +01:00
Nick 26eef8e3d3 feat(research): RP2/#265 — runner-placement enforcement + code classification manifest
THE HEAVY RUNNER IS THE DESKTOP PC, NOT THE PI.

- scripts/runner_evidence.py: runtime execution evidence capture (hostname,
  runner identity from env, labels, execution class, stage, process id,
  issue, research process id, timestamp) — identity captured at runtime,
  never inferred from configuration alone
- Deterministic placement gate (validate_placement): desktop-heavy stage
  executed on Pi → PLACEMENT_REJECTED; hostname checked too (cannot hide
  the Pi behind a desktop runner name); missing evidence fields rejected;
  unverified runners rejected (no silent fallback); pi-lightweight forge
  operations (metadata, labels, eligibility) explicitly allowed
- Placement gate wired into StageExecutor.execute(): every stage result
  embeds runner_evidence; Pi execution fails the tree and cannot count
  as acceptance
- docs/RESEARCH_CODE_CLASSIFICATION.md: aggressive detection, conservative
  classification (CURRENT/SUPERSEDED/COMPATIBILITY/TEST_FIXTURE/
  UNKNOWN_PURPOSE); NO deletion in #265 — retirement is RP11 after RP10
  proof; run_full_research() self-walk + --watch poll classified SUPERSEDED;
  tui-restart-pending marked SUPERSEDED CANDIDATE (verify before removal)

Acceptance: canonical order PASS; conditional INNOVATION PASS; ISSUE
deterministic PASS; earliest-stage refinement PASS; heavy-runner requirement
encoded PASS; Pi rejection PASS; runtime identity/hostname/labels captured
PASS; stage/run/process identity PASS; Gitea stage authority preserved
(one-stage executor unchanged) PASS; no self-walking production loop in the
canonical path PASS; no premature retirement PASS.

125 tests pass, ruff clean. Pre-existing henxels digest env failure unchanged.
2026-09-09 00:02:16 +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 83ea89c1ba feat(research): OUTWARD_DISCOVERY executor — real MiMo discovery with structured artifact
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Failing after 24s
CI Pipeline / canary (push) Successful in 30s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Failing after 49s
CI Pipeline / required-checks (push) Successful in 1s
- _execute_outward_discovery: compiles stage-scoped prompt from tree state,
  invokes MiMo locally with live event relay, extracts URLs from research text,
  builds OutwardDiscoveryArtifact (queries + sources + coverage + selection)
- _validate_outward_discovery: fast gate (≥2 sources, unique IDs, valid URLs, coverage)
- Boundary test updated: OUTWARD_DISCOVERY reaches the MiMo invocation boundary
  (subprocess mocked in unit tests, real MiMo in acceptance)

BUILD ONE COGNITIVE STAGE. PROVE ONE COGNITIVE STAGE. THEN REPEAT.
2026-09-08 22:31:16 +01:00
Nick d4a4222fcd feat(research): stage-trigger boundary executor — one event = one stage, idempotency guard, no self-walking
Per RUNE_RESEARCH_STAGE_TRIGGER_BOUNDARY_ACCEPTANCE_PROMPT:
- Each stage is a separate ResearchStageReady event
- The executor runs exactly one stage per invocation
- Duplicate events are acknowledged as DUPLICATE (no second execution)
- Gitea independently authorizes the next stage
- Rune does NOT self-advance through the methodology
- DEFINE is deterministic, INWARD is deterministic context builder
- OUTWARD_DISCOVERY returns NOT_IMPLEMENTED (proves the boundary)

7 boundary tests green.
2026-09-08 22:10:20 +01:00
Nick 1c11984701 fix(research): gitea_api double-read bug — r.read() consumed body, second call returned empty 2026-09-08 21:30:20 +01:00
Nick 5a9825fa7f fix(research): DEFINE and INWARD use deterministic paths — MiMo only for bounded semantic inspection 2026-09-08 21:23:40 +01:00
Nick efc895bd30 feat(research): R1-R2 deterministic DEFINE + INWARD context builder
DEFINE: deterministic contract compilation from Gitea issue. No MiMo unless ambiguous.
Classifies question type, extracts sub-questions, produces required-stage plan with skip reasons.

INWARD context builder: deterministic. Matches issue keywords against umbrella manifest
and source/test files. Produces bounded candidate context. MiMo only invoked for
semantic inspection of the bounded candidates, not broad agent wandering.

METHODOLOGY STAGE ≠ MANDATORY LLM CALL.
2026-09-08 21:18:42 +01:00
Nick 8c3be8303d feat(research): local research execution backend — corrected execution model
CI Pipeline / lint (push) Failing after 25s
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / unit-tests (push) Failing after 44s
CI Pipeline / gitea-offline (push) Successful in 15s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / required-checks (push) Successful in 2s
Gitea triggers and ratifies cognition. Rune/MiMo performs cognition. The TUI shows the live process.

The backend runs LOCALLY on nick's machine (not in Gitea Actions):
- receives stage-ready events (polls Gitea for research-pending issues)
- compiles stage prompts from the ResearchTaskTree
- invokes mimo LOCALLY (subprocess — not Gitea Actions)
- streams events to the TUI via the event relay
- validates artifacts with stage-specific gates
- records results in Gitea
- advances to the next stage

Gitea Actions becomes a TRIGGER, not a WORKER.
2026-09-08 20:34:03 +01:00
Nick bfee4fa270 debug(research): add events count + stderr capture to stage executor
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / lint (push) Failing after 26s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Failing after 48s
CI Pipeline / required-checks (push) Successful in 2s
2026-09-08 19:35:51 +01:00
Nick 7653c28346 feat(research): stage-specific validation gate before advance — OUTWARD requires ≥2 URLs, INWARD requires ≥2 code paths, INNOVATION requires evidence derivation. Gate failure does NOT advance (retry semantics). The structured artifact IS the authority, not prose.
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / lint (push) Failing after 25s
CI Pipeline / type-check (push) Successful in 27s
CI Pipeline / unit-tests (push) Failing after 48s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / required-checks (push) Successful in 1s
2026-09-08 19:18:36 +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 8dbdd4516f debug: tree persist check logging
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 14s
CI Pipeline / lint (push) Failing after 25s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / unit-tests (push) Failing after 48s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / type-check (push) Successful in 26s
CI Pipeline / required-checks (push) Successful in 2s
2026-09-08 16:26:23 +01:00
Nick 55cfccb82c fix(research): task tree persisted to master after each stage + loaded from master on fresh workspace — Gitea owns durable state (RSC1 doctrine)
CI Pipeline / best-practices (push) Successful in 13s
CI Pipeline / lint (push) Failing after 25s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / gitea-offline (push) Successful in 15s
CI Pipeline / unit-tests (push) Failing after 47s
CI Pipeline / type-check (push) Successful in 27s
CI Pipeline / required-checks (push) Successful in 1s
2026-09-08 15:54:28 +01:00
Nick 8f48f8a2e4 fix(research): create output directory before writing events file
CI Pipeline / lint (push) Failing after 30s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / unit-tests (push) Failing after 50s
CI Pipeline / type-check (push) Successful in 26s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / required-checks (push) Successful in 1s
2026-09-08 15:28:40 +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
Nick b6d1a08750 feat(research): R1-R5 — event-driven coordinator, stage-scoped methodology, OUTWARD router, structured artifact gate, MORE_RESEARCH immediate re-dispatch
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / lint (push) Failing after 32s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / unit-tests (push) Successful in 49s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / type-check (push) Successful in 25s
CI Pipeline / required-checks (push) Successful in 1s
R1: disposition routing wired into the research stage workflow — PROCEED
lets research-clear fire, MORE_RESEARCH dispatches round+1 immediately
(no sweep wait). The workflow completion IS the event.

R2: 8 stage-scoped prompt templates (DEFINE through QUALIFY) — each gets
a narrow prompt, frozen prior artifacts, explicit MUST NOT constraints.

R3: research_router.py — classifies questions (academic/software/web),
routes to OpenAlex/SemanticScholar/arXiv/GitHub/DuckDuckGo, doctrine
queries include limitations/alternatives/failures.

R4: structured artifact validated in the stage workflow before commit —
receipt + URLs + code paths + disposition all checked.

R5: MORE_RESEARCH dispatches round+1 from the workflow (no sweep wait);
blocking unknowns passed to the next round.

R0 red reproduction recorded: foreground slept 300s×N while child mimo
worker was productive (18.6% CPU, 547MB, 8min CPU). Anti-pattern confirmed.
2026-09-08 12:31:53 +01:00
Nick b2a43a3a92 feat(research): dispatcher workflow + structured artifact gate (P0 dispatch reliability + P0.4 artifact validation)
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / lint (push) Failing after 34s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / type-check (push) Successful in 25s
Auto-label / auto-label (pull_request) Successful in 2s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Successful in 50s
CI Pipeline / best-practices (pull_request) Successful in 3s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Failing after 30s
CI Pipeline / canary (pull_request) Successful in 26s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / type-check (pull_request) Successful in 24s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / unit-tests (pull_request) Successful in 45s
Spec gate (headless) / spec-gate (pull_request) Successful in 6s
CI Pipeline / required-checks (pull_request) Successful in 2s
Auto-version and Release / release (pull_request) Failing after 24s
- research-dispatcher.yml: triggers on issues.labeled, checks label via API
  (deterministic), dispatches research-stage via workflow_dispatch (proven).
  Fixes the label-event payload quirk that silently skipped API-applied labels.
- research-stage-headless.yml: dispatch-only trigger (dispatcher handles label
  events); structured artifact generation from mimo events (receipt + URLs +
  code paths + disposition) validated by research_artifact.py before commit.
- The prose comment stays as human-readable rendering; the ARTIFACT is the
  gate authority (Nick: replace prose-regex authority with structured
  artifact validation).
2026-09-08 11:26:30 +01:00
Nick a8cebea264 feat(research): MORE_RESEARCH re-dispatch semantics (P0.6) — sweep keeps MORE_RESEARCH rounds eligible (re-dispatch when label lost); PROCEED rounds are done. Disposition routing documented in stage workflow
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 30s
CI Pipeline / lint (push) Successful in 31s
CI Pipeline / type-check (push) Successful in 27s
CI Pipeline / gitea-offline (push) Successful in 26s
CI Pipeline / unit-tests (push) Successful in 1m39s
CI Pipeline / required-checks (push) Successful in 0s
2026-09-08 07:12:34 +01:00
Nick 7f050a13df feat(research): structured research artifact schema + causal validation (P0.4, red-first)
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / lint (push) Successful in 32s
CI Pipeline / type-check (push) Successful in 25s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / unit-tests (push) Successful in 50s
CI Pipeline / required-checks (push) Successful in 1s
Per the Forge Cognitive Research Loop handoff §8/§9/§11/§12:
- OUTWARD valid only with real discovery (≥2 sources, url+tool+learned each, ≥1 query recorded)
- INNOVATION candidates must derive_from prior claims; ≥1 from OUTWARD unless exempt
- SYNTHESIS must cite evidence_used; MORE_RESEARCH requires named blocking_unknowns
- dispositions: PROCEED | MORE_RESEARCH (nothing else)

10 red-first tests frozen green.
2026-09-08 07:08:06 +01:00
Nick ab2c567ea4 fix(robot): classify gate on BOTH update paths (conflict-first + behind-base) — code-path touch always waits for fresh CI; docs-only carries. Closes the #208 slip (merge on stale required-checks)
CI Pipeline / canary (push) Successful in 30s
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Successful in 54s
CI Pipeline / lint (push) Successful in 30s
CI Pipeline / type-check (push) Successful in 24s
CI Pipeline / required-checks (push) Successful in 1s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / best-practices (pull_request) Successful in 3s
Auto-label / auto-label (pull_request) Successful in 3s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / canary (pull_request) Successful in 26s
CI Pipeline / lint (pull_request) Successful in 30s
CI Pipeline / type-check (pull_request) Successful in 26s
Spec gate (headless) / spec-gate (pull_request) Successful in 6s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / unit-tests (pull_request) Successful in 47s
CI Pipeline / required-checks (pull_request) Successful in 1s
Auto-version and Release / release (pull_request) Failing after 10s
2026-09-08 05:54:37 +01:00
Nick 61f1ca63e8 feat(robot): conflict-first policy — staleness resolved immediately on mergeable=False (before any wait), 409 conflicts skip with reason; carry-forward race closed by re-verifying mergeable post-update (Nick policy: merges resolve in ~1min, then sleep)
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / lint (push) Successful in 33s
CI Pipeline / type-check (push) Successful in 25s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / unit-tests (push) Successful in 50s
CI Pipeline / required-checks (push) Successful in 1s
2026-09-08 05:49:55 +01:00
conductor c9d7c1ccef Merge branch 'master' into umbrella-pipeline
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 26s
CI Pipeline / type-check (push) Successful in 24s
CI Pipeline / lint (push) Successful in 38s
CI Pipeline / unit-tests (push) Successful in 38s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / best-practices (pull_request) Successful in 2s
CI Pipeline / documentation (pull_request) Successful in 3s
CI Pipeline / lint (pull_request) Successful in 35s
CI Pipeline / canary (pull_request) Successful in 29s
CI Pipeline / type-check (pull_request) Successful in 23s
CI Pipeline / unit-tests (pull_request) Successful in 35s
Spec gate (headless) / spec-gate (pull_request) Successful in 5s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / required-checks (pull_request) Successful in 1s
Auto-version and Release / release (pull_request) Failing after 8s
2026-09-08 03:34:19 +01:00
Nick 540f30b553 feat(pipeline): streamline — direct-commit version bumps, robot transient retry, extension guide (Nick policy, 2026-09-08)
## Bumps are bookkeeping, not reviewable code
auto-version now commits the 5 version surfaces DIRECTLY to master via the
contents API — no bump branch, no bump PR, no bump CI wave, no staleness
cascade, no concurrent-bump race (230/231 proved it). In-memory gate: all 5
surfaces must agree on the new version BEFORE any commit (TUI footer renders
rune.__version__ at call time — the displayed version IS __init__.py).
Commit messages carry the provenance link to the earning PR.

## Robot: transient 405 'Please try again later' retried (3x backoff)
Forge mergeability recompute was failing the robot on every merge burst —
transient is 'not ready', not a refusal. Fail-loud applies to refusals and
to exhausted retries (both paths tested).

## Future-proofing: docs/pipeline-extension-guide.md
Placement decision tree (merge-deciding → required-checks; work → narrowest
event; bookkeeping → direct commit), event-delivery quirk table (every entry
learned by a live failure), per-type checklists, the three invariants.
Registry links it. Any future agent reads the guide BEFORE adding a process.
2026-09-08 03:22:35 +01:00
Nick 333d645dbe fix(scripts): __main__ passes sys.argv[1:] — python strips the script name; CI invocation contract restored 2026-09-08 02:46:26 +01:00
Nick ae8c23a981 feat(release): bump fast lane + provenance record (Nick's policy, 2026-09-08)
Version bumps are version-string changes; the full pipeline is the wrong
tool. Per Nick:
- provenance: bump PR body now RECORDS the PR that earned the promotion
  (Earned by: #N — title, with link) — the promotion has a paper trail
- light gate: bump PRs skip the 7 heavy jobs (head-ref if); required-checks
  runs scripts/check_version_surfaces.py instead — proves all five version
  surfaces agree (__init__ canonical, rune_tui header, canary literal,
  pyproject wheel, README badge) so the TUI footer will render the new
  version (VersionLabel reads rune.__version__ at call time)
- red-first: 7 tests for the surface gate; full suite 877+84
2026-09-08 02:26:59 +01:00
Nick 229bad13bd feat(robot): carry-forward policy — checks re-run only on contributed-code change (Nick's policy, 2026-09-08)
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
Auto-label / priority-gate (pull_request) Skipped
Auto-label / auto-label (pull_request) Successful in 1s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / lint (push) Successful in 31s
CI Pipeline / unit-tests (push) Successful in 37s
CI Pipeline / type-check (push) Successful in 25s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / best-practices (pull_request) Successful in 2s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Successful in 28s
CI Pipeline / canary (pull_request) Successful in 24s
Spec gate (headless) / spec-gate (pull_request) Successful in 6s
CI Pipeline / type-check (pull_request) Successful in 23s
CI Pipeline / gitea-offline (pull_request) Successful in 14s
CI Pipeline / unit-tests (pull_request) Successful in 36s
CI Pipeline / required-checks (pull_request) Successful in 0s
Behind-base self-heal previously forced a full CI re-run even when the
update's tree diff touched no code path — redundant by construction
(identical code-path trees cannot produce different test outcomes).

- merge_robot emits UPDATED protocol line after self-heal
- scripts/carry_forward_check.py classifies the tested-head→new-head tree
  diff: CARRY_FORWARD (docs-only) vs RERUN_REQUIRED (any code-path touch)
- workflow consumes it: CARRY_FORWARD republishes the required-checks
  aggregate citing tree identity; RERUN_REQUIRED waits for CI as today
- policy recorded: first pass = full pipeline; base movement with
  unchanged code paths = carry; bugs/mistakes = new commits = full re-run

Red-first: 2 new tests (classification + companion script contract).
2026-09-08 02:06:34 +01:00
Nick 0d04ea0aba merge master (behind-base — the loop's own sound)
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / lint (push) Successful in 28s
CI Pipeline / type-check (push) Successful in 23s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / unit-tests (push) Successful in 38s
Auto-label / auto-label (pull_request) Successful in 3s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / best-practices (pull_request) Successful in 2s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Successful in 35s
CI Pipeline / canary (pull_request) Successful in 26s
Spec gate (headless) / spec-gate (pull_request) Successful in 5s
CI Pipeline / unit-tests (pull_request) Successful in 41s
CI Pipeline / type-check (pull_request) Successful in 22s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / required-checks (pull_request) Successful in 1s
Auto-version and Release / release (pull_request) Failing after 12s
2026-09-08 01:33:16 +01:00
Nick 3f7ffb91ca merge master (registry fix)
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 24s
CI Pipeline / lint (push) Failing after 30s
CI Pipeline / unit-tests (push) Successful in 36s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / type-check (push) Successful in 22s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / lint (pull_request) Failing after 27s
CI Pipeline / best-practices (pull_request) Successful in 4s
CI Pipeline / documentation (pull_request) Successful in 4s
Spec gate (headless) / spec-gate (pull_request) Successful in 6s
CI Pipeline / gitea-offline (pull_request) Successful in 15s
CI Pipeline / type-check (pull_request) Successful in 24s
CI Pipeline / canary (pull_request) Successful in 25s
CI Pipeline / unit-tests (pull_request) Successful in 34s
CI Pipeline / required-checks (pull_request) Skipped
2026-09-08 01:20:01 +01:00
Nick e637b676b3 fix(robot): self-heal behind-base PRs — update via API and retry merge; 409 conflict skips with reason (red-first)
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Successful in 29s
CI Pipeline / canary (push) Successful in 24s
CI Pipeline / type-check (push) Successful in 24s
CI Pipeline / unit-tests (push) Successful in 35s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / required-checks (push) Skipped
THE INEFFICIENCY (Nick): every master movement staled every other open PR;
the robot SKIPPED them; a human worktree dance updated branches by hand; CI
re-ran; the next auto-bump staled everything again. Loop documented across
the whole session (round-1/round-2 'behind-base update' commits).

Fix: the robot performs POST /pulls/{n}/update itself on 405-behind, then
retries the merge. Skips only genuine conflicts (409). The forge heals its
own staleness — no agent, no human.

- test_behind_base_pr_is_updated_then_rechecked (new contract)
- test_update_conflict_409_skips_not_fails
- test_behind_base_405_self_heals_then_merges (supersedes old skip contract)
- suite: 13 robot tests green
2026-09-08 01:09:42 +01:00
Nick e4e81cfa6e merge master (resolve: master reviewed state wins; spec-gate branch copy already wired ROBOT_TOKEN) 2026-09-08 01:03:57 +01:00
Nick 3a18534516 merge master (resolve: master's auto-version evolution wins — semver extraction is the newer reviewed state; #192 convergence machinery on this branch supersedes via its own PR review)
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / canary (push) Successful in 26s
CI Pipeline / lint (push) Successful in 30s
CI Pipeline / unit-tests (push) Successful in 36s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / type-check (push) Successful in 23s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / best-practices (pull_request) Successful in 3s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Successful in 26s
CI Pipeline / canary (pull_request) Successful in 24s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / unit-tests (pull_request) Successful in 34s
CI Pipeline / type-check (pull_request) Successful in 24s
Spec gate (headless) / spec-gate (pull_request) Successful in 8s
CI Pipeline / required-checks (pull_request) Successful in 1s
Auto-version and Release / release (pull_request) Failing after 7s
2026-09-08 00:58:18 +01:00
conductor d67c535227 Merge branch 'master' into bugfix-contract
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Failing after 30s
CI Pipeline / canary (push) Successful in 31s
CI Pipeline / type-check (push) Successful in 24s
CI Pipeline / unit-tests (push) Successful in 37s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / best-practices (pull_request) Successful in 2s
CI Pipeline / documentation (pull_request) Successful in 3s
CI Pipeline / lint (pull_request) Failing after 28s
CI Pipeline / unit-tests (pull_request) Successful in 35s
CI Pipeline / canary (pull_request) Successful in 30s
CI Pipeline / type-check (pull_request) Successful in 25s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / required-checks (pull_request) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 6s
2026-09-08 00:57:19 +01:00
Nick fa689c77e9 feat(pipeline): generic agent-stage runner — transport with tool receipts, locks, restart safety (P0.2, red-first)
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Successful in 29s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / type-check (push) Successful in 23s
CI Pipeline / unit-tests (push) Successful in 34s
CI Pipeline / gitea-offline (push) Successful in 13s
CI Pipeline / required-checks (push) Skipped
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / best-practices (pull_request) Successful in 4s
Auto-label / auto-label (pull_request) Successful in 3s
CI Pipeline / documentation (pull_request) Successful in 3s
CI Pipeline / canary (pull_request) Successful in 25s
CI Pipeline / lint (pull_request) Successful in 27s
CI Pipeline / type-check (pull_request) Successful in 22s
CI Pipeline / unit-tests (pull_request) Successful in 35s
Spec gate (headless) / spec-gate (pull_request) Successful in 7s
CI Pipeline / gitea-offline (pull_request) Successful in 14s
CI Pipeline / required-checks (pull_request) Successful in 1s
scripts/run_agent_stage.py per the Forge Cognitive Research Loop handoff:
- ONE runner for all cognitive stages (research/planning/review) — not a
  family of per-stage scripts
- tool receipts derived from STRUCTURED events (type:tool parts), never
  model self-report; OUTWARD validity = >=2 completed search/fetch calls
  across >=2 distinct web domains
- idempotency key issue+stage+round; TTL locks (crashed stage -> stale lock
  expires -> redispatch safe)
- fail loud: mimo crash, schema violation, missing receipt all return 1
- event schema verified live against runner mimo 0.1.13 (type:text/part.text
  — the spec-gate's parser had the wrong shape; fixed here)
- canary evidence (T8): no native search tool on runner mimo; discovery
  works via webfetch of search-engine HTML + fetched pages (2 domains,
  real content, honest self-report of the fallback)
2026-09-08 00:40:18 +01:00
Nick 037c47f604 merge master (behind-base)
CI Pipeline / best-practices (push) Successful in 15s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / canary (push) Successful in 44s
CI Pipeline / lint (push) Failing after 48s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / unit-tests (push) Successful in 54s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / lint (pull_request) Failing after 27s
CI Pipeline / canary (pull_request) Successful in 24s
CI Pipeline / unit-tests (pull_request) Successful in 33s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / gitea-offline (pull_request) Successful in 14s
CI Pipeline / type-check (pull_request) Successful in 24s
Spec gate (headless) / spec-gate (pull_request) Successful in 6s
CI Pipeline / best-practices (pull_request) Successful in 3s
CI Pipeline / required-checks (pull_request) Skipped
2026-09-08 00:17:21 +01:00
Nick 3065d11384 fix(release): auto-version resurrected — semver logic extracted to scripts/semver_bump.py; YAML-parse-death from #190 discharge (red-first)
Root cause of missing version bumps since 2026-09-06 15:01: #190 pasted
inline python into a double-quoted YAML scalar (unescaped quotes, column-0
lines) making auto-version.yml UNPARSEABLE. Gitea rejects the workflow
wholesale — dispatch 500, pull_request:closed triggers never fire. Six
merges tonight + all merges since #190: zero bumps.

- scripts/semver_bump.py: testable next_version() (0.x semver conventions)
- workflow repaired, parses clean
- version-behind-tag now a LOUD ::warning anomaly (#192), never silent skip
- NEW GATE: tests/test_semver_bump.py validates ALL workflow files parse —
  the missing lint that let this rot silently (7 workflows covered)
2026-09-07 23:23:24 +01:00
Nick db14f66bc0 feat(pipeline): research structuralization — dispatched headless research stage + idempotent backlog sweep (#204 second slice)
CI Pipeline / best-practices (push) Successful in 3s
CI Pipeline / documentation (push) Successful in 2s
Auto-label / priority-gate (pull_request) Skipped
Auto-label / auto-label (pull_request) Successful in 2s
CI Pipeline / lint (push) Failing after 20s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / type-check (push) Successful in 25s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Successful in 36s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / best-practices (pull_request) Successful in 3s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Failing after 20s
CI Pipeline / gitea-offline (pull_request) Successful in 13s
CI Pipeline / canary (pull_request) Successful in 28s
CI Pipeline / unit-tests (pull_request) Successful in 33s
CI Pipeline / type-check (pull_request) Successful in 23s
CI Pipeline / required-checks (pull_request) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 8s
Nick's critique structuralized (2026-09-07):
- 'is research being done or already done?' → sweep detects existing
  4-phase rounds (INWARD/OUTWARD/INNOVATION/SYNTHESIS comments) and SKIPS
  those issues; never re-researches completed work
- research must CALL the LLM → research-stage-headless.yml dispatches headless
  mimo on research-pending label events (spec-gate runner pattern, verified)
- filed as a research FILE per issue → research/issue-<n>-research.md merged
  to master via auto-PR; comment carries the markers research-clear keys on
- 4 phases → SYNTHESIS ends in ordered build instructions = implementer's prompt
- TUI callback seam → prompt externalized to governed prompts/research-round.md
  (placeholders substituted at runtime; L3/TUI owns it via reviewed diffs later)
- failsafe: sweep dry-run by default; --apply explicit; red-first tests (10)

Also: spec-gate-headless.yml copied to master stream with ROBOT_TOKEN wired
(same reserved-secret bug the robot had — GITEA_TOKEN is the read-only auto token).
2026-09-07 23:05:17 +01:00
Nick e0ca302bc1 merge master (behind-base update, round 2)
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / lint (push) Successful in 25s
CI Pipeline / canary (push) Successful in 26s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / type-check (push) Successful in 23s
CI Pipeline / unit-tests (push) Successful in 35s
CI Pipeline / required-checks (push) Skipped
CI Pipeline / best-practices (pull_request) Successful in 2s
CI Pipeline / documentation (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Successful in 27s
CI Pipeline / canary (pull_request) Successful in 26s
CI Pipeline / unit-tests (pull_request) Successful in 34s
CI Pipeline / type-check (pull_request) Successful in 22s
CI Pipeline / gitea-offline (pull_request) Successful in 14s
CI Pipeline / required-checks (pull_request) Successful in 1s
2026-09-07 22:45:39 +01:00