{"record":{"id":"137e7ad04743baef","repo":"Graphify-Labs/graphify","slug":"graphify-install-is-incomplete-missing-always-on","errorCode":null,"errorMessage":"graphify install is incomplete: missing always-on block '{basename}' at {path}. Reinstall graphifyy (e.g. `uv tool install --reinstall graphifyy`).","messagePattern":"graphify install is incomplete: missing always-on block '(.+?)' at (.+?)\\. Reinstall graphifyy \\(e\\.g\\. `uv tool install --reinstall graphifyy`\\)\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"graphify/install.py","lineNumber":54,"sourceCode":"def _always_on(basename: str) -> str:\n    \"\"\"Read a packaged always-on instruction block from graphify/always_on/.\n\n    The six always-on blocks (CLAUDE.md / AGENTS.md / GEMINI.md / VS Code\n    Copilot instructions / Antigravity rules / Kiro steering) live as committed\n    markdown next to this module, generated by tools/skillgen from a single\n    human-edited fragment and guarded against drift by ``skillgen --check``. The\n    installer injects them verbatim via ``_replace_or_append_section``, so the\n    bytes here must match the former triple-quoted constant exactly — the\n    always-on-roundtrip validator proves that.\n    \"\"\"\n    path = Path(__file__).parent / \"always_on\" / f\"{basename}.md\"\n    try:\n        return path.read_text(encoding=\"utf-8\")\n    except OSError as exc:\n        # Defer to use-time so a missing/corrupt packaged block can't crash module\n        # import (which would brick every CLI command, not just install). Reached\n        # only by an install/integration path that actually needs this block.\n        raise RuntimeError(\n            f\"graphify install is incomplete: missing always-on block '{basename}' \"\n            f\"at {path}. Reinstall graphifyy (e.g. `uv tool install --reinstall graphifyy`).\"\n        ) from exc\ndef _refresh_all_version_stamps() -> None:\n    \"\"\"After a successful install, update .graphify_version in all other known skill dirs.\n\n    Prevents stale-version warnings from platforms that were installed previously\n    but not explicitly re-installed during this upgrade.\n    \"\"\"\n    for name in _PLATFORM_CONFIG:\n        skill_dst = _platform_skill_destination(name)\n        vf = skill_dst.parent / \".graphify_version\"\n        if skill_dst.exists():\n            vf.write_text(__version__, encoding=\"utf-8\")\ndef _platform_skill_destination(platform_name: str, *, project: bool = False, project_dir: Path | None = None) -> Path:\n    \"\"\"Return the skill destination for a platform and scope.\"\"\"\n    if platform_name == \"gemini\":\n        if project:","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/Graphify-Labs/graphify/blob/7fe58b0b0f3873be9a21c30106b8b8527c353aa6/graphify/install.py#L36-L72","documentation":"Raised when the installer tries to read one of the packaged 'always-on' markdown skill blocks (graphify/always_on/<name>.md) and gets an OSError — file missing or unreadable. These blocks are human-edited fragments injected verbatim by _replace_or_append_section and drift-checked by `skillgen --check`; the error deliberately fires at use-time (not import-time) so a broken packaging job can't brick every CLI command, and names the reinstall command.","triggerScenarios":"Running `graphify install` (skill/platform installation) from an install whose package data is incomplete: a wheel built without the always_on/*.md files (exclusion filters, MANIFEST issues), a partially overwritten uv/pipx tool install, or filesystem-level deletion/corruption of those files.","commonSituations":"Upgrading a tool install that got interrupted mid-write; building from source with aggressive packaging excludes; container images copying site-packages selectively; permission damage making the .md unreadable.","solutions":["Reinstall the tool cleanly: `uv tool install --reinstall graphifyy` (or `pipx install --force graphifyy` / `pip install --force-reinstall graphifyy`)","Verify the block exists afterwards: ls <site-packages>/graphify/always_on/ should show the named .md file","If building from source, check packaging config includes the always_on package data and rebuild"],"exampleFix":"# before\ngraphify install   # RuntimeError: graphify install is incomplete: missing always-on block 'core' at ...\n\n# after\nuv tool install --reinstall graphifyy\ngraphify install","handlingStrategy":"validation","validationCode":"from pathlib import Path\nimport graphify\n\nalways_on_dir = Path(graphify.__file__).parent / \"always_on\"\nmissing = [p.name for p in always_on_dir.glob(\"*.md\")] \nif not missing:\n    raise SystemExit(\n        \"graphify package data incomplete (no always_on blocks) - \"\n        \"reinstall: uv tool install --reinstall graphifyy\"\n    )","typeGuard":null,"tryCatchPattern":"try:\n    from graphify.install import install_all\n    install_all()\nexcept RuntimeError as e:\n    if \"install is incomplete\" in str(e):\n        subprocess.check_call([\"uv\", \"tool\", \"install\", \"--reinstall\", \"graphifyy\"])\n        install_all()\n    else:\n        raise","preventionTips":["Smoke-test `graphify install` right after installing or upgrading the tool","When packaging graphify yourself, include always_on/*.md as package data and run `skillgen --check` in CI","Avoid interrupted/parallel upgrades of the uv/pipx tool install - reinstall atomically"],"tags":["installation","packaging","corrupt-install","skills","file-not-found"],"backgroundTag":null,"analyzedSha":"7fe58b0b0f3873be9a21c30106b8b8527c353aa6","analyzedAt":"2026-08-14T19:23:21.323Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}