Skip to content

feat(prerequisites): let a version detect declare a maximum, so bounded interpreters can be checked #6017

Open
2 of 2 issues completed

Description

@kyle-sexton

Summary

prerequisites.json detect.version accepts only min, so a plugin whose runtime supports a bounded range cannot declare it. explainer-video supports Python 3.12 and 3.13 only (scripts/pydeps.py PYTHONS), but the shared checker accepts any interpreter at or above 3.12, so on a host whose only python3 is 3.14 it reports Python ready while the install hook cannot run.

Fix

Add an optional max to lib/prerequisites.mjs validation and check (inclusive or exclusive to be decided), regenerate every copy through scripts/sync-shared-copies.sh, bump each carrying plugin, then declare the bound in plugins/explainer-video/prerequisites.json.

Verification

  • node scripts/check-declared-prerequisites.mjs and scripts/sync-shared-copies.sh --check-bump origin/main pass.
  • A Python 3.14-only host reports explainer-video's python row as outdated.

Related

🤖 Generated with Claude Code

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 3, 2026
  2. kyle-sexton commented on Oct 4, 2026

    @kyle-sexton
    MemberAuthor

    This was generated by AI during triage.

    Routing: human-gated, work class C4 (structural). This extends the shared prerequisites schema contract and fans out to every plugin carrying a copy of the checker (65 tracked copies of prerequisites.mjs today), each needing a version bump. Contract changes with cross-cutting blast radius are C4, so a human approves the plan before an agent runs it.

    Open decision: is the upper bound inclusive or exclusive? RECOMMENDED: exclusive (the version must be below the bound), so explainer-video declares 3.14 and every 3.13.x passes.
    Basis: verified, lib/prerequisites.mjs:238-246 (compareVersions pads missing parts with 0), so an inclusive bound of 3.13 would mark 3.13.1 outdated; an inclusive bound only works if every declarer writes a full patch-level ceiling. Today's validation accepts only args, pattern, min (lib/prerequisites.mjs:112-118, docs/conventions/prerequisites/prerequisites.schema.json:75-83), and detectEntry checks only the floor (lib/prerequisites.mjs:356-362). explainer-video declares min: 3.12 while its installer supports only 3.12 and 3.13 (plugins/explainer-video/scripts/pydeps.py:30), so the bug in the summary is confirmed. Consider naming the key for its semantics (for example below) so nobody reads max as inclusive.

    Agent Brief

    Type: Feature
    Summary: Let a version detect in prerequisites.json declare an optional exclusive upper bound, and declare explainer-video's Python bound with it.

    Current behavior:
    detect.version accepts args, pattern and a required min. The shared checker's detectEntry reports outdated only below min, so a host whose only Python is 3.14 reports explainer-video's Python as present although its install hook cannot run there.

    Desired behavior:

    • detect.version accepts one optional upper-bound key (exclusive unless the decision above says otherwise), same dotted-number format as min, validated by the checker and the JSON schema.
    • A detected version at or above the bound reports a non-present status with a detail naming the supported range; a version inside the range reports present as today.
    • Entries without the key behave exactly as today.
    • explainer-video declares the bound so a 3.14-only host reports its Python row as not ready.

    Key interfaces:

    • detect.version config shape: new optional bound key.
    • detectEntry() status for runtime/cli kinds: gains the above-bound case (reuse outdated or add a distinct status; state the choice in the PR).
    • The prerequisites convention doc and schema: document the key.

    Acceptance criteria:

    • The repo's declared-prerequisites CI check passes.
    • The shared-copies sync check (with its bump check against origin/main) passes, with every carrying plugin regenerated and bumped.
    • Unit tests cover below min, inside the range, exactly at the bound, and above the bound.
    • A Python 3.14-only host reports explainer-video's Python row as not ready.

    Out of scope:

    • Changing how candidates in detect.any are chosen (first found on PATH still wins).
    • Upper bounds for non-version detect kinds.
  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 4, 2026
  4. kyle-sexton commented on Oct 13, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner approved applying independently verified recommendations (high-risk set, reviewed) on 2026-10-13.

    • Is the upper bound inclusive or exclusive, and what is the key called? → exclusive, key named below
      Basis: lib/prerequisites.mjs:113,240,364; plugins/explainer-video/prerequisites.json:19-22

    detect.version accepts only min, so explainer-video reports Python 3.14 as ready though it supports only 3.12 and 3.13. No max/below support on main.

    Verification notes:

    Verified by an independent fresh-context check (confirmed, risk high): gh issue view 6017 (OPEN, triage comment recommends exclusive); origin/main lib/prerequisites.mjs:108-116 (keys args, pattern, min), :238-248 (compareVersions pads with 0), :360-368; origin/main plugins/explainer-video/prerequisites.json python entry (min 3.12; degrade says 3.14 unsupported); git grep below/max in lib/prerequisites.mjs and schema: none; 74 tracked prerequisites.mjs copies; gh pr view 7183 OPEN draft

    Admission to an agent lane stays with the work-class rules and owner ratification.

  5. kyle-sexton commented on Oct 18, 2026

    @kyle-sexton
    MemberAuthor

    This was generated by AI during backlog shaping.

    This issue is split into 2 pieces, each sized for one lane PR. The exclusive-bound decision is recorded (key below, Decision recorded comment 2026-10-13) and #7183 merged 2026-10-13, so the sequencing hold is gone. The canonical checker change still fans out to 75 tracked prerequisites.mjs copies through sync-shared-copies, so it stays one attended run. Only the explainer-video declaration is lane work.

    • not filed: feat(prerequisites): accept an exclusive below bound on detect.version: allowlist: sync-shared-copies (canonical lib/prerequisites.mjs has 75 registered copies, each needing a bump or fragment)
    • not filed: fix(explainer-video): declare the Python 3.14 ceiling in prerequisites: depends on a child that is not filed

    Filed pieces are sub-issues of this one, and the paced queue admits them to the lane. Unfiled pieces wait on the blocker shown. The owner approved this split in an attended backlog-shaping session on 2026-10-18.

  6. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 24, 2026
  7. kyle-sexton commented on Oct 24, 2026

    @kyle-sexton
    MemberAuthor

    Split into lane-ready sub-issues (owner decisions Q93-Q95, C12, 2026-10-24). The bound is the owner's 2026-10-13 decision: exclusive, key below. Neither part is on main yet.

    1. feat(prerequisites): accept an exclusive below bound on detect.version #9684 feat(prerequisites): accept an exclusive below bound on detect.version, regenerate every copy, bump carriers. Runs first.
    2. fix(explainer-video): declare the Python 3.14 ceiling with below #9685 fix(explainer-video): declare below: "3.14". Blocked by feat(prerequisites): accept an exclusive below bound on detect.version #9684.

    This was generated by AI.

  8. github-actions commented on Oct 25, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  9. github-actions commented on Oct 25, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: structural
    Basis: automated intake triage; the lanes App applied this class.

    Size: Large
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: #9684, #9685

    Understood: add an optional upper bound to detect.version in the shared prerequisites checker so explainer-video can reject Python 3.14. A comment records the owner's decision (exclusive bound, key below) and splits the work into #9684 (checker change, synced copies, plugin bumps) and #9685 (explainer-video declares below: "3.14"). This issue now tracks those two. Nothing further is missing here.

    Automated triage, applied by the lanes App.

  10. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: Size large: the split into sub-issues at intake is pending (owner Q93).

  11. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 25, 2026
  12. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: This issue becomes a tracker: #​9684 adds an exclusive below bound to detect.version, and #​9685 declares below: "3.14" for explainer-video.

    Dependencies

    • #​9684: the checker change must land first
    • #​9685: waits on #​9684

    Related work

    Open questions

    1. Should this issue stay open as a tracker only, with no lane work of its own, until #​9684 and #​9685 close?
      RECOMMENDED: Yes: keep it as a tracker and close it once both children are merged, so no lane run duplicates their work. Basis: The 2026-10-24 comment moves all the work into #​9684 and #​9685. lib/prerequisites.mjs:116 still lists only args, pattern and min, so nothing is on main yet.

    Sources read

    • context.json: the 2026-10-13 Decision recorded comment settles an exclusive bound with the key below.
    • context.json: the 2026-10-24 comment splits the work into #​9684 and #​9685, neither on main yet.
    • .base/lib/prerequisites.mjs:116: version keys are validated against args, pattern and min only.
    • .base/lib/prerequisites.mjs:409: the checker reports outdated only below min, with no upper-bound check.

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

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

    priority: mediumReal value, no hard deadline; normal backlog flow.status: needs-decisionAwaiting a human or maintainer judgment call.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions