Skip to content

feat(routes): exclusion expressions for plan pool definitions (model on all doors except X) #637

Closed

Description

@dezren39

Request: exclusion expressions for model route / plan pool definitions

Today a plan pool (e.g. deepseek-flash-plan) enumerates every leaf target explicitly. As the pool set grows (per-model pools × many doors × three OpenCode Go workspaces), enumeration is error-prone and hides intent: several pools we want are most naturally expressed as a model on a door set minus exclusions.

Motivating examples (from the 2026-10-27 pool review)

  • deepseek-flash on all doors except ClinePass — ClinePass's flat meter is more valuable reserved for MiMo; Flash burns better on Go (promo rate) and OpenDesign.
  • mimo-flash on ClinePass (plus Go/OpenDesign) — the inverse reservation.
  • The standing rule "any pool containing one OpenCode Go workspace contains all three (personal, lab, base)" is currently maintained by hand-enumerating three near-identical leaves per pool.

Proposed shape

Allow a target/pool definition to express a model over a door set with exclusions, composing with the existing controls (selection mode, weights, per-target variant pins/remaps, context limits, and disabled_providers skipping):

{ "model": "deepseek-v4.1-flash", "doors": "all", "exclude": ["cline-pass"] }

or equivalently negative targets in the existing list form:

"targets": [
  { "model": "*deepseek-v4.1-flash" },        // all doors serving this model
  { "model": "-cline-pass/deepseek-v4.1-flash" }
]

Exact syntax is open; requirements are:

  1. Expansion happens against the live provider catalog (a door is included iff it lists the model and is not disabled).
  2. Exclusions win over inclusions, always.
  3. Expansion is visible/verifiable — a way to dump the resolved leaf list per route so config reviews can check what a pool actually contains.
  4. Existing fully-enumerated pools keep working unchanged.

Why

Pool definitions become statements of intent ("Flash everywhere except the meter reserved for MiMo") instead of leaf inventories that silently drift when a door adds or drops a model.

Acceptance criteria

  • A pool/target definition can express a model over a door set with exclusions (e.g. deepseek-flash on all doors except ClinePass), composing with selection mode, weights, per-target variant pins/remaps, context limits, and disabled_providers skipping.
  • Expansion resolves against the live provider catalog: a door is included only if it lists the model and is not disabled, and exclusions always win over inclusions.
  • The resolved leaf list per route can be dumped/verified, so a config review can check what a pool actually contains (including the all-three-OpenCode-Go-workspaces rule).
  • Existing fully-enumerated pools keep working and resolve unchanged.

Activity

  1. developing-today commented on Oct 27, 2026

    @developing-today
  2. added
    kind/featureNew feature or capability request
    priority/normalOrdinary priority (the default)
    effort/mMedium: expected under 1 day of work
    source/humanFiled directly by a human
    app/corePackage: core (pkgs/ or apps/ in this repo)
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 27, 2026
  3. dezren39 commented on Oct 27, 2026

    @dezren39
    Author

    Intake review

    Related: #639 (time-windowed weights — independent, shared 'pool definition as intent' goal). Liveness: no merged PR implements pool exclusions — checked merged routes PRs through 2026-10-27; issue is live. An ## Acceptance criteria section was appended this run (original body preserved verbatim above it), formalizing the body's four requirements. The issue arrived with no labels at all; the full minimum set (kind/source/status/priority/effort/app) was applied this run.

    Notes / risks / suggested approach: Risk: syntax choice is the open decision — the two sketched forms (doors/exclude fields vs negative targets) have different composability with weights and variant pins; pin one in triage before implementing. Suggested approach: expansion at config load against the live catalog, exclusions strictly winning, plus the resolved-leaf dump as the review surface.

    🤖 Agent note · filed

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-10-27 14:19 CDT — intake enrichment (protocol §5)
    • Found via: monitor reconciliation
    • Task: Exclusion expressions for plan pool definitions: a model over a door set minus exclusions, expanded against the live provider catalog, with a verifiable resolved-leaf dump.
    • Expectation: intake only this run — labels normalized, liveness checked, acceptance criteria in place; the fix itself routes through the normal queue/sweep path
    • Links: n/a
  4. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    Triage — 2026-10-28 (queue task 2150)

    Verdict: valid feature, not implemented, routed as a scoped follow-up (queue task 2909).

    Verified against current main a9452a1546:

    • packages/core/src/model-plan.ts — PoolEntry is metadata only (tier, purpose, updatedAt); pools carry no expression language.
    • packages/core/src/model-route-expansion.ts — matchingModels expands * patterns within one provider's catalog only; there is no provider (door) set, and no exclusion semantics.
    • packages/core/src/config/plugin/model-routes.ts — targets are explicit refs (expanded at line 94); no negative-target or door-set form exists in the route config code.
    • The only excluded* concepts in the codebase are session-governance excludedModels (a different layer) and route-review decision tallies (observational). Neither expresses a pool definition.
    • disabled_providers decoding already exists (packages/core/src/config/normalize.ts:433), so requirement 1's skipping input is in place for the implementation to compose with.

    Routing: follow-up implementation packet enqueued as queue task 2909 (repo-health:v1:fix:developing-today/opencode:issue:637) with the issue's four acceptance criteria verbatim, the code citations above, and the syntax choice (door-set form vs negative targets) left to the implementer to note here. Priority stays priority/normal; this is not a bug and nothing is blocked on Drew — the issue already decided the requirements, including "exclusions win, always".

    Labels: status/needs-triage removed; queue/queued reflects task 2909.


    agent-note:v1 · agent: repo-queue-worker-shift-opencode-b · task: 2150 · issue: #637 · action: triage-routed · followup-task: 2909

  5. added
    queue/queuedHas a queued task in the Supabase agent queue
    queue/claimedA queue worker has claimed the task for this item
    work/assignedAn agent holds this item via the queue (claimed task)
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 28, 2026
  6. 24 remaining items

  7. added
    queue/claimedA queue worker has claimed the task for this item
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    queue/claimedA queue worker has claimed the task for this item
    work/assignedAn agent holds this item via the queue (claimed task)
    on Oct 29, 2026
  8. dezren39 commented on Oct 29, 2026

    @dezren39
    Author

    🤖 Agent note · handed off

  9. dezren39 commented on Oct 29, 2026

    @dezren39
    Author

    🤖 Agent note · revived

    • Agent: operator (Muse)
    • Session / ID: queue task 2909 (repo-health-opencode-pilot) — operator repair 2026-10-29
    • Found via: fleet monitor dead-in-queue alert (run 2026-10-29 05:12 CDT)
    • Task: Task 2909 hit its attempt cap (attempts 2/2) while its PR was healthy — the cap, not the work, was the blocker. Operator repair applied and verified: max_attempts raised 2→3, attempts unchanged, status kept queued, resume brief replaced in the task progress. Fresh verification at repair time: PR feat(core): door-set targets with exclusions for model routes (#637) #810 head 1b6f156f46, mergeable=clean, all basic-tier checks SUCCESS including basic unit (windows) — the earlier windows failure was a diagnosed tool-shell 3s-timeout flake, and laptop suites were 67/67.
    • Expectation: the next holder resumes as shepherd of PR feat(core): door-set targets with exclusions for model routes (#637) #810 only — re-check CI on the current head, merge when green, complete task 2909 as fixed_merged. Do NOT re-implement and do NOT open a competing PR.
    • Links: PR feat(core): door-set targets with exclusions for model routes (#637) #810 (branch queue/2909-637-exclusion-expressions)
  10. added a commit that references this issue on Oct 29, 2026
  11. dezren39 commented on Oct 29, 2026

    @dezren39
    Author

    🤖 Agent note · done (PR merged)

  12. removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    app/corePackage: core (pkgs/ or apps/ in this repo)effort/mMedium: expected under 1 day of workkind/featureNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)source/humanFiled directly by a humanstatus:done

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions