Skip to content

DR-128: ast-dataflow is a standalone public repo consumed as a pinned git dependency

id-377 {377.5} required extracting ast-dataflow from the canonical monorepo with an end-user install path, and DR-100’s rider deferred .mcp.json registration to that moment. Candidate homes: a new dedicated repo, claude-got-skills/repo/ (owner-noted S501 as imperfect), or local-only. Candidate install paths: git dependency, npm publish, vendored file: link. Canonical is already a public repo, so the tool’s code and history were already public.

The tool lives at https://github.com/ai-solution-hub/ast-dataflow — a standalone public repo seeded by history-preserving git filter-repo extraction (60 commits, spanning the lib/ast-dataflow and scripts/ast-dataflow-cli.ts eras). Canonical consumes it as a bun git dependency pinned to a SHA (@ai-solution-hub/ast-dataflow), and registers the MCP server in .mcp.json as an end user would — executing the DR-100 rider (canonical PR #177). Internal tools/ paths were deliberately kept unchanged in the extracted repo for this pass.

  • claude-got-skills/repo/ home — rejected; the S501 note already called it imperfect, and a dedicated repo gives the tool its own CI, issues and release cadence.
  • npm publish now — deferred, not rejected. Publishing is outward-facing and irreversible; the git dependency validates the end-user install shape without registry ceremony. Revisit when the “vibe coder on Supabase” persona work needs a bunx-from-registry path.
  • Vendored file: link — rejected; defeats the end-user-install purpose and keeps the test surface ambiguity.
  • Canonical’s suite shrinks by the tool’s 331 tests (they run in the tool repo’s CI); the CI type-drift-parity gate runs through the installed package unchanged.
  • Version bumps are explicit pin edits — note the bun gotcha: re-pinning via bun add github:…#sha fails with an internal DependencyLoop; edit package.json and run bun install instead.
  • The tool’s backlog (G8, G12, MCP-audit findings) now lives as GitHub issues in the tool repo, not in canonical’s ledger.

Pin 06b8685 — per-surface path policy (S531, closes HIGH-1)

Section titled “Pin 06b8685 — per-surface path policy (S531, closes HIGH-1)”

The first pin bump after extraction (canonical PR #179, tool-repo PR #5 / issue #1, owner-approved fix-shape) lands a per-surface fs path policy at the dispatch seam, closing the HIGH-1 host-file read oracle the MCP audit surfaced:

  • MCP surface rejects caller-supplied fs paths that fall outside an allowlist (default [repoRoot]), evaluated on path shape before any fs touch. The oracle — evidence[] / symbolsFile escaping repoRoot to probe arbitrary host files — is closed at the policy boundary, not at the call site.
  • CLI surface stays unconfined. run_census.py:288 defaults sidecar output to $TMPDIR/canonical-census, so out-of-repoRoot evidence paths are a live requirement for the census workflow; the CLI keeps its permissive path handling to preserve that.

The fix lives in the tool repo and propagates to canonical via the pin bump (package.json + bun.lock only). Verification recorded in the source PR: test_pipeline_schema_uses_visibility.py 2/2; CLI smoke (dead-exports) returns the envelope; path-policy.ts present in the installed package.