Part of #531 — stage 1 of the control-tower planning agent's staged execution plan (see the plan comment on #531 for full context and the member-disposition map). Filed by the control tower per the #603 child-per-stage pattern. STOPGAP NOTE: plain child issue pending the #552 sub-issues convention — convert to a native sub-issue when #552 lands.
Scope
Repo-local orchestrator scripts/check-portability.sh + scripts/check-portability.test.sh, and a new portability-gate job in ci.yml added to ci-status.needs. Load-bearing work: the guard-detection engine (shared by every later stage) — a presence-gated "if installed" reference or one declared in dependencies passes; a bare unguarded cross-plugin / marketplace-internal reference fails. Mirrors check-silent-skips.sh's grep-tripwire-plus-annotated-exemption shape.
Stopgaps sanctioned by the plan (no operator lock needed for this stage): seed tokens inline in the script (external token-list format = OPERATOR DECISION #3 on #531, deferred); site-level escape hatch # portability-ok: <reason> tagged STOPGAP (final name = OPERATOR DECISION #2 on #531); repo-local script placement per the #593 precedent.
Acceptance criteria (lifted from PR #593 / silent-skip precedent)
Part of #531 — stage 1 of the control-tower planning agent's staged execution plan (see the plan comment on #531 for full context and the member-disposition map). Filed by the control tower per the #603 child-per-stage pattern. STOPGAP NOTE: plain child issue pending the #552 sub-issues convention — convert to a native sub-issue when #552 lands.
Scope
Repo-local orchestrator
scripts/check-portability.sh+scripts/check-portability.test.sh, and a newportability-gatejob inci.ymladded toci-status.needs. Load-bearing work: the guard-detection engine (shared by every later stage) — a presence-gated "if installed" reference or one declared independenciespasses; a bare unguarded cross-plugin / marketplace-internal reference fails. Mirrorscheck-silent-skips.sh's grep-tripwire-plus-annotated-exemption shape.Stopgaps sanctioned by the plan (no operator lock needed for this stage): seed tokens inline in the script (external token-list format = OPERATOR DECISION #3 on #531, deferred); site-level escape hatch
# portability-ok: <reason>tagged STOPGAP (final name = OPERATOR DECISION #2 on #531); repo-local script placement per the #593 precedent.Acceptance criteria (lifted from PR #593 / silent-skip precedent)
shellcheck --rcfile .shellcheckrcclean; wired intoci-status.needs.machine-specific-pathsaction owns that slice).