---
title: Fix implement-mount guard to cover the ████████████████ read surface
type: task
status: planned
description: >-
  The contribution implement dispatch refuses every plan under task/league/** with plan_unmounted
  although the ████████████████ container can read them via its read surface (read-surface refactor
  dc0e01c640 dropped task/league from profile mounts without updating plan_is_mounted); the pipeline
  fails every 10 minutes since 2026-11-05 17:35 on the ruled show-player-names implement.
base_uri: user:task/league/fix-implement-mount-guard-covers-the-read-surface.md
created_at: '2026-11-05T18:26:05.231Z'
entity_id: 17520902-209a-451f-8f11-53212b18c695
owner_identity_uri: █████████████████████████
priority: High
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-11-05T18:26:05.231Z'
visibility_analyzed_at: '2026-11-06T00:17:53.562Z'
---

## Ask

The contribution implement dispatch refuses every task whose plan lives under `task/league/**` with `plan_unmounted`, even though the ████████████████ container can read those plans. Fix the guard so the ruled implement on [[█████████████████████-██████-█████-██-█████-████-████████-███████]] (and every other reviewed contribution plan) dispatches.

## Diagnosis

The 2026-11-01 read-surface refactor (commit dc0e01c640, "Project ████████████████'s read surface") moved ████████████████'s read grant for the league task graph out of the profile `mounts` (which had `task/league` ro) into `read_surface.path_ceiling: ["task/league/**"]` (config/thread-config-profile/league-implement.json). But `plan_is_mounted` in extension/contribution/implement-advanced-contributions.mjs (added 2026-10-26) still checks the plan's file only against the profile's `mounts` — which today hold just the rw workspace — so a plan under `task/league/**` is refused although the container can read it via the read surface. First triggered 2026-11-05 17:35; every scheduled run since fails (`dispatch_candidates: 1`, error `plan_unmounted`), raising pipeline_failure #149020 (high) each pass.

## Plan

- [ ] Make the plan-mount check agree with the implement container's real read surface: a plan file under the profile's `read_surface_path_limit` (`task/league/**`) must pass, either by having the wiring (cli/league/implement-advanced-contributions.mjs `read_implement_mounts`) fold the read surface into the mount list handed to `plan_is_mounted`, or by teaching the guard itself to match the read-surface globs.
- [ ] Extend extension/contribution/tests/implement-advanced-contributions.test.mjs: a task plan at `task/league/**` with the read-surface config is dispatchable; the workspace-only mount still refuses an outside plan.
- [ ] Rebuild extension/contribution/dist if the repo convention keeps it synced (check how dist is produced before deciding).
- [ ] Verify: the extension test suite passes, and the next scheduled pass reports `ok: true` with `dispatch_candidates` handling [[█████████████████████-██████-█████-██-█████-████-████████-███████]] (signals #149018/#149019/#149020 clear when a run goes healthy).

## Notes

The implement container's read surface caps 9 unreadable task/league files (███████████████████████ and personal-name task files); a task in that set is a corner case the string check approximates — note it, do not widen scope to solve it unless trivial.
