# Upstream Gap Table This document tracks the delta between this TypeScript port and upstream Python Graphify. ## Scope - Current TypeScript product branch: `main` - Current TypeScript baseline: `1f30efa7afaf5c98f06fcaebbb727fd4f2fb3f8a` - Current TypeScript package target: `@sentropic/graphify@0.10.0` (package rename of the `graphifyy@0.9.8` line; closest audited parity point remains upstream `v0.8.18`, with F-0819-P1/P2 and F-0831-P1-security early ports merged on `main` unreleased) - Durable traceability spec: `spec/SPEC_UPSTREAM_TRACEABILITY.md` - Closed upstream `v3` baseline: `upstream/v3` at `699e996` - Closed Python parity target: remote tag `v0.4.23` at `8d908c5d43d079579604a82873fd7cff33a1b343` - Closed Python drift target: `upstream/v4` at `5843ffc277c54766854f9201286c9647da095390` - Closed Python `v5` parity line: remote `upstream/v5` at `f755aca58f36771923cebcc8f85f2eef6178a105` - Closed Python `v6` parity line: remote `upstream/v6` at `f81e3bc2154d21062f56f9e4ec9f923dfe7d128e` - Closed parity source lock for the `0.7.4` cycle: effective `upstream/v7` target `26a5a35200dda6207bf6fc16afed83c71238bb65` - Closed parity target commit for `0.7.4`: `26a5a35200dda6207bf6fc16afed83c71238bb65` on `upstream/v7`, with feature commit `741ac3655bd33314e1aaca51e6fd30271c74c61b` - Closed Python `0.7.10` drift lock: remote `upstream/v7` observed on 2026-05-08 at `0c29b2cb88c6274d889ca7c33a684ce103808715`, with remote tag `v0.7.10` at `ef1050b0e4134df0bd59956b0f900dc3c83e8184` - Observed Python drift lock for the next pass: remote `upstream/v7` observed on 2026-05-12 at `ab32098063adb1ab4d9247747742958ad185db41`, with remote tag `v0.7.16` at the same commit - Active CRG stable review reference: `tirth8205/code-review-graph` tag `v2.3.3` at `52cf3bc63ee77c8b204fb809791a5f212e83a2de` - Current released line: `@sentropic/graphify@0.10.0` (rename, 2026-05-26); the `0.8.16` and `0.8.18` drift intakes below are both closed for the TypeScript line. F-0819-P1/P2 (PRs #87/#88, upstream `#1075`/`#1077`/`#1007`/`#1010`) and F-0831-P1-security (PR #93) are merged on `main` and unreleased; the next traceability pass formalizes the `v0.8.18..v0.8.31` window (`upstream/v8` fetched locally through `v0.8.31` at `7a588fb`) and reconciles those early ports ## Active `0.8.49` Drift Intake Observed on 2026-06-25 after merging `@sentropic/graphify@0.17.2`: - Safi Python Graphify: `upstream/v8` at `9b583a01c3f1f9d3e6cb8f6c6b23d76e4b98afc9` (`fix(hooks): match the real file extension in the Read|Glob hook (#1463)`). - New remote tags seen in this fetch include `v0.8.46`, `v0.8.47`, and `v0.8.49`; local `upstream/v8` now spans the previously-audited `v0.8.31` checkpoint through `v0.8.49`. - Local TS baseline: `origin/main` at `53a2024` (`@sentropic/graphify@0.17.2`). - Early port in this pass: upstream `68dba89` (`feat(llm): honor *_BASE_URL for kimi/gemini/deepseek backends (#1458)`) maps to the TS direct-provider set by honoring `ANTHROPIC_BASE_URL`, `OPENAI_BASE_URL`, `GEMINI_BASE_URL` / `GOOGLE_GENERATIVE_AI_BASE_URL`, `MISTRAL_BASE_URL`, and `COHERE_BASE_URL` in addition to the pre-existing `OLLAMA_BASE_URL`. Upstream-only Kimi/DeepSeek providers remain `n/a` until the TS `DirectLlmProvider` union adds them. | Source window | Representative commits | Initial TS bucket | Notes / next action | | --- | --- | --- | --- | | LLM/provider endpoints | `68dba89` | `ported (early)` | Direct provider base-URL env support added in TS; README and `tests/llm-execution.test.ts` cover Gemini alias precedence. | | Export/wiki filename safety | `5d63aad`, `7278e24`, `30cc4c0`, `739230e` | `must-audit` | Compare against Studio/wiki filename slugging and canvas/card layout. Likely small robustness ports. | | Extractor/language surface | `7dc5d96`, `dbce453`, `8e6ba9d`, `d12eb28`, `895a60f`, `f117aac`, `dbce453`, `b3ab221` | `feature / must-audit` | WPF/XAML, CUDA, package manifests, Java records, PowerShell manifests, oversized-doc slicing, extractor split. Port incrementally only where TS extractor lacks parity and tests are cheap. | | Hooks/skills/install/work-memory | `9b583a0`, `1e3270a`, `6d9617a`, `89dd00f`, `c06db05`, `ad6cb75`, `e7ba16b`, `1f42a2d`, `382b669`, `30fe8ba` | `mixed` | Separate skill text/doc fixes from Python work-memory features. Do not adopt Python-only hook machinery without TS install contract review. | | Query/MCP/serve | `53edd27`, `f9ded63` | `must-audit` | Trigram prefilter and community-name MCP output may map to `src/serve.ts`/query surfaces. | | Update/build correctness | `533859d`, `897483f`, `fd463de`, `8437ef4`, `b2e01f37`, `9a7dbfb`, `d885833`, `2100b3d` | `must-audit` | Reconcile against TS build-merge/update tests; many prior rows may already be covered. | | Security/deps | `ec6b397`, `9e8fa2a`, `d8fa70e` | `partial / n-a` | Starlette is Python-only; web/export XSS and vulnerable npm deps require separate TS dependency/security audit. | | Reflection/work-memory | `1a14e94`, `d193b62`, `6d9617a`, `89dd00f` | `defer / product decision` | Python `graphify reflect` and LESSONS.md workflow are not in the current TS product contract. | | Release/changelog-only | `29fd98f`, `f87011b`, `6d3c959`, `bc362cb`, `e4ff54f` | `release-only` | Do not mirror Python package version bumps into the TS line. | ## Source Lock Notes - `git ls-remote` is the authority for Safi Python tags while local tag clobber risk exists. - Local `refs/tags/v0.4.23` is not trusted for parity claims because it differs from the remote tag observed by `git ls-remote`. - Python `upstream/v4` was fetched on 2026-04-25 and remains locked as a closed parity line at `5843ffc277c54766854f9201286c9647da095390`. - Python `upstream/v5` was fetched on 2026-04-29 and is now a closed parity line at `f755aca58f36771923cebcc8f85f2eef6178a105`. - Python `upstream/v6` was observed on 2026-05-04 and is now a closed parity line at `f81e3bc2154d21062f56f9e4ec9f923dfe7d128e`. - Python `upstream/v7` was observed on 2026-05-04 for the closed `0.7.0` to `0.7.4` parity cycle. - Python `upstream/v7` was re-fetched on 2026-05-08 and advanced to `0c29b2cb88c6274d889ca7c33a684ce103808715`; this opened the `0.7.5` to `0.7.10` plus post-tag realignment cycle now closed below. - Python `upstream/v7` was re-scanned on 2026-05-12 after the `0.7.10` checkpoint merge and advanced to `ab32098063adb1ab4d9247747742958ad185db41`; remote tags now extend through `v0.7.16`. - Fetched local tags `v0.7.0` through `v0.7.4` all resolve to `f81e3bc2154d21062f56f9e4ec9f923dfe7d128e`; do not use those local tag pointers as proof for `0.7.x` parity. Follow the `upstream/v7` commit history instead. - Remote tag `v1.0.0` exists upstream, but the active upstream release train is still `v6` / `0.7.x`; do not target `1.0.0` until a separate traceability pass proves that line is the real parity target. - Local `v0.4.28`..`v0.4.32` tags are not trusted for parity claims while tag clobber risk exists; use branch commits and `git ls-remote` instead. - CRG `v2.3.3` is now the stable review-feature source and points at `main` (`52cf3bc63ee77c8b204fb809791a5f212e83a2de`). - No CRG `main` / `v2.3.3` feature has been adopted in this `0.7.10` realignment without being recorded as an additive TypeScript delta. - Package version alignment is driven by Python Graphify parity targets, not by `code-review-graph` tags or `main`. - The active `0.7.10` realignment must stay TypeScript-only; no new Python dependency may be introduced to claim parity. - The `0.7.10` parity cycle is closed in the TypeScript release line; any newer upstream drift must start a new traceability pass. - Python `upstream/v8` was re-fetched on 2026-05-23 (Track F bilan #2) and advanced from the previous cadrage lock `4c95d02` (`v0.8.13`, bilan #1 baseline) to `990ac70` (`v0.8.16`); intermediate tag `v0.8.14` at `f4da176` was published, intermediate tag `v0.8.15` was **skipped upstream** (commit `ff14ad5` landed in-tree but no remote tag was pushed — do not record `v0.8.15` as a published Python release). - Local TS baseline for the `0.8.16` drift bilan is `main` at `751ddce935ba8baec26fe5225da12a7525da428b`, package `graphifyy@0.9.1`. - Python `upstream/v8` was re-fetched on 2026-05-25 (Track F bilan #3) and advanced from `990ac70` (`v0.8.16`) to `3efae38`; new remote tags `v0.8.17` at `73c3c33` and `v0.8.18` at `98100f3` were published. Tag `v1.0.0` at `0a31c08` ("add git commit hook") is **NOT an ancestor of `upstream/v8`** (it is a lightweight tag on a divergent commit, not a v8-line release) — it stays a **non-target**, confirming the bilan #1/#2 finding; the auto-rebuild-after-commit feature it carries is already-covered by our `graphify hook-rebuild` / git-hook install. ## Active `0.8.18` Drift Intake Observed on 2026-05-25 (Track F bilan #3) after publishing `graphifyy@0.9.7` (closing the `0.8.16` intake): - Safi Python Graphify: `upstream/v8` at `3efae38` (`Rate-limit backup_if_protected ...`), one commit past tag `v0.8.18` (`98100f3`). - New remote tags since `v0.8.16`: `v0.8.17` at `73c3c33`, `v0.8.18` at `98100f3`. Tag `v1.0.0` at `0a31c08` is a non-target (see Source Lock Notes). - Drift commit range `990ac70..upstream/v8` is **12 commits**. Companion bilan: `spec/SPEC_TRACK_F_0818_BILAN.md`. Companion lot plan: `PLAN.md > Lot F-0818 drift (2026-05-25)`. - Local TS baseline: `main` at `2583f33` (`graphifyy@0.9.7`, post-PR #71 ledger). Grounding checks run against `main` at intake time: `backupIfProtected` already exists (`src/watch.ts:299`, `src/export.ts`); Java `extends`→`inherits` is already canonicalized (`src/extract.ts:1541+`); partial cross-language structural suppression exists (`src/analyze.ts:116`); **no** query-expansion, semantic-contexts, or watch shrink-guard exist yet. | # | Commit | Subject (issue) | Bucket | Initial TS status / action | | --- | --- | --- | --- | --- | | 1 | `461e346` | Windows cp1252 crash, `str.parent` crash, MCP error message, god_nodes relative import | `already-covered` / `n-a` | cp1252 + `str.parent` are Python-runtime specific (TS reads UTF-8, no `str.parent`). Audit only the MCP error-message wording + god-node import angle. | | 2 | `71b4e57` | Husky 9 hook path, `skill.md` `INPUT_PATH` literal, per-worker exception isolation | `must-port (M)` | F-0818-M1. Audit `src/hooks.ts` (Husky-9 path), `src/skills/*` (`INPUT_PATH` literal), `src/llm-execution.ts` (per-worker isolation). | | 3 | `4dce16f` | Case-sensitive call resolution + cross-language phantom calls (#993, #991) | `must-port (P)` | F-0818-P1. We have partial cross-lang suppression (`analyze.ts:116`) but no case-sensitive call resolution. Extend `src/extract.ts` / `src/analyze.ts` + regression. | | 4 | `73c3c33` | Bump 0.8.17 | `release-only` | Do not mirror (`MEMORY.md > Cautious semver bumps`). | | 5 | `6fba4e4` | watch: bypass shrink-guard on explicit deletions (#1000) | `needs-audit` → likely `n-a` / `intentional-delta` | No shrink-guard in `src/watch.ts`; verify our `.rebuild.lock` + deletion-aware update path is equivalent before porting. | | 6 | `d778e2c` | cli: reconstruct communities from per-node attribute when sidecar missing (#1001) | `must-port (M)` | F-0818-M2. Robustness for `src/community-labels.ts` / cluster when the label sidecar is absent. | | 7 | `32effb1` | docs: Ukrainian README to v8 (#995) | `intentional-delta` / `release-only` | The TS fork does not carry a Ukrainian README. | | 8 | `ab4e542` | feat: cross-language semantic contexts for Python, JS/TS, C#, Java (#996) | `feature — scope decision` | New capability we lack. Needs a mini-spec before a lot is opened; default `defer` pending scope (size unknown). | | 9 | `238702b` | Constrained query expansion (#998) | `must-port (M)` | F-0818-M3. No query expansion in `src/serve.ts` / `src/search.ts`; port the constrained-expansion ranking. | | 10 | `a4a615d` | Ukrainian typo + Unicode vocab regex + Java `extends`→`inherits` migration note | split | Unicode vocab regex → `must-port (M)` (F-0818-M3, pairs with #9 query hygiene); Java `inherits` → `already-covered` (`extract.ts:1541+`); README typo → `release-only`. | | 11 | `98100f3` | Bump 0.8.18 | `release-only` | Do not mirror. | | 12 | `3efae38` | Rate-limit `backup_if_protected` to one folder/day via content hash | `must-port (M)` | F-0818-M2. Enhancement to existing `backupIfProtected` (`watch.ts:299`); add the daily content-hash rate-limit. | **Bucket counts:** must-port-P = 1 (#3), must-port-M = 4 (#2, #6, #9+#10-regex, #12), feature/scope-decision = 1 (#8), needs-audit = 1 (#5), already-covered = 2 (#1, #10-Java), intentional-delta = 1 (#7), release-only = 3 (#4, #11, README bits). **Rolled-up effort:** ~3-4 days serialized for P1 + M1/M2/M3, excluding the `#8` semantic-contexts feature (scope TBD). **Version recommendation:** after porting P1 + M1/M2/M3, the next TS release is a **patch bump `graphifyy@0.9.8`** advancing the closest audited parity point to `v0.8.18`. Do **not** jump to `1.0.0`: upstream `v1.0.0` is a lightweight tag on a divergent git-hook commit, not a v8-line major. `#8` semantic-contexts, if accepted, would justify a **minor `0.10.0`** in a later cycle once scoped. ## Active `0.8.16` Drift Intake Observed on 2026-05-23 after merging PRs #33 (A-final), #34 (F cadrage bilan #1), #35 (E Lot 4-risky), #48 (F-H1 hyperedges), #53 (F-Opt-PR), and Track G G6-1/G6-2 workspace lots: - Safi Python Graphify: `upstream/v8` at `990ac706d823bf92275333433fde4ef4782a9139` (`bump version to 0.8.16`). - New remote tags since the previous bilan (`v0.8.13` at `4c95d02cbb3901956491e81695f32ae56bd851d6`): `v0.8.14` at `f4da176851220d0a41105253a9a6688a03dfa873`, `v0.8.16` at `990ac706d823bf92275333433fde4ef4782a9139`. **`v0.8.15` was skipped upstream** (commit `ff14ad5245ae47b5a4c2ec8c217373440a6a8e38` landed but no tag was pushed; only the in-tree version bump exists). - Drift commit range `v0.8.13..upstream/v8` is **18 commits**. Companion bilan: `spec/SPEC_TRACK_F_0816_BILAN.md`. Companion lot plan: `PLAN.md > Lot F-0816 drift (2026-05-23)`. - Local TS baseline: `main` at `751ddce935ba8baec26fe5225da12a7525da428b`, package `graphifyy@0.9.1`. Track G G6-3 routing refactor in-flight on `feat/track-g-g6-3-routing` (not merged at this lock). | Source | Bucket | Examples | Initial TS status | Initial action | | --- | --- | --- | --- | --- | | Python `v0.8.14`..`v0.8.16` | Security hardening | graph.json 512 MiB load cap, sanitize_metadata at export boundaries, vis-network CDN SRI pin (`#956` cluster `b6127aa`), NAT64 SSRF false-positive fix (`9e6192a`) | `must-port` | F-0816-P3 / part of F-0816-P4. Verify partial G overlap on vis-network pin (Track G `workspace/graph-panel.ts`). | | Python `v0.8.14`..`v0.8.16` | Wiki / detect correctness | stale wiki node filter (`#936` in `9e6192a`), gitignore fallback + `--exclude` flag (`#945`/`#947`), cluster-only crash when `graphify-out/` absent (`#934` in `076e6b7c`) | `must-port` | F-0816-P4. Wiki portion is G-adjacent (Track G `workspace/display-model.ts` reads wiki sidecars) — port strengthens contract, no conflict expected. | | Python `v0.8.14`..`v0.8.16` | Unicode / query | CJK/Unicode dedup in `_norm`/`_norm_label` (`#937` in `86109e9`), non-English query terms searchable (`#964` in `020cca2`) | `must-port` | F-0816-P2 + lineage from the still-open `0.7.14` Unicode-IDs row (`_makeId` in `src/extract.ts` strips non-ASCII). | | Python `v0.8.14`..`v0.8.16` | LLM / CLI hygiene | exit non-zero on all-chunk extract failure (`#889` in `3238b32`), honor `GRAPHIFY_MAX_OUTPUT_TOKENS` for OpenAI-compatible backends (`#973` in `06a9b72`) | `must-port` | F-0816-P2. Trivial line-level ports. | | Python `v0.8.14`..`v0.8.16` | Install surface | project-scoped skill installs (`#931` in `b347492`) | `must-port` | F-0816-P1. Audit `src/skill-install.ts` for `--scope project` + per-platform target dirs. Soft G overlap on workspace bootstrap. | | Python `v0.8.14`..`v0.8.16` | Language / parser | `.ets` (ArkTS) extension (`#926` in `52d75bd`), Swift cross-file extension dedup (`#969` in `406bea4`), JS/TS barrel re-exports as explicit graph edges (`1494874`), bash extractor hardening (part of `#956`) | `must-port (M)` | F-0816-M1 (extensions + Swift), F-0816-M2 (barrel re-exports), F-0816-M3 (bash hardening — pairs with still-open F-P3 bash extractor port from bilan #1). | | Python `v0.8.14`..`v0.8.16` | Opt-in / skill-merge feature surface | `graphify affected` + import-resolution depth (`e44e6e9`), semantic-fragment validation via upstream `semantic_cleanup.py` (part of `#956`) | `ported / partially deferred` | F-0816-Opt-Affected routed into `review-delta` extension, not a new verb. The real upstream `semantic_cleanup.py` semantics are ported as F-0816-M4 (`src/semantic-fragment-validation.ts`). The local F-0816-M5 `src/semantic-cleanup.ts` stale-node pruner is retained as a TS graph-level complement to the stale-wiki-node fix, not as a literal upstream module port. | | Python `v0.8.14`..`v0.8.16` | Defer | SCIP JSON ingester (part of `#956`), Python+bash symbol-resolution helpers (part of `#956`), LLM-triage backend (out of scope per F-Opt-PR deepdive § 6) | `defer (F-Opt)` | Reopen only on user request: SCIP ingestion, symbol-resolution false positives, `graphify pr --triage` request. | | Python `v0.8.14`..`v0.8.16` | Already covered | `backup_if_protected` graph snapshot before overwrite (`#834` in `6939494`) | `already-covered` | `src/export.ts > backupIfProtected` (line 54), wired into `src/pipeline.ts:215` and `src/watch.ts:282`. | | Python `v0.8.14`..`v0.8.16` | Intentional delta | multigraph runtime compat probe (part of `#956`) | `intentional-delta` | TS uses Graphology single-graph by contract; NetworkX MultiGraph compat surface does not map. Already recorded in `0.7.12` row. | | Python `v0.8.14`..`v0.8.16` | Release-only | `0.8.14`/`0.8.15`/`0.8.16` version bumps, YC S26 badge, Uzbek README translation | `release-only` | Do not mirror per `MEMORY.md > Cautious semver bumps`. | Row-level table is in `spec/SPEC_TRACK_F_0816_BILAN.md > Drift table`. The 18-row matrix splits omnibus PR `#956` (`b6127aa`) into 8 sub-rows (11a..11h) to keep one-row-per-feature traceability. **F-Opt-LLM-Triage closure (2026-05-23):** F-Opt-LLM-Triage is closed as already-covered by `src/llm-mesh.ts`, which provides multi-provider routing generically across the entire CLI surface (not just `graphify pr`). Per user decision 2026-05-23, no separate triage code path is ported. The upstream multi-backend resolution (`anthropic` + `openai` + `gemini` + `ollama` + `claude-cli` + `ollama-fallback`) maps onto our existing llm-mesh provider abstraction; any future TS user request for `graphify pr --triage` becomes a thin wiring of `src/pr.ts` into the mesh rather than a new provider stack. Reopen condition is unchanged in spirit but redirected: a TS user asks for explicit `pr --triage` UX, not a new backend surface. ## Active `0.7.16` Drift Intake Observed on 2026-05-12 after merging the `0.7.10` checkpoint: - Safi Python Graphify: `upstream/v7` at `ab32098063adb1ab4d9247747742958ad185db41`, remote tag `v0.7.16` at the same commit. - New remote tags since the previous pass: `v0.7.11`, `v0.7.12`, `v0.7.13`, `v0.7.14`, `v0.7.15`, `v0.7.16`. - The TypeScript product must triage this drift in small lots while keeping descriptions and reconciliation moving. | Source | Bucket | Examples | Initial TS status | Initial action | | --- | --- | --- | --- | --- | | Python `v0.7.11`..`v0.7.16` | Runtime and platform hotfixes | context-window retry, Windows console unblock, `__main__` guards, MultiGraph crash, hollow LLM response retry, universal help guard, `--version`, Unicode IDs, edge-key dedup, direction flip, chunk paths, encoding, uv fallback, path scoring, cache, OpenCode trigger | `needs-triage` | Classify each fix as `must-port`, `already-covered`, `intentional-delta`, or `defer`; port urgent runtime fixes before feature work. | | Python `v0.7.11`..`v0.7.16` | Ollama runtime tuning | dynamic `num_ctx`, `keep_alive`, serial defaults, `GRAPHIFY_OLLAMA_NUM_CTX`, `GRAPHIFY_OLLAMA_KEEP_ALIVE` docs | `needs-triage` | Compare against TS Ollama provider surface and port only env/runtime controls that matter for local direct extraction. | | Python `v0.7.11`..`v0.7.16` | Parser/language surface | Pascal, Delphi, Lazarus IDE files, regex fallback without tree-sitter-pascal | `needs-triage` | Decide whether Pascal/Delphi/Lazarus is a quick regex-backed TS extractor lot or deferred until requested. | | Python `v0.7.11`..`v0.7.16` | Visualization/export | callflow HTML export with Mermaid architecture diagrams and watch/hook auto-regeneration | `needs-triage` / `opportunity` | Decide whether this belongs to core export parity, CRG/review UX, or a deferred visualization lot. | | Python `v0.7.11`..`v0.7.16` | Skills/watch/hooks | hook OOM worker cap, Antigravity `.agents` path/frontmatter, skill `--help` behavior | `needs-triage` | Audit against existing TS installer/watch contracts and add targeted tests for gaps. | Row-level audit for the post-`0.7.10` drift observed at `ab32098063adb1ab4d9247747742958ad185db41`: | Ref | Commit | Upstream change | TypeScript status | Required follow-up | | --- | --- | --- | --- | --- | | `0.7.11` runtime retry | `f88567b` | Recover from context-window-exceeded API errors in adaptive LLM retry. | `must-port` | Add direct-mode retry behavior around context-window/length-like failures and hollow JSON responses, with mocked `generateText` tests. | | `0.7.11` Windows/Python entry guards | `e5f263b` | Unblock Python pipeline on Windows consoles and add missing Python `__main__` guards. | `intentional-delta` | Node/Commander entrypoints do not use Python module guards; keep Windows CI coverage and UTF-8 file writes, but no Python entrypoint port is needed. | | `0.7.11` Pascal/Lazarus parser | `32bf8b4` | Add Pascal, Delphi and Lazarus IDE extraction support. | `defer` | Treat as Lot M3. Port as a regex-backed TS extractor only if language expansion is approved for this acceleration branch. | | `0.7.11` Pascal regex fallback | `8e64835` | Keep Pascal extraction working without `tree-sitter-pascal`. | `defer` | Same Lot M3 decision; if accepted, use regex fallback first and avoid adding a Python runtime dependency. | | `0.7.12` hook/watch resilience | `dc50979` | Prevent concurrent hook rebuild OOM, add timeout/resource controls, lift worker cap, and fix Antigravity `.agents` path/frontmatter. | `must-port` | Audit TS `hook-rebuild` concurrency and Antigravity install paths; add targeted tests before changing installer paths. | | `0.7.12` MultiGraph compatibility | `23f598f` | Avoid crashes when graph edge data is nested by multigraph semantics. | `already-covered` | Graphology edge access and prior links/edges loader coverage avoid the Python NetworkX failure mode; keep `tests/serve.test.ts` and `tests/review-store.test.ts` coverage. | | `0.7.12` hollow LLM response retry | `23f598f` | Retry or surface empty/hollow LLM responses instead of silently parsing `{}`. | `must-port` | Fold into the direct-mode retry lot with invalid/empty response regression tests. | | `0.7.12` skill help behavior | `23f598f` | Make skill `--help` useful instead of triggering stale-version noise. | `already-covered` | Commander help/version behavior is covered by existing CLI tests; keep hook-check silent behavior under installer tests. | | `0.7.13` Ollama context saturation | `8c00287` | Set large `num_ctx`, `keep_alive`, and serial local extraction defaults for Ollama. | `must-port` | Add `GRAPHIFY_OLLAMA_NUM_CTX` / `GRAPHIFY_OLLAMA_KEEP_ALIVE` handling through `ollama-ai-provider` model settings and tests. | | `0.7.13` callflow HTML export | `db66b87` | Add Mermaid-based callflow HTML architecture export. | `defer` | Classify under CRG/visualization after the first product tracks; TS already has `.graphify/flows.json`, wiki flow pages, and review-flow CLI surfaces. | | `0.7.13` callflow hook/watch regeneration | `5ead190` | Regenerate callflow HTML automatically when the artifact already exists. | `defer` | Depends on the callflow HTML decision; do not add watch churn until the export surface is accepted. | | `0.7.13` dynamic Ollama `num_ctx` | `8c4c67f` | Derive Ollama context size from actual chunk size instead of hardcoding. | `must-port` | In Lot M2, decide whether the TS direct-extract chunker should compute per-call context or expose only explicit env overrides first. | | `0.7.13` Ollama env docs | `4cec58e` | Document `GRAPHIFY_OLLAMA_NUM_CTX` and `GRAPHIFY_OLLAMA_KEEP_ALIVE`. | `must-port` | Update README once the envs are implemented in `src/llm-execution.ts`. | | `0.7.14` Unicode IDs | `95e2c5e` | Normalize IDs with Unicode-aware NFKC/casefold semantics. | `must-port` | Update `_makeId` and build endpoint normalization so non-ASCII identifiers do not collapse; add extraction/build regression tests. | | `0.7.14` legacy edge-key cleanup | `95e2c5e` | Handle LLM `from`/`to` edge keys during dedup and avoid leaking stale keys. | `must-port` | Add validation/build normalization for legacy edge aliases before graph construction, with tests. | | `0.7.14` direction flip and chunk paths | `95e2c5e` | Avoid update direction flip and make skill chunks addressable by absolute paths. | `already-covered` | Direction preservation is already covered by `tests/build-merge.test.ts`; TS skill-runtime writes explicit scratch paths rather than Python subagent chunk files. | | `0.7.15` help/version/Ollama fallback | `094d8ba` | Universal help guard, `--version`, and Ollama `num_ctx` fallback. | `must-port` | `--version` is already handled by Commander; carry the Ollama fallback into Lot M2 and add one CLI/help regression if stale-version noise reappears. | | `0.7.16` encoding and install fallback | `994b17b` | Force UTF-8 file I/O in skills and prefer `uv tool install` fallback over `pip`. | `intentional-delta` | TS uses Node UTF-8 writes and npm/npx install paths; no Python/uv fallback applies to the npm-first runtime. | | `0.7.16` path scoring | `994b17b` | Prefer exact, then prefix, then substring node matches; reject shortest path when source and target resolve to the same node. | `already-covered` | Ported in this branch for CLI `path`/`explain` and MCP `shortest_path`; tests: `tests/cli-runtime.test.ts`, `tests/serve.test.ts`. | | `0.7.16` semantic-cache path normalization | `994b17b` | Normalize path keys and check/save cache relative path handling. | `must-port` | Audit `src/cache.ts` for Windows case/junction equivalence and relative `source_file` parity; add cache tests before modifying. | | `0.7.16` OpenCode trigger line | `994b17b` | Add explicit `/graphify` trigger guidance to installed agent docs. | `must-port` | Audit installed AGENTS/OpenCode/Codex docs against current `$graphify`/`/graphify` trigger rules and update tests if needed. | | `0.7.11`..`0.7.16` release bumps | `adf96da`, `e926079`, `9caaa17`, `dd465af`, `ab32098` | Python package version and changelog updates. | `intentional-delta` | Do not bump `graphifyy` solely for Python release tags; versioning remains tied to the next TS release gate. | ## Active `0.7.10` And CRG `v2.3.3` Realignment Intake Observed on 2026-05-08: - Safi Python Graphify: `upstream/v7` at `0c29b2cb88c6274d889ca7c33a684ce103808715`, remote tag `v0.7.10` at `ef1050b0e4134df0bd59956b0f900dc3c83e8184`. - code-review-graph: `v2.3.3` / `main` at `52cf3bc63ee77c8b204fb809791a5f212e83a2de`. - Local tag conflicts still exist for multiple Python tags; use `git ls-remote` and branch commits as authority. Functional intake buckets for the next realignment: | Source | Bucket | Examples | Initial TS status | Initial action | | --- | --- | --- | --- | --- | | Python `v0.7.5`..`v0.7.10` | Incremental update and dedup | semantic cache/build-merge/manifest, entity dedup design, MinHash/Jaro-Winkler strategy, reversed call-edge update fix, community label persistence | `covered` / `intentional-delta` | Reversed call-edge preservation is ported for `buildMerge` and covered by `tests/build-merge.test.ts`. Community label persistence is ported through `src/community-labels.ts` and exercised by `tests/cli-runtime.test.ts` (`preserves renamed community labels across cluster-only rebuilds`, `preserves renamed community labels across hook-rebuild update`). Semantic cache + manifest reuse is already covered by the TypeScript assistant/runtime `update` flow (`tests/cache.test.ts`, `tests/cli-runtime.test.ts > preserves existing semantic nodes during code-only update rebuilds`); the upstream monolithic incremental `extract` command is recorded as an intentional delta in the row-level table below. The MinHash/LSH/Jaro-Winkler `--dedup-llm` path is `intentional-delta` because it depends on Python-only libraries (`datasketch`, `rapidfuzz`) and an aggressive cross-file merge contract the TypeScript line deliberately avoids. | | Python `v0.7.5`..`v0.7.10` | Parser and language surface | Markdown structural extraction, `.md/.mdx` update path, TS interface/enum/type-alias/const/new_expression, TSX JSX parser, CommonJS require, Groovy/Spock, Luau, Quarto `.qmd`, SQL ALTER FK and schema-qualified names | `covered` | SQL ALTER FK, schema-qualified table names, CommonJS `require()` module/symbol edges, TS/TSX interface/type/enum/const/new-expression/JSX call extraction, Markdown/MDX/Quarto structural extraction, and selected no-Python fallback coverage for Groovy/Gradle, Luau, R and Fortran are ported through the TypeScript extractor. | | Python `v0.7.5`..`v0.7.10` | Direct LLM/backends | Gemini/OpenAI/Ollama/AWS Bedrock, accessible backend priority, configurable Gemini model, output token cap | `covered (opt-in)` / `deferred` | Ollama is ported as a credential-free opt-in direct provider (`tests/llm-execution.test.ts > accepts ollama as a credential-free local direct provider`); AWS Bedrock stays `deferred` until an enterprise user requests it (`Lot 4` row in the detailed table below). | | Python `v0.7.5`..`v0.7.10` | External document sources | Google Workspace shortcuts and hardened export sidecars | `covered (opt-in)` | Strict opt-in via `GRAPHIFY_GOOGLE_WORKSPACE=1`; `.gdoc/.gsheet/.gslides` stubs are converted to Markdown sidecars via the Drive v3 REST API (intentional-delta: upstream uses the external `gws` CLI). Auth via `GOOGLE_OAUTH_ACCESS_TOKEN` or on-demand refresh-token exchange, never persisted. Covered by `tests/google-workspace.test.ts` (11 cases) and `tests/detect.test.ts > ignores Google Workspace shortcuts unless GRAPHIFY_GOOGLE_WORKSPACE is set`. | | Python `v0.7.5`..`v0.7.10` | MCP/query/install/security | MCP resources, edges/links loader fix, Kimi platform, positional install platforms, uninstall-all command, skill YAML descriptions, subprocess/security hardening | `covered` / `intentional-delta` | MCP resources are ported in `src/serve.ts` with read-only `graphify://...` resources; the TS graph loader already accepts both `links` and `edges`; positional `graphify install `, Kimi Code global install, trigger-oriented skill descriptions, top-level uninstall, missing-skill repair, atomic skill writes, and mapped security hardening are covered by targeted regression tests. Python-only subprocess shell-injection fixes are `n/a` where the TS runtime already uses `execFileSync` argv arrays. | | CRG `v2.3.3` | Review UI/accessibility | keyboard navigation, ARIA, node shapes, edge differentiation, help overlay, VS Code webview patterns | `partial` / `opportunity` | Reuse patterns for Graphify HTML/studio without adopting CRG's VS Code stack. | | CRG `v2.3.3` | Review precision and parsers | changed range mapping, Java/PHP/C++ fixes, Spring/Temporal/Kafka semantics, test runner detection, GDScript/ReScript/Nix/SystemVerilog | `partial` / `needs-triage` | Triage by generic value; implement over `.graphify/graph.json`, not SQLite. | | CRG `v2.3.3` | Daemon, embeddings, FTS, SQLite | multi-repo daemon, OpenAI-compatible embeddings, FTS sync, SQLite transactions | `deferred` / `intentional-delta` | Do not adopt by default; separate spec required before any optional index/daemon work. | ## CRG `v2.3.3` Row-Level Audit (Track C audit, 2026-05-14) Audit produced by drumbeat agent against `spec/SPEC_CODE_REVIEW_GRAPH_ALIGNMENT.md` and `spec/SPEC_CODE_REVIEW_GRAPH_OPPORUNITY.md`. 15 meaningful CRG features, no rejection. Nine map to `adopt-review`, two are deferred pending earlier closure. | # | Feature | CRG source | Category | Bucket | TS landing | Notes | | --- | --- | --- | --- | --- | --- | --- | | 1 | GraphStore adapter and node lookup | `code_review_graph/graph.py` | review-precision | `adopt-review` | `src/review-*.ts` | F3: `ReviewGraphStoreLike` reads `.graphify/graph.json`; enables all downstream review features. | | 2 | Execution flow tracing (BFS/CALLS) | `code_review_graph/flows.py:trace_flows` | review-precision | `adopt-review` | `src/flows.ts` | F7: forward traversal over `CALLS` edges, cycle safety, criticality weights. | | 3 | Affected flows mapping | `code_review_graph/flows.py:get_affected_flows` | review-precision | `adopt-review` | `src/affected-flows.ts` | F8: maps changed files to nodes, finds impacted flows. Already partly covered by `review-delta`. | | 4 | Review context and snippets | `code_review_graph/tools/review.py:get_review_context` | review-precision | `adopt-review` | `src/review-context.ts` | F5: minimal/standard detail levels, blast radius, source snippet caps. | | 5 | Unified diff parsing and risk scoring | `code_review_graph/changes.py` | changed-range | `adopt-review` | `src/changes.ts` | F6: git diff parsing, line-range node mapping, multi-factor risk (flow/test/security). | | 6 | Minimal first-hop context | `code_review_graph/tools/context.py:get_minimal_context` | review-precision | `adopt-review` | `src/minimal-context.ts` | F4: ~100 token budget. Already mostly covered by `graphify minimal-context`. | | 7 | Entrypoint/decorator detection | `code_review_graph/flows.py:detect_entry_points` | parser | `adopt-review` | `src/extract.ts` | Decorator patterns, conventional names (main, test_*, on_*, handle_*); embedded in F7. | | 8 | Skill/LLM review state machine | `code_review_graph/CLAUDE.md` | review-precision | `adopt-review` | `src/skills/*.md` | F10: minimal-context-first five-state flow. | | 9 | Flow artifact persistence | `code_review_graph/flows.py:store_flows` | review-precision | `adopt-review` | `.graphify/flows.json` | F7: schema with stable deterministic IDs. | | 10 | Report/wiki flow enrichment | `code_review_graph/wiki.py` | node-shape | `defer` | `src/wiki.ts` | F11: flow pages, community-flow links; defer until F7 stable in TS. | | 11 | Flow visualization HTML highlight | `code_review_graph/visualization.py` | node-shape | `defer` | `src/export.ts` | F11: interactive flow graphs; blocked on HTML renderer refactor. | | 12 | Benchmark / eval scoring | `code_review_graph/eval/scorer.py` | review-precision | `adopt-review` | `src/review-eval.ts` | F12: deterministic local fixtures, token-efficiency metrics, no network cloner. | | 13 | Security keyword classification | CRG security keyword set | changed-range | `adopt-review` | `src/changes.ts` | Boost risk for `auth`, `crypt`, `sql`, `encrypt`. Embedded in F6/F7. | | 14 | Test coverage gap detection | `code_review_graph/flows.py:compute_criticality` | review-precision | `adopt-review` | `src/criticality.ts` | Flag nodes without `TESTED_BY` edges. | | 15 | Flow criticality weights | `code_review_graph/flows.py:compute_criticality` | review-precision | `adopt-review` | `src/criticality.ts` | File spread 0.30, external calls 0.20, security 0.25, test gaps 0.15, depth 0.10. | Coverage notes: - `adopt-html` and `adopt-studio` HTML accessibility patterns (keyboard, focus, ARIA, contrast, help overlay, non-color-only file_type encoding) live in the second matrix below; the alignment specs do not break them down row-by-row, so they were audited separately and grouped into `C2` / `C3` lots in `PLAN.md`. - `defer` rows (10, 11) reopen automatically once F7 flow artifacts are stable in the TS line. - No `reject`: every classified row could be reopened without product-line risk. ### CRG `v2.3.3` Row-Level Audit — HTML UX, a11y and visual encoding | # | Feature | Surface | Bucket | Notes | | --- | --- | --- | --- | --- | | 1 | Tab order + keyboard focus ring | `graphify export html` (`src/export.ts`, vis.js config ~L545) | `adopt-html` | vis.js currently `keyboard: false`; need tab cycle, visible focus ring, Escape to deselect. | | 2 | ARIA labels on nodes / edges / legend | `graphify export html` | `adopt-html` | Zero `aria-label`/`role`/`aria-describedby` today. | | 3 | Focus management + screen-reader announce | `graphify export html` | `adopt-html` | `network.focus()` is silent; needs `aria-live="polite"` announcements. | | 4 | Colour contrast (WCAG AA) | export.ts styles ~L419 | `adopt-html` | CI check via axe-core or Pa11y on an HTML fixture. | | 5 | High-contrast mode toggle | export.ts | `adopt-html` | Optional CSS class + export flag. | | 6 | Colour-blind safe encoding | export.ts | `adopt-html` | Community currently encoded by colour only; add shape + pattern + label. | | 7 | Hover tooltip (descriptions) | export.ts vis.js config (~L542) | `adopt-html` | Add `data-help` on nodes/edges that have a description. | | 8 | Help overlay modal (F1 / ?) | export.ts | `adopt-html` | Keyboard-shortcut glossary + introspection of controls. | | 9 | Labeled search input + ARIA results list | export.ts | `adopt-html` | `