v0.9.97
Graphify-Labs/graphifyv0.9.97Oct 27, 2026by safishamsi
Upgrading?
Release notes summary
Graphify 0.9.97 is a security and correctness release focused on hardening credential redaction and fixing parser/extractor behavior across many languages and formats. It centralizes rationale-label redaction before caching, raises the anyio dependency floor for a high-severity CVE, and improves CommonMark Markdown and YAML structural extraction. The release also includes numerous targeted fixes for language extractors, build persistence, worktree detection, resolution, reporting, wiki handling, and query behavior.
Key Highlights
- Centralized rationale-label credential redaction in _safe_extract, expanding coverage to URL userinfo, PEM private keys, glued tokens, Slack refresh tokens, short JWTs, and Common Lisp docstrings.
- Raised anyio to >=4.14.2 in the mcp extra to address CVE-2026-63374, an IDNA hostname-validation bypass with CVSS 9.3.
- Fixed Markdown parsing to follow CommonMark rules for ATX headings and fenced code blocks, preventing false structure and lost headings.
- Improved YAML structural extraction to preserve written key spelling and source lines while avoiding YAML 1.1 boolean folding for keys like on/off/yes/no.
- Added broad extractor and pipeline fixes across Razor, Terraform, COBOL, Blade, Pascal, VB.NET, Fortran, JS/TS, OCaml, Verilog, build, detect, resolution, report, wiki, and query paths.
Full Release Notes
## 0.9.97 (2026-10-27) - Security: **rationale redaction** credential redaction for rationale labels moves to a single pre-cache choke point (`_redact_rationale_labels` inside `_safe_extract`), so no extractor can skip it, and it now covers more leak shapes: URL userinfo with an empty user or with `/`/`@` in the password, PEM private-key bodies, tokens glued to surrounding text by `_` (for example `ghp_...`), Slack `xoxe-` refresh tokens, short JWTs, and Common Lisp docstrings that previously built labels without redacting. Benign strings (hashes, `sk-` prose, URLs without userinfo) are left alone (#4647, thanks @0xkaushik-ai). - Security: **deps** anyio is floored to `>=4.14.2` in the `mcp` extra, above CVE-2026-63374 (an IDNA 2003 vs 2008 hostname-validation bypass that let a MITM on a non-ASCII domain present a cert for a different ASCII host, CVSS 9.3). anyio is only a transitive dependency and the lockfile already resolves 4.15.1, so this is a floor to stop a future re-resolution from regressing. - Fix: **markdown** ATX headings parse per CommonMark: a trailing run of `#` is not part of the heading text (`## Setup ##` is "Setup"), up to three spaces of indent are allowed (four is an indented code block), and a hash-only line like `## ##` mints no node (#4790, #4791, thanks @jaimemartinez). - Fix: **markdown** fenced code blocks are tracked by CommonMark rules (backtick and tilde fences, info strings, matching close length), so a line that looks like a heading inside a fence no longer leaks as structure, and a heading after a `~~~` block that contains a ` ``` ` line is no longer lost (#4787, #4788, thanks @jaimemartinez). - Fix: **yaml** structural extraction reads the composed node tree, so keys carry their written spelling and their own source line instead of all landing on line 1, and YAML 1.1 bare keys like `on`/`off`/`yes`/`no` are no longer folded to booleans (a workflow `on:` block is extracted, not turned into a `True` node) (#4784, #4785, thanks @jaimemartinez). - Fix: **razor** a component's `@implements` interfaces are extracted as `implements` edges instead of being silently dropped (#4820, thanks @ayushcodes10). - Fix: **terraform** an aliased provider block gets its own alias-qualified node (so two `provider "aws"` blocks no longer collapse into one and lose attributes), and a `provider = aws.west` reference resolves to it instead of dangling; a `local` literally named `provider` is no longer misread (#4819, thanks @ayushcodes10). - Fix: **cobol** paragraphs that follow a nested `END PROGRAM` reattach to the enclosing program instead of sticking to the nested one, via a program stack (#4824, thanks @ayushcodes10). - Fix: **blade** a `wire:click` directive binds the bare method name: dotted modifiers (`wire:click.prevent="submit"`) are matched, call arguments are trimmed from the name (`deleteItem(5)` binds `deleteItem`), and a `$`-prefixed magic action mints no fabricated edge (#4823, thanks @ayushcodes10). - Fix: **pascal** a `record` is recognised as a type with its own methods in the regex fallback (the default path without the optional `pascal` extra), matching the tree-sitter path; `operator` members are extracted too (#4825, thanks @ayushcodes10). - Fix: **vbnet** an `Operator` declaration is extracted as an `operator`-kind member of its class and its body is walked for calls, so a helper call inside an operator no longer vanishes (#4821, thanks @ayushcodes10). - Fix: **fortran** a `call` resolves to the subroutine it actually names instead of a target salted with the calling file's name (which never resolved), using the extractor's own cross-file stub idiom (#4795, thanks @ayushcodes10). - Fix: **cli** `graphify query --help`/`-h` (and now `graphify explain --help`/`-h`) with nothing else prints usage instead of running a literal query for the text "--help"; a longer question that merely contains "--help" as a substring still runs as a query (#4830, thanks @curl-man). - Fix: **js** a nested (inner) function no longer leaks into the file-wide name map, so a call elsewhere in the file binds to the top-level function of that name rather than an inner one it cannot see; recursion, shadowing and sibling scopes resolve correctly (ports the Python scope scheme to JS/TS) (#4767, thanks @smngvlkz). - Fix: **ocaml** every binding in an `and`-chained `module ... and ...` or `class ... and ...` is extracted, not just the first, so later bindings are no longer silently dropped; each carries its own source line (#4822, thanks @ayushcodes10). - Fix: **verilog** a SystemVerilog class `task` method is modeled like a `function` one (its own node, `method` edge and parameter-type references), and a task-local variable no longer leaks as a false field reference on the class (#4774, thanks @ayushcodes10). - Fix: **build** an edge with no `relation` is dropped instead of persisted, on both the build and the raw `--no-cluster` write paths, and alias folding (`relationship` to `relation`) runs before the check (#4810, thanks @legendteddy; reproducer also filed as #4826 by @sunhouy). - Fix: **build** the shrink guard counts a saved document-mention node that folds into its AST file twin on reload as present, not lost, so a cluster-only write is no longer refused when nothing was actually lost (#4778, #4779, thanks @AndresDiagoM). - Fix: **detect** a linked git worktree whose main checkout resolves inside the scan root is pruned, so a sibling worktree no longer gets indexed as a second full copy of the repo (#4683, #4833, thanks @barlowa124; duplicate work in #4685 by @AndresDiagoM). - Fix: **resolution** an inline comment in a pnpm-workspace glob is stripped per YAML rules, and a glob that `Path.glob` rejects (a `**` component or an absolute pattern) is skipped with a warning instead of crashing the whole `extract` run (#4681, #4687, thanks @Deepjyoti-Sarmah). - Fix: **report** a community hub `[[wikilink]]` is slugged through the same `export._obsidian_safe_stem` the export uses, so the link matches the file the export actually writes instead of dangling (#4696, thanks @ayushcodes10). - Fix: **wiki** a community relabelled only by letter case keeps its article instead of having the sweep delete the file the run just wrote; on a case-sensitive filesystem the stale lower-case twin is unlinked rather than renamed over the fresh file (which would silently restore the old body) (#4508, #4798, thanks @dupeisen). - Fix: **query** filler verbs `get`/`gets`/`got`/`getting` are dropped from query terms (like the existing `work`/`works`), so a framework hub labelled "Get" is not pulled in as a BFS seed by an exact-match bonus; node lookups for a literal `Get` still resolve (#4686, thanks @AndresDiagoM).
Related Repositories
A collective list of free APIs
The agent that grows with you
A feature-rich command-line audio/video downloader
Python tool for converting files and office documents to Markdown.
AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.