ENR feasibility evaluation (v3 reframe) — the question sharpened from "Workflow or not?" to "what is the right substrate for a local-first escalation ladder per field?"
coba=taste sense in Frank's experiment). It becomes Rung 1 of the ladder and carries the bulk load.feedback_anthropic_sdk_requires_frank_approval gate applies only to @anthropic-ai/sdk / new Anthropic() / ANTHROPIC_API_KEY. The claude CLI subprocess is already how Pass 1.2 runs. So all three ladder rungs are sanctioned channels today — no new approval needed.The escalation ladder is the right strategy. Frank's design instinct holds: local-first, pay only for the hard residue, and the Claude CLI is already a sanctioned rung. The cost wall is gone.
The ladder itself is deterministic handler code, not multi-agent orchestration. "Try local → judge quality → escalate Gemini → escalate Claude CLI" is a fallback chain with a quality gate between rungs. It doesn't need Claude subagents to route. It needs a job dispatcher that already exists.
Portfolio:
queue_type='field_topup' handler). Extends what exists; parallelizes across two Macs via SKIP LOCKED.enriched → production gate, corpus prune). Claude fan-out is the right primitive there.Answering Frank's doubt directly: the JS Workflow is too rigid here — not just rigid, but the wrong primitive. Its core move is "fan out Claude subagents." The ladder's work is "route one job through three non-Claude / CLI channels with a quality gate." That's handler code + a durable dispatcher — which the queue already expresses natively.
count candidates locally. Run a cheap quality gate (dedup + schema + length). Pass → merge-append into t070 column, done. Bulk lands here. The free channel does the most work.
opposite_expressions jsonb (CT2)NA_NO_LEXICAL_ANTONYM skips the ladder entirely.similar_expressions jsonb (CT2)collocations + related_compounds jsonb (CT2)parent_card_id → CT2)(parent_card_id, form_text) — idempotent, never overwrite existing CT3 rows.feedback_use_queue_not_loops: it IS the queue.
agent() = Claude fan-out can't BE the local/Gemini rungs — every rung becomes a Claude agent shelling out (two layers of indirection).agent() over scripts trips feedback_use_queue_not_loops.enriched → production gate, PLAN-139 ghost-sense prune). Claude subagents are the right primitive here — each judge is a reasoning agent, not a shell command. Runs on the Claude bucket, separate from Gemini generation.feedback_api_rate_limits. Exact threshold/plan not re-checked against billing this session.qa-exploration/experiments/2026-06-26-sea-lion-local-vs-hosted.md.claude CLI subprocess is sanctioned — SDK gate applies only to @anthropic-ai/sdkfeedback_anthropic_sdk_requires_frank_approval scope.t_enrich_queue has a queue_type discriminator; claim_next_enrich_row uses FOR UPDATE SKIP LOCKEDopposite_expressions / similar_expressions / collocations / related_compounds) + CT3 form rows — no new schemafeedback_never_destructive_promote)agent() spawns Claude subagents (not local models / not the CLI rung); cap ≈ min(16, cores−2)pedagogy-review.ts QA writer is broken; blocks all enriched → production promotionqueue_type='field_topup' handler on the existing daemon — not a JS Workflow, not cmux/doc plans: ladder job + router + merge, and QA-as-Workflow