DR-128: ast-dataflow is a standalone public repo consumed as a pinned git dependency
Context
Section titled “Context”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.
Decision
Section titled “Decision”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.
Alternatives Considered
Section titled “Alternatives Considered”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.
Consequences
Section titled “Consequences”- Canonical’s suite shrinks by the tool’s 331 tests (they run in the tool
repo’s CI); the CI
type-drift-paritygate runs through the installed package unchanged. - Version bumps are explicit pin edits — note the bun gotcha: re-pinning via
bun add github:…#shafails with an internalDependencyLoop; editpackage.jsonand runbun installinstead. - 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[]/symbolsFileescapingrepoRootto probe arbitrary host files — is closed at the policy boundary, not at the call site. - CLI surface stays unconfined.
run_census.py:288defaults sidecar output to$TMPDIR/canonical-census, so out-of-repoRootevidence 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.