Skip to content

deploy: seven pip tasks install from code_source on fleet nodes — the class is 16 sites, not 6 #17246

Description

@mrveiss

Seven pip: tasks install from a manifest inside code_source — the controller's git checkout,
which no task syncs to a node. Same defect as #17242; different module, so the first sweep did
not see them.

Role file Task
roles/agent_config/tasks/openvino.yml Set up OpenVINO environment in venv
roles/agent_config/tasks/playwright.yml Install Playwright via pip in venv
roles/agent_config/tasks/python_deps.yml Install Python packages from requirements.txt
roles/backend_services/tasks/main.yml Install Python dependencies
roles/browser/tasks/main.yml Browser | Install Playwright and FastAPI dependencies via pip
roles/npu-worker/tasks/main.yml NPU Worker | Install worker dependencies from its manifest
roles/tts-worker/tasks/main.yml TTS Worker | Install pocket-tts and audio dependencies

All paths relative to autobot-slm-backend/ansible/.

How these were missed, which is the more useful finding

#17243's sweep scanned only modules whose payload is a command — shell, command, script,
raw — and reported 6 sites. Widening the same detector to include pip:, whose
requirements/extra_args/chdir are equally target-side paths, reports 16. Ten sites were
invisible because of one omission in the detector's module list, and the sweep gave no signal
that its coverage was partial.

That is the measurement failure worth carrying forward: a detector that names its inputs by an
allow-list reports confidently on whatever it forgot to include. The fix for the guard was to
enumerate module classes by what they do with a path rather than by how they run.

Why they are baselined rather than fixed in #17241

They are pre-existing and none is introduced by that PR, which was already carrying four issues.
repo_tests/ansible_code_source_delegation_17243_test.py records them in _KNOWN_UNSTAGED so
the guard blocks new instances immediately instead of waiting for the backlog. The list may
only shrink: test_the_baseline_has_no_stale_entries fails when an entry stops being an
offender, so a fix cannot leave its record behind, and nothing can be added to make a new
violation pass.

The fix shape

Delegation is not the answer for pip: — delegating an install moves the packages to the
controller. Each site needs its manifest staged onto the node and the task repointed at the
local copy, as #17241 does for constraints/shared.txt and the three GPU manifests.

Two of these may turn out not to need a fix at all: roles/agent_config/* already has
LOGICAL_ONLY entries in repo_tests/ansible_manifest_resolution.py describing its installs as
underivable, so its real binding should be confirmed before changing anything.

Acceptance criteria

  • Each of the seven either stages its manifest onto the node and reads the local copy, or is
    shown not to be a defect with the reason recorded at the site.
  • Every entry fixed is removed from _KNOWN_UNSTAGED; the guard fails if one is left behind.
  • _KNOWN_UNSTAGED is empty at completion, and the exemption mechanism is then removed so it
    cannot be repopulated.
  • Verified on a multi-host topology — a single-node run cannot reproduce any of these.

Related

Activity

  1. added this to the v0.9.0 milestone on Sep 22, 2026
  2. mrveiss commented on Sep 23, 2026

    @mrveiss
    OwnerAuthor

    Six of the seven are fixed in #17338 (head a4b2e7a0e5): backend_services, browser, tts-worker and the three agent_config sites now read a constraints/shared.txt staged onto the node by roles/_shared/tasks/stage_shared_manifests.yml.

    _KNOWN_UNSTAGED shrinks 7 → 1, measured on that tree rather than asserted: seen 13 offenders 1 baseline 1, stale [], unbaselined [], against the guard's floor of 8.

    This issue does not close. Its third criterion — baseline empty and the exemption mechanism removed — cannot be met while the seventh site stands. roles/npu-worker reads its whole manifest from the checkout and that manifest editable-installs autobot_shared; routing it through build-filtered-requirements.sh, which strips that line, would silently drop the dependency, since nothing else installs it in that venv (roles/autobot_shared syncs to a PYTHONPATH directory and runs only under deploy_role == 'autobot_shared'). That is #11135's class of regression, so it is #17334 with the decision it needs rather than a rewrite that fits the shape.

  3. mrveiss commented on Sep 24, 2026

    @mrveiss
    OwnerAuthor

    Six of seven delivered in #17338 (193b182c79); the issue stays open on its third criterion

    Verified from origin/main.

    So: two criteria delivered and verified, two blocked — one on #17334's decision, one on a host run. Not closing on a merge.

  4. mrveiss commented on Sep 24, 2026

    @mrveiss
    OwnerAuthor

    Blocked by #17334, with the blocker now measured rather than described

    I claimed this to finish the last site and the exemption mechanism, wrote the repoint, then reverted
    it. The evidence is on #17334; the summary for this issue's readers:

    The fourth criterion — verified on a multi-host topology — I cannot satisfy in any case: it needs an
    inventory with an npu-only host, and a single-node run cannot reproduce it. Stating that rather than
    leaving it looking open for lack of attention.

    Claim released. Whoever takes #17334's decision gets this issue's last site as a mechanical follow-up.

  5. mrveiss commented on Sep 28, 2026

    @mrveiss
    OwnerAuthor

    Classification (for work assignment — not a fix proposal)


    Generated by Claude Code

  6. mrveiss commented on Sep 28, 2026

    @mrveiss
    OwnerAuthor

    Closure pass — six of the seven sites are fixed, one criterion is genuinely blocked, and this issue is explicitly not closed.

    Evidence via git show origin/main:<path> at 7adaca8c29. blocked_by: #17334 recorded as a native dependency edge, not only in prose.

    AC1 — each of the seven either stages its manifest or is shown not to be a defect — PARTIALLY met, NOT ticked. Six now read {{ autobot.base_dir }}/constraints/shared.txt, staged by roles/_shared/tasks/stage_shared_manifests.yml:41-47. The seventh is not "shown not to be a defect" — it is one, deliberately deferred, which is a different state and does not satisfy this wording.

    AC2 — every entry fixed is removed from _KNOWN_UNSTAGED — MET. repo_tests/ansible_code_source_delegation_17243_test.py:100 is down to a single entry:

    _KNOWN_UNSTAGED = frozenset(
        {
            "roles/npu-worker/tasks/main.yml :: NPU Worker | Install worker dependencies from its manifest",
        }
    )

    test_the_baseline_has_no_stale_entries (:198) fails when an entry stops being an offender, so nothing was left behind — the list is shrink-only by construction and is the live measure, not a snapshot.

    AC3 — _KNOWN_UNSTAGED empty and the exemption mechanism removed — BLOCKED by #17334. Not a matter of effort. The remaining site reads its whole manifest out of the checkout, and that manifest opens with -e ../autobot_shared (#15733) — an editable install of a sibling package tree. The obvious repair, routing it through build-filtered-requirements.sh, strips that line, which would silently drop autobot_shared from the NPU venv with nothing else installing it there: roles/autobot_shared syncs to a PYTHONPATH directory and only runs under deploy_role == 'autobot_shared'. That is the #11135 class of regression — a fix that reads as correct and breaks a node. The rationale is recorded in the guard at :84-99 and now also on #17334, so it survives as the reason for the exemption rather than only as a baseline entry.

    AC4 — verified on a multi-host topology — NOT MEASURABLE NOW. Host mid-update; no reading taken. Unticked deliberately.

    Held open by AC1, AC3 (blocked) and AC4. Partial delivery closes nothing, so nothing here is closed.

  7. modified the milestones: v0.9.0, v0.9-blocked on Sep 28, 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

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions