本文へ移動
cccskills
無料GitHub で公開

grafema-haskell-binary-stale-priority

Fix stale Haskell analyzer binaries silently being used by the orchestrator even after a successful rebuild. Use when: (1) modified `packages/js-analyzer/` or other Haskell analyzer source, ran `scripts/build-native.sh ... cabal install`, but a subsequent `grafema analyze` shows old behavior (missing new edges, no new node types, etc.), (2) `~/.cabal/bin/grafema-analyzer` has fresh timestamp but `grafema analyze` produces output as if the change didn't happen, (3) a test verifying new analyzer output passes locally in unit tests but fails in end-to-end runs that go through the orchestrator. Root cause: the Rust orchestrator's `resolve_binary` checks `~/.grafema/bin/<name>` BEFORE `~/.cabal/bin/<name>`, so any stale copy that was once installed there (possibly months ago) shadows the fresh `cabal install` output.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md4.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Stale Haskell binary in ~/.grafema/bin shadows fresh ~/.cabal/bin

Problem

The Grafema orchestrator looks for Haskell analyzer binaries in ~/.grafema/bin/ BEFORE ~/.cabal/bin/. After running scripts/build-native.sh packages/js-analyzer cabal install --install-method=copy --overwrite-policy=always, the freshly-built binary lands in ~/.cabal/bin/grafema-analyzer, but if a copy was previously placed in ~/.grafema/bin/ (e.g., months ago), the orchestrator picks that one up instead. End-to-end tests then run with the old analyzer, and the symptom is that source-level changes appear "to work" in unit tests but produce zero effect in grafema analyze output.

Context / Trigger Conditions

  • Modified Haskell source in packages/js-analyzer/, packages/grafema-resolve/, packages/python-analyzer/, or any Haskell analyzer package.
  • Ran scripts/build-native.sh <pkg> cabal install ... and saw "build succeeded".
  • Ran grafema analyze (or end-to-end test) and the new behavior is missing — no new edge type, no new node type, etc.
  • Unit tests against the newly-built ~/.cabal/bin/<binary> directly DO show the new behavior.
  • ls -la ~/.cabal/bin/<binary> shows fresh mtime, ls -la ~/.grafema/bin/<binary> shows OLD mtime (the smoking gun).

Solution

After cabal install (or any binary rebuild), force-update ~/.grafema/bin/ with the fresh binary:

cp ~/.cabal/bin/grafema-analyzer ~/.grafema/bin/grafema-analyzer
cp ~/.cabal/bin/grafema-resolve ~/.grafema/bin/grafema-resolve
# ...for each affected binary

Or symlink once and forget:

ln -sf ~/.cabal/bin/grafema-analyzer ~/.grafema/bin/grafema-analyzer

Permanent fix candidates (not done at the time of writing — see follow-up task): change scripts/build-native.sh to also update ~/.grafema/bin/ after cabal install, OR change the orchestrator's resolve_binary to prefer ~/.cabal/bin/ when its mtime is newer than ~/.grafema/bin/'s, OR refuse to use ~/.grafema/bin/ when its .build-hash doesn't match the source hash.

Verification

# 1. Source hash updated
cat packages/js-analyzer/.build-hash

# 2. Both binaries point to recent build
ls -la ~/.cabal/bin/grafema-analyzer ~/.grafema/bin/grafema-analyzer
# Both timestamps should be from the recent build

# 3. End-to-end test
node packages/cli/dist/cli.js analyze
# Verify the new edge type / node type now appears in the graph

Example

During Library Callback Resolver work (April 2026), Change 3 added a RECEIVER_CALL edge to the JS analyzer. cabal install succeeded. End-to-end verification on Grafema's own codebase produced 0 RECEIVER_CALL edges. After investigation: ~/.cabal/bin/grafema-analyzer was dated April 25; ~/.grafema/bin/grafema-analyzer was dated March 31. After manual cp, the edges appeared correctly and the entire feature pipeline worked end-to-end on the second grafema analyze run.

Notes

  • This issue is more dangerous than a normal stale-build problem because unit tests can pass (they invoke the fresh binary directly) while the orchestrator silently uses the stale copy.
  • The .build-hash sidecar in packages/<pkg>/.build-hash reflects source state but isn't currently checked at runtime against the chosen binary's origin — that's a feature gap (see follow-up task).
  • A user-friendly heuristic during debugging: if a unit-level Haskell test shows X but grafema analyze shows ¬X, suspect binary staleness FIRST, before suspecting a bug in the orchestrator wiring.

References

  • Build script: scripts/build-native.sh
  • Binary resolver: packages/grafema-orchestrator/src/ (search resolve_binary)
  • Memory note: MEMORY.md → "Stale Binary Protection"

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Fix Elixir/Erlang AST processing bugs in Grafema beam-analyzer. Use when: (1) Elixir parser returns MODULE node but 0 functions/calls — body nesting issue, (2) Erlang parser crashes with "cannot convert list to string" on OTP 26+ — location format changed from integer to keyword list, (3) pipe operator |> creates spurious CALL nodes instead of desugared function calls — clause ordering bug, (4) multi-module .ex files return only the first module — missing __block__ handler, (5) installing Erlang/Elixir on macOS with outdated Xcode/Clang.

日本語の概要は準備中です。原文の説明を表示しています。

Disentinel/grafema362026年8月24日 更新

Fires after fixing any non-trivial bug or regression. Asks: could the graph have caught this as a guarantee? Pairs with reflection-in-and-on-action — picks up after "earliest catchable signal" and asks the next question: was that signal expressible in graph? Triggers: (1) after any non-trivial bug fix is verified working, (2) after a regression report (something used to work, broke), (3) during step 6 (knowledge extraction) of the workflow, (4) when reflection-on-action surfaces a "would have been catchable" signal. Outcome is a triage decision (graph-reachable? rule expressible? rule sound?) and either a draft Linear issue + guarantee proposal, or a recorded "graph capability gap" note. Never auto-creates guarantees.

日本語の概要は準備中です。原文の説明を表示しています。

Disentinel/grafema362026年8月24日 更新

Fix Playwright automation failures against code-server (VS Code in browser). Use when: (1) trust dialog blocks all clicks — "monaco-dialog-modal-block intercepts pointer events", (2) button:has-text() finds wrong buttons behind modal dialog, (3) keyboard shortcuts don't work — Meta vs Control inconsistency, (4) VS Code extension activity bar icon not found by aria-label, (5) panels show placeholder text despite extension being "Connected". Covers trust dialog dismissal, keyboard shortcut hybrid mode, extension panel selectors, and database connection verification for Grafema extension.

日本語の概要は準備中です。原文の説明を表示しています。

Disentinel/grafema362026年8月24日 更新

Systematic methodology for achieving 100% backward dataflow reachability in a new language. Create gauntlet fixture, write trace, diagnose gaps, fix analyzer/algorithm, iterate to 100%. Language-agnostic process. Use when: (1) adding a new language to Grafema, (2) auditing dataflow coverage for existing language, (3) user says "/dataflow-gauntlet".

日本語の概要は準備中です。原文の説明を表示しています。

Disentinel/grafema362026年8月24日 更新

Fix docker exec hanging when starting background processes (servers, daemons) inside containers. Use when: (1) docker exec never returns despite using & or nohup, (2) background server started in container causes docker exec to hang indefinitely, (3) env_startup_command in SWE-bench or similar frameworks times out, (4) setsid/disown needed for proper process detachment in Docker. Root cause: docker exec tracks ALL processes in the exec session, not just the top-level PID.

日本語の概要は準備中です。原文の説明を表示しています。

Disentinel/grafema362026年8月24日 更新

Fix Node.js CLI tools crashing inside Docker containers when host-installed node_modules require a newer Node version than the container provides. Use when: (1) "SyntaxError: Invalid regular expression flags" with /v flag in string-width or similar packages, (2) node_modules installed on host with Node 20+ but container has Node 18, (3) `npm install` with file: protocol creates symlinks that break inside Docker, (4) pnpm workspace packages become broken symlinks in containers. Covers version detection, Node binary mounting, and npm install strategies for cross-version compatibility.

日本語の概要は準備中です。原文の説明を表示しています。

Disentinel/grafema362026年8月24日 更新

Disentinel のスキルをすべて見る

このスキルの問題を報告する