Repository navigation
deploy: seven pip tasks install from code_source on fleet nodes — the class is 16 sites, not 6 #17246
Description
Activity
- addedbugSomething isn't workingSomething isn't working
on Sep 22, 2026 Six of the seven are fixed in #17338 (head
a4b2e7a0e5):backend_services,browser,tts-workerand the threeagent_configsites now read aconstraints/shared.txtstaged onto the node byroles/_shared/tasks/stage_shared_manifests.yml._KNOWN_UNSTAGEDshrinks 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-workerreads its whole manifest from the checkout and that manifest editable-installsautobot_shared; routing it throughbuild-filtered-requirements.sh, which strips that line, would silently drop the dependency, since nothing else installs it in that venv (roles/autobot_sharedsyncs to a PYTHONPATH directory and runs only underdeploy_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.Six of seven delivered in #17338 (
193b182c79); the issue stays open on its third criterionVerified from
origin/main.- Six sites stage their manifest and read the local copy.
backend_services,browser,tts-workerand the threeagent_configtask files now read{{ autobot.base_dir }}/constraints/shared.txt, staged byroles/_shared/tasks/stage_shared_manifests.yml(dest:at:44and:57), which each of them includes. - Every fixed entry is removed from the baseline.
_KNOWN_UNSTAGEDinrepo_tests/ansible_code_source_delegation_17243_test.pyholds 1 entry on main, down from 7.test_the_baseline_has_no_stale_entriesis what makes that a shrink rather than a claim. -
_KNOWN_UNSTAGEDempty and the exemption mechanism removed. NOT MET. The seventh site,roles/npu-worker, reads its whole manifest from the checkout, and that manifest editable-installsautobot_shared— nothing else puts it in that venv (roles/autobot_sharedsyncs to a PYTHONPATH directory and runs only underdeploy_role == 'autobot_shared'). Routing it throughbuild-filtered-requirements.sh, which strips that line, would silently drop the dependency: Backend requirements '-r ../requirements.txt' unresolvable on deploy + stripped by filter (root deps may be uninstalled) #11135's class of regression. Filed as deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334 with the decision it needs and a recommendation, rather than forced into a shape that fits. - Verified on a multi-host topology. NOT MET — same as CRITICAL(deploy): the filtered backend manifest bakes a controller-only constraint path, so provisioning still aborts on every non-manager node #17331's fourth criterion. The six repointed sites are unexercised on a fleet node.
So: two criteria delivered and verified, two blocked — one on #17334's decision, one on a host run. Not closing on a merge.
- Six sites stage their manifest and read the local copy.
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 last site cannot read its manifest from the deployed tree because
autobot_sharedis not on a
dedicated NPU node. The two archives are gated on different groups in Play 2 of
playbooks/update-all-nodes.yml: the worker tree on'npu' in group_names,autobot_sharedon
'backend' in group_names. A host innpuand notbackendgets one and not the other. - So this issue's third criterion —
_KNOWN_UNSTAGEDempty and the exemption mechanism removed —
is blocked on deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334's decision about whereautobot_sharedlives on a worker node. The baseline
entry is correct and should stay until then. - One narrowing:
constraints/shared.txtis already staged node-locally (CRITICAL(deploy): the filtered backend manifest bakes a controller-only constraint path, so provisioning still aborts on every non-manager node #17331), so deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334 only
has to decide theautobot_sharedhalf. The baseline's comment ("only the full checkout has both
siblings") is half stale and worth correcting whenever that entry is removed.
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.
- The last site cannot read its manifest from the deployed tree because
Classification (for work assignment — not a fix proposal)
- Scope:
deploy(secondaryansible) - Primary files/dirs:
autobot-slm-backend/ansible/roles/npu-worker/tasks/main.yml: the one remaining site,NPU Worker | Install worker dependencies from its manifest. Named in the issue; confirmed as the sole_KNOWN_UNSTAGEDentry on main.repo_tests/ansible_code_source_delegation_17243_test.py:_KNOWN_UNSTAGEDat:100-104holds exactly 1 entry (verified on main).autobot-npu-worker/requirements.txt(the manifest with-e ../autobot_shared, per deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334; not re-read).
- Class: the same
code_sourceclass as CRITICAL(deploy): backend provisioning aborts on every non-manager host — a task executes a script out of code_source, which exists only on the controller (rc=127) #17242, deploy: five more tasks read code_source on hosts that do not have it — three are in the builtin updater (#17242 class) #17243, CRITICAL(deploy): the filtered backend manifest bakes a controller-only constraint path, so provisioning still aborts on every non-manager node #17331 and deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334. deploy: the WSL2 backend_ai_stack_host override skips the locality check its sibling task already applies #17244 is a different class. - Umbrella: no. Its remaining work was split out to deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334 (open, no milestone, labelled
needs-decision). - Blocked by:
- An owner ruling on deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334: where
autobot_sharedlives on a worker node. The options are (1) stage the tree and keep it editable, (2) install it as a package, or (3) generate on the controller; deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334 recommends option 1. The owner's comment of 2026-09-24 records the repoint as written and reverted pending that ruling. - Host evidence: AC4, a multi-host run with an npu-only node.
- Six of the seven sites merged in
193b182c7.
- An owner ruling on deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334: where
- Read vs inferred: Read the issue body, all 3 comments, deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334's body, and on main the
_KNOWN_UNSTAGEDdefinition. The npu-worker task file was not re-read; its state is taken from the guard's baseline entry. - Undetermined: none beyond the ruling. Note that deploy(npu-worker): the last code_source read on a fleet node needs an autobot_shared decision, not a rewrite #17334 carries no milestone although this v0.9.0 issue cannot close without it.
Generated by Claude Code
- Scope:
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>at7adaca8c29.blocked_by: #17334recorded 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 byroles/_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:100is 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_UNSTAGEDempty 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 throughbuild-filtered-requirements.sh, strips that line, which would silently dropautobot_sharedfrom the NPU venv with nothing else installing it there:roles/autobot_sharedsyncs to a PYTHONPATH directory and only runs underdeploy_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-99and 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.
Seven
pip:tasks install from a manifest insidecode_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.
roles/agent_config/tasks/openvino.ymlroles/agent_config/tasks/playwright.ymlroles/agent_config/tasks/python_deps.ymlroles/backend_services/tasks/main.ymlroles/browser/tasks/main.ymlroles/npu-worker/tasks/main.ymlroles/tts-worker/tasks/main.ymlAll 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 includepip:, whoserequirements/extra_args/chdirare equally target-side paths, reports 16. Ten sites wereinvisible 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.pyrecords them in_KNOWN_UNSTAGEDsothe guard blocks new instances immediately instead of waiting for the backlog. The list may
only shrink:
test_the_baseline_has_no_stale_entriesfails when an entry stops being anoffender, 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 thecontroller. Each site needs its manifest staged onto the node and the task repointed at the
local copy, as #17241 does for
constraints/shared.txtand the three GPU manifests.Two of these may turn out not to need a fix at all:
roles/agent_config/*already hasLOGICAL_ONLYentries inrepo_tests/ansible_manifest_resolution.pydescribing its installs asunderivable, so its real binding should be confirmed before changing anything.
Acceptance criteria
shown not to be a defect with the reason recorded at the site.
_KNOWN_UNSTAGED; the guard fails if one is left behind._KNOWN_UNSTAGEDis empty at completion, and the exemption mechanism is then removed so itcannot be repopulated.
Related