Local Install Acceptance Targets Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Make release local-install acceptance consume the platform target registry's client_activation_check policy and verify installed marker target metadata against the canonical registry.
Architecture: Keep content/distribution/platform-targets.yaml as the source of truth for which platform targets need local client activation. release_local_install_check.py should load registry targets whose smoke.client_activation_check is local_install_acceptance, validate only supported local installer targets there, and compare installed .qiongli-managed.json marker metadata to the registry-derived target metadata.
Tech Stack: Python standard library, existing qiongli.platform_targets, unittest.
Files
- Modify:
tooling/scripts/release_local_install_check.py- Import platform target loading helpers.
- Add local acceptance target selection from registry smoke policy.
- Validate installed plugin markers carry matching
platform_targetmetadata.
- Modify:
tests/test_release_local_install_check.py- Add a failing test proving marker target metadata is required and registry-derived.
- Modify:
docs/superpowers/roadmaps/2026-07-01-adaptive-subject-runtime-roadmap.md- Record local-install acceptance target selection as registry-backed.
Task 1: Add RED Marker Metadata Test
- [x] Step 1: Add installed marker target metadata fixture
Add this test to tests/test_release_local_install_check.py:
def test_validate_install_tree_requires_registry_target_metadata_in_markers(self) -> None:
module = load_release_local_install_check()
with tempfile.TemporaryDirectory() as tmp_dir:
root = Path(tmp_dir)
repo_root = root / "repo"
sandbox = module.build_sandbox(root / "sandbox")
self._write_repo_version(repo_root, "v9.9.9")
self._write_platform_target_registry(repo_root)
self._write_codex_plugin_tree(
sandbox,
manifest_category=False,
include_target_metadata=False,
)
self._write_claude_plugin_tree(sandbox)
self._write_antigravity_plugin_tree(sandbox)
self._write_json(
sandbox.antigravity_config_path,
{"mcpServers": {}},
)
self._write_json(
sandbox.hermes_config_path,
{"mcpServers": {"qiongli": {"command": "qiongli", "args": module.QIONGLI_MCP_ARGS}}},
)
payload = {
"installed": {
"codex": {"installed": True, "surface": "plugin"},
"claude": {"installed": True, "surface": "plugin"},
"antigravity": {
"installed": True,
"surface": "plugin",
"mcp": {
"path": str(sandbox.antigravity_plugin_root / "mcp_config.json"),
"source": "plugin",
},
},
"hermes": {"installed": True, "surface": "mcp"},
}
}
with self.assertRaisesRegex(
module.LocalInstallCheckError,
"Codex plugin marker platform_target.target_id expected codex-marketplace-plugin",
):
module.validate_install_tree(repo_root, sandbox, payload)- [x] Step 2: Add fixture registry writer
Add this helper to ReleaseLocalInstallCheckTests:
def _write_platform_target_registry(self, repo_root: Path) -> None:
registry = repo_root / "content" / "distribution" / "platform-targets.yaml"
registry.parent.mkdir(parents=True, exist_ok=True)
registry.write_text(
"""
schema_version: "1.0"
targets:
codex-marketplace-plugin:
display_name: Codex Marketplace Plugin
artifact_kind: marketplace-plugin
archive_format: tar.gz
adapter:
kind: plugin
plugin_manifest_platform: codex
materializer: plugin_artifacts
smoke:
structural_archive_check: marketplace_validation
client_activation_check: local_install_acceptance
source_inputs: [content/workflow/**]
required_paths: [plugin.json]
allowed_wrapper_dirs: []
forbidden_paths: [.claude-plugin/]
bundled_mcp_mode: codex-plugin-local-node
command_surface: slash-commands
validator: codex-marketplace-plugin
release_download:
guide_label: Codex
recommended_key: codex
asset_groups: []
claude-code-marketplace-plugin:
display_name: Claude Code Marketplace Plugin
artifact_kind: marketplace-plugin
archive_format: tar.gz
adapter:
kind: plugin
plugin_manifest_platform: claude
materializer: plugin_artifacts
smoke:
structural_archive_check: marketplace_validation
client_activation_check: local_install_acceptance
source_inputs: [content/workflow/**]
required_paths: [plugin.json]
allowed_wrapper_dirs: []
forbidden_paths: [.codex-plugin/]
bundled_mcp_mode: claude-plugin-local-node
command_surface: slash-commands
validator: claude-code-marketplace-plugin
release_download:
guide_label: Claude Code
recommended_key: claude_code
asset_groups: []
antigravity-local-plugin:
display_name: Antigravity Local Plugin
artifact_kind: local-plugin
archive_format: directory
adapter:
kind: local-plugin
plugin_manifest_platform: none
materializer: local_plugin_installer
smoke:
structural_archive_check: marketplace_validation
client_activation_check: local_install_acceptance
source_inputs: [content/workflow/**]
required_paths: [plugin.json]
allowed_wrapper_dirs: []
forbidden_paths: [.codex-plugin/]
bundled_mcp_mode: antigravity-python-runtime
command_surface: slash-commands
validator: antigravity-local-plugin
release_download:
guide_label: Antigravity
recommended_key: antigravity
asset_groups: []
claude-desktop-skill-zip:
display_name: Claude Desktop Skill ZIP
artifact_kind: skill-zip
archive_format: zip
adapter:
kind: skill-zip
plugin_manifest_platform: none
materializer: desktop_skill_artifacts
smoke:
structural_archive_check: marketplace_validation
client_activation_check: not_applicable
source_inputs: [content/workflow/**]
required_paths: [SKILL.md]
allowed_wrapper_dirs: []
forbidden_paths: [.codex-plugin/]
bundled_mcp_mode: none
command_surface: skill-workflows
validator: claude-desktop-skill-zip
release_download:
guide_label: Claude Desktop/Web skills
recommended_key: claude_desktop_skill
asset_groups: []
""".lstrip(),
encoding="utf-8",
)- [x] Step 3: Run RED
.venv/bin/python -m unittest tests.test_release_local_install_check.ReleaseLocalInstallCheckTests.test_validate_install_tree_requires_registry_target_metadata_in_markers -qExpected: FAIL because validate_install_tree() accepts markers without registry platform_target metadata.
Task 2: Implement Registry-Backed Marker Validation
- [x] Step 1: Import target helpers
In tooling/scripts/release_local_install_check.py, add the repo Python source root to sys.path, then import:
from qiongli.platform_targets import PlatformTarget, load_platform_targets- [x] Step 2: Add acceptance target mapping
Add:
LOCAL_INSTALL_TARGET_CLIENTS = {
"codex-marketplace-plugin": ("codex", "Codex"),
"claude-code-marketplace-plugin": ("claude", "Claude"),
"antigravity-local-plugin": ("antigravity", "Antigravity"),
}
def local_install_acceptance_targets(repo_root: Path) -> dict[str, PlatformTarget]:
return {
target_id: target
for target_id, target in load_platform_targets(repo_root).items()
if target.smoke.get("client_activation_check") == "local_install_acceptance"
}- [x] Step 3: Validate marker target metadata
Add:
def _validate_marker_platform_target(marker: dict[str, Any], target: PlatformTarget, label: str) -> None:
payload = marker.get("platform_target")
if not isinstance(payload, dict):
payload = {}
expected = {
"target_id": target.target_id,
"artifact_kind": target.artifact_kind,
"archive_format": target.archive_format,
"bundled_mcp_mode": target.bundled_mcp_mode,
"command_surface": target.command_surface,
"validator": target.validator,
}
for key, value in expected.items():
_expect(
payload.get(key) == value,
f"{label} plugin marker platform_target.{key} expected {value}",
)In the existing marker loop, call _validate_marker_platform_target(...) for each target in local_install_acceptance_targets(repo_root) that is present in LOCAL_INSTALL_TARGET_CLIENTS.
- [x] Step 4: Run GREEN
.venv/bin/python -m unittest tests.test_release_local_install_check.ReleaseLocalInstallCheckTests.test_validate_install_tree_requires_registry_target_metadata_in_markers -qExpected: OK after fixture markers include target metadata in the existing helper writers, or fail until the test fixture helper writers are updated for the happy path.
Task 3: Update Existing Happy Fixtures And Roadmap
- [x] Step 1: Add marker metadata to test fixture writers
Update _write_codex_plugin_tree, _write_claude_plugin_tree, and _write_antigravity_plugin_tree to include the expected platform_target object in .qiongli-managed.json for existing happy-path tests.
- [x] Step 2: Update roadmap
Update Stage 12 status and remaining product gap wording to say local-install acceptance now selects registry targets by client_activation_check and verifies installed marker metadata against the registry.
- [x] Step 3: Run regression checks
.venv/bin/python -m unittest tests.test_release_local_install_check tests.test_local_plugin_installer tests.test_plugin_distribution_contract -q
.venv/bin/python tooling/scripts/validate_platform_targets.py
git diff --check- [ ] Step 4: Commit by category
git add tooling/scripts/release_local_install_check.py tests/test_release_local_install_check.py
git commit -m "feat(release): validate local install target metadata"
git add docs/superpowers/plans/2026-07-06-local-install-acceptance-targets.md \
docs/superpowers/roadmaps/2026-07-01-adaptive-subject-runtime-roadmap.md
git commit -m "docs(roadmap): record local install acceptance target validation"