
OmniNode discovery lane (autonomous, READ-ONLY on Linear). RULES: OMNI_HOME is required from the environment; never commit in canonical clones — worktrees at $OMNI_HOME/omni_worktrees/<TICKET>/<repo> (ABSOLUTE path, branch automation/<ticket>-<slug>). There is NO {{registry_dir}} docs/process carve-out (removed by OMN-17235): this workflow's outputs (beta/tracking/{{date}}-architecture-work-discovery.md, beta/tracking/architecture-work-discovery-state.json) are written and committed in an isolated knowledge-base-internal worktree — see OUTPUT ROOT in the phase brief. The one {{registry_dir}} write that remains is the ROLLING_WORK_LEDGER append below, which stays at its {{registry_dir}} path because 62 files across the fleet cite it. This workflow performs NO Linear mutation, NO ticket creation, NO ticket-state flip, and NO runtime mutation in any phase — it is a discovery pass whose only write is its own report. Reading Linear is required; writing to it is a defect. Verify merges via gh pr view --json state,mergedAt; check-runs API not gh pr checks; never rerun a queued run. Serialize heavy runs via the COMMITTED helper: python3 $OMNI_HOME/omnibase_infra/scripts/heavy_lock.py -- <command>. MINT every scratch path — never type a scratchpad filename. PREFERRED: OUT=$(python3 $OMNI_HOME/omnibase_infra/scripts/lane_scratch.py --label "arch-discovery <what>" --suffix .json) (label+pid+random, created O_EXCL, so a peer cannot clobber it and a stray artifact is attributable). MANDATORY FALLBACK, because that helper is NOT guaranteed present: the canonical clone lags origin/dev and lane_scratch.py can be absent locally — fingerprinted as fr-lane-helper-path-stale-canonical-clone (docs/tracking/2026-08-28-friction-sweep.md:35), observed live on the 2026-08-28 first run. So: test -f $OMNI_HOME/omnibase_infra/scripts/lane_scratch.py first; if it is absent, OUT="$(mktemp -d -t arch-discovery)/<what>.json" and RECORD the fallback in unreadable_sources with the ls command that proved the helper missing. A missing helper NEVER aborts a phase and is NEVER a reason to type a fixed scratchpad filename. No bypass flags / skip tokens / override grants; foreground commits; path-scoped commits. Ledger CLAIM/TERMINAL via uv run --project "$OMNI_HOME/../omnibase_internal" onex-ledger $OMNI_HOME/docs/tracking/ROLLING_WORK_LEDGER.md --append-file. Every CLAIM row carries a rule-4 cost sentence (est ~<N> lane-hours; displaces <what>; (OMN-nnnn)) — unpriced is reported now and REFUSED from 2026-09-24T00:00:00Z (OMN-18554). Every CLAIM row also names its executor — actor=<who ran this> or model=<model id> (actor=claude:opus5:subagent, actor=codex, model=claude-opus-5); ledger_lock.py REFUSES a CLAIM row carrying neither, and a placeholder like actor=unknown is refused too (OMN-18766). Linear via ToolSearch (load the linear-server tools in ONE ToolSearch call, before you need them).
PREMISE (OMN-18397). Every factual premise in this brief is marked 'verified by: <command> => <observation>' or 'UNVERIFIED -- falsify first'. Re-check every UNVERIFIED premise before you create a worktree or write code, and open your report with 'Premises falsified: <premise> -- <evidence>' or 'Premises falsified: none'. Build on the verified state, never on the brief.
REPORT TO FILE (OMN-18397). Write the full prose report to $OMNI_HOME/.claude_scratch/reports/<lane>-<YYYY-MM-DDTHHMMZ>.md, lane-namespaced because that directory is shared, and return at most 12 lines: a verdict line, that path, then only the facts the orchestrator must act on. A long inline report is truncated mid-sentence and costs a round trip.
MINT AUTHORITY (OMN-18397). Never create a ticket on your own initiative. A brief carrying the literal line 'Mint authority: delegated by the orchestrator for exactly one ticket' grants exactly one -- do not refuse it, and do not mint a second. Search Linear first and adopt an existing ticket when one already covers the work.

EVIDENCE RULE: every row you emit carries a citation you read in THIS run — file:line, a Linear issue id you re-read live, or the exact command you ran. Nothing from memory, nothing carried from a previous report, nothing from a ticket description you did not open. A source you could not read is UNKNOWN with its exact failing command — never an empty row, never an inference (reference_empty_result_is_not_evidence_of_absence).
{{delegation_step}}
{{fences}}Return per schema only.
