Skip to content

feat(quality): install-readiness probe — every listed artifact must actually install - #271

Open
adamkrawczyk wants to merge 1 commit into
mainfrom
feat/install-readiness-probe
Open

feat(quality): install-readiness probe — every listed artifact must actually install#271
adamkrawczyk wants to merge 1 commit into
mainfrom
feat/install-readiness-probe

Conversation

@adamkrawczyk

Copy link
Copy Markdown
Contributor

What

Adam, 2026-08-21: "not all artifacts are ready to be installed" on LoopSkill.

scripts/install_probe.py is the deterministic gate that answers this directly: it walks the REAL install path for every hosted artifact kind (skills, personalities, bundles) — not the catalog row, the actual bytes an installer would fetch. Mirrors scripts/bundle_validate.py / scripts/personality_validate.py conventions exactly: same _get() transport shim, 429-aware backoff, WARN-vs-FAIL separation, exit contract (0 all-pass / 1 failures / 2 infra), --json flag.

Gate ladders per artifact kind

  • skills (6 gates): catalog listing → detail 200 → install-resolve 200 (anon) → tarball fetch/non-empty/valid-gzip → SKILL.md + skill.toml parse → related_skills refs exist in the catalog
  • personalities (4 gates): catalog listing → detail 200 → non-empty system_promptrecommended_skills/member_skills refs exist
  • bundles (4 gates): catalog listing → public well-known install-index 200 → ≥1 member → every member (local + federated ext:) resolves

A non-free tier correctly 401-ing anonymous install is recorded as a skip (the gate working as designed) — only an install path that SHOULD resolve and doesn't counts as a failure. This is deliberate: not every "broken" is a bug, and the ledger shouldn't cry wolf on a working gate.

Ran read-only against prod (app.loopskill.io)

69 artifacts checked (57 skills, 2 personalities, 10 bundles) → 60 pass, 9 fail, 0 skip.

Failing:

  • skill:agentic-ostier is unset/None; anonymous install 401s despite the skill appearing free-tier in the public catalog (/api/stats even buckets it as "uncategorized": 1)
  • skill:super-memory — 9 related_skills entries in the SHIPPED SKILL.md (cognee-kuzu-to-pghybrid-migration, cognee-litellm-proxy-rotation, cognee-api-watchdog, cognee-nightly-ingest-optimization, cognee-retrieval-architecture, cognee-llm-provider-swap, cognee-minor-version-upgrade, cognee-agent-coordination, vault-context-loader) point at slugs that are NOT in the public catalog
  • bundle:agent-marketing, cold-outreach-and-email, copywriting-and-humanizer, coreys-marketing, proactive-and-autonomous-agent-ops, seo-and-search-growth, terraform-and-kubernetes-ops — federated (ext:) members do not resolve via /api/federation/filter. Independently reproduced against the existing bundle_validate.py --slug <these> (its G1f gate hits the identical failures) — confirms this is a real, pre-existing federation-resolution gap, not an artifact of the new script.

Tests

tests/test_install_probe.py — 31 tests, RED+GREEN per gate branch, transport mocked via monkeypatched _get/_get_bytes (same Router pattern as test_bundle_factory_rails.py/test_personality_factory_rails.py), including a real in-memory gzip tarball builder to exercise the G4/G5/G6 tarball gates without hitting the network.

README

Synced the test-file-count claim (425 → 426) so tests/test_readme_claims.py stays green with the new test file added (CI trap called out in the brief — caught and fixed).

Local gates (all green)

  • pytest tests/test_install_probe.py tests/test_readme_claims.py tests/test_w0_5_tier_vocab_audit.py tests/test_bundle_factory_rails.py tests/test_personality_factory_rails.py tests/test_route_manifest_regenerates.py77 passed
  • ruff check app/ scripts/install_probe.py tests/test_install_probe.py → all checks passed
  • ruff format --check app/ scripts/install_probe.py tests/test_install_probe.py → all formatted

No new routes added (manifest gate untouched), no app/ changes — hygiene/tooling-only per AGENTS.md Phase-G scope. Not merging — for review.

…ctually install

Adam, 2026-08-21: 'not all artifacts are ready to be installed' on
LoopSkill. Builds the deterministic gate that walks the REAL install path
for every hosted artifact kind (skills, personalities, bundles), mirroring
scripts/bundle_validate.py + scripts/personality_validate.py conventions
exactly (same _get() transport shim, 429-aware backoff, WARN-vs-FAIL split,
exit contract, --json shape).

scripts/install_probe.py — per-kind gate ladders:
  skills:        catalog listing -> detail 200 -> install-resolve 200
                 -> tarball fetch/non-empty/valid-gzip -> SKILL.md +
                 skill.toml parse -> related_skills refs exist
  personalities: catalog listing -> detail 200 -> non-empty system_prompt
                 -> recommended/member skill refs exist
  bundles:       catalog listing -> public well-known install-index 200
                 -> >=1 member -> every member (local + federated) resolves

A non-free tier correctly 401ing anonymous install is recorded as a
skip (gate working as designed), not a failure — only an install path
that SHOULD resolve and doesn't counts as broken.

Ran read-only against prod (app.loopskill.io): 69 artifacts checked
(57 skills, 2 personalities, 10 bundles), 60 pass, 9 fail, 0 skip.
Failing:
  - skill:agentic-os        — tier unset/None, anon install 401s despite
                              looking free-tier in the public catalog
  - skill:super-memory      — 9 related_skills entries in the shipped
                              SKILL.md point at slugs not in the catalog
  - bundle:agent-marketing, cold-outreach-and-email,
    copywriting-and-humanizer, coreys-marketing,
    proactive-and-autonomous-agent-ops, seo-and-search-growth,
    terraform-and-kubernetes-ops
                            — federated (ext:) members do not resolve via
                              /api/federation/filter (reproduced
                              independently against bundle_validate.py's
                              existing G1f gate — same root cause, not a
                              new-script artifact)

tests/test_install_probe.py — 31 tests, RED+GREEN per gate branch,
transport mocked via monkeypatched _get/_get_bytes (same Router pattern
as test_bundle_factory_rails.py / test_personality_factory_rails.py),
including a real in-memory gzip tarball builder for the G4/G5/G6 gates.

README.md — synced the test-file-count claim (425 -> 426) so
tests/test_readme_claims.py stays green with the new test file added.

Local gates green: targeted pytest (77 passed: install_probe +
readme_claims + tier_vocab_audit + bundle/personality factory rails +
route_manifest_regenerates), ruff check + ruff format --check on app/ and
the new files. No routes added, no app/ changes — hygiene-only per
AGENTS.md Phase-G scope.
Copilot AI lite review requested due to automatic review settings August 21, 2026 16:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants