Skip to content

feat(detect): index Jupyter notebooks via markdown sidecars - #1498

Open
KunojiLym wants to merge 4 commits into
Graphify-Labs:v8from
KunojiLym:feat/ipynb-notebook-support
Open

feat(detect): index Jupyter notebooks via markdown sidecars#1498
KunojiLym wants to merge 4 commits into
Graphify-Labs:v8from
KunojiLym:feat/ipynb-notebook-support

Conversation

@KunojiLym

@KunojiLym KunojiLym commented Jun 27, 2026

Copy link
Copy Markdown

Summary

Fixes #1497

Testing

  • uv run pytest tests/test_detect.py -k "ipynb or notebook or sidecar or convert_office" -q
  • uv run pytest tests/test_office_incremental.py tests/test_office_limits.py -q (office path unchanged / non-regression)
  • Offline checks: convert_office_file byte-identical to base; detect/detect_incremental notebook path (sidecar create, source refresh, output-only unchanged)
  • Maintainer: approve fork CI workflow run if Actions still shows action_required

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This PR adds Jupyter notebook (.ipynb) support to the file detection pipeline. It introduces NOTEBOOK_EXTENSIONS, classifies notebooks as DOCUMENT, and adds two functions—ipynb_to_markdown (converts a notebook to markdown, stripping outputs and using the kernel language for code fences) and convert_notebook_file (writes a hash-named markdown sidecar, mirroring the existing office-file conversion). The detect flow is updated to convert notebooks to sidecars during scanning, and a large block of tests covers classification, conversion, sidecar rewrite/preservation behavior on source-vs-output changes, and incremental detection. The surface area touched is graphify/detect.py (constants, classify_file, new conversion helpers, the detect loop) and tests/test_detect.py (new notebook-related test cases and helpers).

Worth a look

  • convert_notebook_file uses path.resolve() while convert_office_file uses root-relative naming, breaking stability across checkoutsgraphify/detect.py:815 · Escalate · medium
    • agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
  • Notebook sidecar name uses absolute resolved path, not scan-root-relative — unstable across checkoutsgraphify/detect.py:833 · Escalate · medium
    • agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1163 functions depend on the 436 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 83 callers, 13 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 16 callers, 5 callees
  • worse: count_words() — 3 callers, 4 callees

Verification — 1163 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 629 function(s) in the blast radius were not formally verified this run

· 1 grounded finding(s) anchored inline below; 3 more finding(s) on lines outside this diff (see the check run).

Comment thread graphify/detect.py

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This PR adds Jupyter notebook (.ipynb) support to the file detection/conversion pipeline in graphify/detect.py. It introduces a NOTEBOOK_EXTENSIONS set, classifies notebooks as DOCUMENT, and adds two functions—ipynb_to_markdown (extracts cell sources into fenced markdown, stripping outputs and using kernel language for fences) and convert_notebook_file (writes a hashed markdown sidecar, comparing extracted content rather than mtime to decide whether to rewrite). The detect flow is wired to convert notebooks into sidecars similar to the existing Office-file handling. The bulk of the change is new tests in tests/test_detect.py covering classification, markdown conversion across cell types/kernel languages/malformed inputs, sidecar creation, and sidecar rewrite/mtime behavior on notebook re-runs.

No blocking issues surfaced. 7 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1176 functions depend on the 449 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 83 callers, 12 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 16 callers, 5 callees
  • new: convert_notebook_file() — 7 callers, 2 callees

Verification — 1176 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 642 function(s) in the blast radius were not formally verified this run

· 1 grounded finding(s) anchored inline below; 3 more finding(s) on lines outside this diff (see the check run).

Comment thread graphify/detect.py

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This PR adds Jupyter notebook (.ipynb) support to the file detection/conversion pipeline in graphify/detect.py. It introduces a NOTEBOOK_EXTENSIONS set, classifies notebooks as DOCUMENT, and adds ipynb_to_markdown and convert_notebook_file functions that convert notebooks into markdown sidecars (stripping outputs, using kernel language for code fences). A shared _sidecar_path helper is extracted from the existing Office conversion path so both Office and notebook conversions use the same relative-path-based, NFC-normalized naming scheme. The detect function is wired to convert notebooks to sidecars during scanning, mirroring the existing Office-file handling. The test file adds coverage for notebook classification, markdown conversion across cell types/kernel languages/malformed input, and end-to-end sidecar creation during detection. The surface area touches file classification, the conversion/sidecar helpers, and the main detect loop.

No blocking issues surfaced. 9 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1172 functions depend on the 445 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 83 callers, 12 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 16 callers, 5 callees
  • worse: convert_office_file() — 8 callers, 4 callees

Verification — 1172 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 638 function(s) in the blast radius were not formally verified this run

· 1 grounded finding(s) anchored inline below; 3 more finding(s) on lines outside this diff (see the check run).

Comment thread graphify/detect.py

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This PR adds Jupyter notebook (.ipynb) support to the file detection pipeline. In graphify/detect.py, it introduces a NOTEBOOK_EXTENSIONS set, classifies notebooks as DOCUMENT, and adds helper functions (ipynb_to_markdown, convert_notebook_file, _notebook_sidecar_path) that convert notebooks into markdown sidecar files—stripping outputs, using the kernel language for code fences, and mirroring the Office sidecar naming scheme. The detect() flow is wired to convert notebooks into sidecars rather than indexing the raw .ipynb. The test file adds coverage for notebook classification, markdown conversion across various cell/metadata/source shapes, sidecar naming stability across checkouts, and rewrite/refresh semantics on re-runs versus source edits. The surface area is the detection module and its test suite; the many rationale_* symbol changes suggest accompanying doc/rationale entries were touched as well.

No blocking issues surfaced. 4 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1172 functions depend on the 445 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 83 callers, 12 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 16 callers, 5 callees

Verification — 1172 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 638 function(s) in the blast radius were not formally verified this run

· 3 more finding(s) on lines outside this diff (see the check run).

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This PR adds support for indexing Jupyter notebooks (.ipynb) by converting them into Markdown sidecars before Pass 3 extraction, rather than treating them as code or doc files directly. In detect.py it introduces a NOTEBOOK_EXTENSIONS set, classifies notebooks as DOCUMENT, and adds ipynb_to_markdown, convert_notebook_file, and _notebook_sidecar_path helpers that emit fenced code (using the kernel language from metadata) and verbatim markdown while stripping outputs, wired into the main detect loop alongside the existing Office conversion path. Supporting changes include new tests in test_detect.py covering classification, conversion, and sidecar behavior, plus CHANGELOG, README, and how-it-works documentation updates.

No blocking issues surfaced. 4 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1382 functions depend on the 655 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 83 callers, 12 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 16 callers, 5 callees

Verification — 1382 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 848 function(s) in the blast radius were not formally verified this run

· 3 more finding(s) on lines outside this diff (see the check run).

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This PR adds support for indexing Jupyter notebooks (.ipynb) by converting them into Markdown sidecars, mirroring the existing Office-file conversion flow. It introduces NOTEBOOK_EXTENSIONS, classifies notebooks as DOCUMENT, and adds ipynb_to_markdown, convert_notebook_file, and _notebook_sidecar_path helpers that extract cell sources (code cells fenced with the kernel language, markdown verbatim, outputs stripped) and write sidecars using a scan-root-relative hashed name. The detect loop is wired to convert notebooks, and the changes are accompanied by new tests, README/docs updates, and a changelog entry. Surface area: graphify/detect.py (constants, classification, new conversion functions, detect loop), tests/test_detect.py, README.md, docs/how-it-works.md, and CHANGELOG.md.

No blocking issues surfaced. 4 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1403 functions depend on the 656 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 83 callers, 12 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 16 callers, 5 callees

Verification — 1403 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 849 function(s) in the blast radius were not formally verified this run

· 3 more finding(s) on lines outside this diff (see the check run).

@KunojiLym KunojiLym changed the title Feat/ipynb notebook support feat(detect): index Jupyter notebooks via markdown sidecars Aug 1, 2026

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

This pull request adds support for Jupyter notebook (.ipynb) files as a new document type. It introduces conversion logic in graphify/detect.py that transforms notebooks into Markdown sidecars (code cells become fenced blocks using the kernel language, markdown cells pass through verbatim, outputs stripped), following the same hash-based sidecar naming scheme used for Office files but using content comparison rather than mtime for the rewrite check. Notebooks are classified as DOCUMENT, wired into the detect pipeline, documented in the README and how-it-works docs, and covered by new tests exercising cell conversion, language fencing, malformed input, sidecar creation, and incremental behavior.

No blocking issues surfaced. 5 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1275 functions depend on the 491 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: detect() — 85 callers, 12 callees
  • worse: classify_file() — 43 callers, 3 callees
  • worse: detect_incremental() — 18 callers, 5 callees

Verification — 1275 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 696 function(s) in the blast radius were not formally verified this run

· 3 more finding(s) on lines outside this diff (see the check run).

Rebase notebook sidecar support onto Graphify v8 (0.9.50). Convert
.ipynb files to markdown sidecars (code cells fenced with the kernel
language, markdown verbatim, outputs stripped) and classify them as
documents so notebook-heavy corpora are no longer dropped during scan.

Sidecar names use the scan-root-relative path (Graphify-Labs#2059). Re-runs that
only change outputs do not bump sidecar mtime or trigger re-extraction.
Keep upstream's detect ignore-perf rewrite (Graphify-Labs#2226); notebook conversion
uses _ignored_for_scan like Office sidecars. convert_office_file is
untouched.

Fixes Graphify-Labs#1497

Co-authored-by: Cursor <cursoragent@cursor.com>
@cursor
cursor Bot force-pushed the feat/ipynb-notebook-support branch from d2ab3ba to bae1b87 Compare August 27, 2026 06:32

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.

Formal verification. No changes could be formally verified in this run.


Graphify review — findings

Adds Jupyter notebook (.ipynb) indexing by converting each notebook to a Markdown sidecar under graphify-out/converted/ before Pass 3, with no extra dependency. ipynb_to_markdown emits markdown cells verbatim and code cells as fenced blocks tagged with the kernel language from notebook metadata (falling back to code), stripping outputs; convert_notebook_file names the sidecar from the scan-root-relative NFC-normalized path so committed output stays identical across clones, and skips rewrites when the extracted markdown is unchanged so re-running a notebook (fresh outputs only) doesn't churn the sidecar or trigger re-extraction. .ipynb classifies as DOCUMENT but is deliberately kept out of CODE_EXTENSIONS/DOC_EXTENSIONS, and conversion failure records the file as skipped.

Worth a look

  • Notebook code fences can be prematurely closed by code cell contentsgraphify/detect.py:838 · Escalate · medium
    • agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 2030 functions depend on the 773 functions this change touches.

Health — this change adds coupling hotspots:

  • new: extract() — 498 callers, 42 callees
  • new: _rebuild_code() — 98 callers, 50 callees
  • new: detect() — 111 callers, 16 callees
  • new: save_manifest() — 40 callers, 11 callees
  • new: extract_files_direct() — 17 callers, 20 callees
  • new: extract_xaml() — 19 callers, 17 callees
  • new: extract_corpus_parallel() — 26 callers, 11 callees
  • new: dispatch_command() — 2 callers, 122 callees
  • …and 28 more — each is listed as a finding

Verification — 2030 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 1116 function(s) in the blast radius were not formally verified this run

Formal verification

Could not verify: Could not verify classify\_file.

The verifier did not have enough to check classify\_file, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `path` is annotated `Path` — outside the synthesizable primitive/collection set

Could not verify: Could not verify detect.

The verifier did not have enough to check detect, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `root` is annotated `Path` — outside the synthesizable primitive/collection set

· 36 more finding(s) on lines outside this diff (see the check run).

CommonMark closes a fence on a line of N or more backticks, so a code
cell containing ``` (or a longer run) terminated the sidecar wrapper
early. Size each cell's fence to max(3, longest run + 1) and keep the
kernel language info-string.

Co-authored-by: Yingzhao Ouyang <KunojiLym@users.noreply.github.com>

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).

Formal verification. No changes could be formally verified in this run.


Graphify review — findings

Adds Jupyter notebook (.ipynb) indexing by converting each notebook to a Markdown sidecar under graphify-out/converted/ before Pass 3: classify_file maps .ipynb to DOCUMENT, ipynb_to_markdown emits markdown cells verbatim and code cells in fences sized past the longest backtick run and labeled with the notebook's kernel language (falling back to code), stripping all outputs, with no extra install. Sidecar names come from _notebook_sidecar_path, hashing the NFC-normalized scan-root-relative path so the same notebook produces byte-identical sidecars across clones and falls back to the absolute path when outside the root. Unlike the Office mtime gate, convert_notebook_file compares extracted markdown to the existing sidecar so re-runs that only change outputs or execution counts leave the sidecar mtime untouched and skip re-extraction.

No blocking issues surfaced. 4 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 2032 functions depend on the 775 functions this change touches.

Health — this change adds coupling hotspots:

  • new: extract() — 498 callers, 42 callees
  • new: _rebuild_code() — 98 callers, 50 callees
  • new: detect() — 111 callers, 16 callees
  • new: save_manifest() — 40 callers, 11 callees
  • new: extract_files_direct() — 17 callers, 20 callees
  • new: extract_xaml() — 19 callers, 17 callees
  • new: extract_corpus_parallel() — 26 callers, 11 callees
  • new: dispatch_command() — 2 callers, 122 callees
  • …and 28 more — each is listed as a finding

Verification — 2032 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 1118 function(s) in the blast radius were not formally verified this run

Formal verification

Could not verify: Could not verify classify\_file.

The verifier did not have enough to check classify\_file, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `path` is annotated `Path` — outside the synthesizable primitive/collection set

Could not verify: Could not verify detect.

The verifier did not have enough to check detect, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `root` is annotated `Path` — outside the synthesizable primitive/collection set

· 36 more finding(s) on lines outside this diff (see the check run).

Resolve CHANGELOG conflict by keeping the Unreleased .ipynb sidecar Feat
(Graphify-Labs#1497 / Graphify-Labs#2059) above v8's 0.9.51–0.9.53 notes. Notebook conversion and
fence-lengthening landed cleanly via auto-merge.

Co-authored-by: Yingzhao Ouyang <KunojiLym@users.noreply.github.com>

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.

Formal verification. No changes could be formally verified in this run.


Graphify review — findings

Adds Jupyter notebook (.ipynb) support by converting them to Markdown sidecars under graphify-out/converted/ before Pass 3, with no extra install. classify_file now routes notebooks to DOCUMENT, ipynb_to_markdown emits markdown cells verbatim and code cells in fences that use the kernel language (falling back to code) with outputs stripped and backtick runs sized to avoid premature fence closure, and convert_notebook_file names sidecars by scan-root-relative NFC-normalized hash for reproducible output across clones. Sidecar rewrites compare extracted markdown rather than mtime, so re-running a notebook that only changes outputs leaves the sidecar untouched and skips re-extraction.

Worth a look

  • Null notebook language metadata drops conversiongraphify/detect.py:825 · Escalate · medium
    • agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 2112 functions depend on the 779 functions this change touches.

Health — this change adds coupling hotspots:

  • new: extract() — 520 callers, 43 callees
  • new: _rebuild_code() — 113 callers, 50 callees
  • new: detect() — 111 callers, 16 callees
  • new: save_manifest() — 40 callers, 11 callees
  • new: extract_files_direct() — 17 callers, 20 callees
  • new: extract_xaml() — 19 callers, 17 callees
  • new: extract_corpus_parallel() — 26 callers, 11 callees
  • new: dispatch_command() — 2 callers, 123 callees
  • …and 28 more — each is listed as a finding

Verification — 2112 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 1137 function(s) in the blast radius were not formally verified this run

Formal verification

Could not verify: Could not verify classify\_file.

The verifier did not have enough to check classify\_file, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `path` is annotated `Path` — outside the synthesizable primitive/collection set

Could not verify: Could not verify detect.

The verifier did not have enough to check detect, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `root` is annotated `Path` — outside the synthesizable primitive/collection set

· 36 more finding(s) on lines outside this diff (see the check run).

Jupyter/VS Code/Databricks often write language_info or kernelspec as
null. dict.get defaults do not cover that, so .get("name") raised and
convert_notebook_file skipped the notebook. Fall back to a generic
code fence, including when name/language themselves are null.

Co-authored-by: Yingzhao Ouyang <KunojiLym@users.noreply.github.com>

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.

Formal verification. No changes could be formally verified in this run.


Graphify review — findings

Adds Jupyter notebook indexing by converting .ipynb files into Markdown sidecars under graphify-out/converted/ during Pass 3 — ipynb_to_markdown renders code cells as fenced blocks using the kernel language from metadata (falling back to code), keeps markdown cells verbatim, strips outputs, and sizes fences one backtick past the longest run in a cell so embedded fences can't break out. convert_notebook_file writes the sidecar via _notebook_sidecar_path, which hashes the scan-root-relative NFC-normalized path so the same notebook produces byte-identical sidecars across clones, and skips the rewrite when the extracted markdown is unchanged so re-runs that only refresh outputs don't churn the sidecar or trigger re-extraction. Classifies .ipynb as DOCUMENT without adding it to CODE_EXTENSIONS/DOC_EXTENSIONS, and requires no extra install.

Worth a look

  • Notebook sidecar collision drops distinct notebooks with same stemgraphify/detect.py:809 · Escalate · medium
    • agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 2114 functions depend on the 781 functions this change touches.

Health — this change adds coupling hotspots:

  • new: extract() — 520 callers, 43 callees
  • new: _rebuild_code() — 113 callers, 50 callees
  • new: detect() — 111 callers, 16 callees
  • new: save_manifest() — 40 callers, 11 callees
  • new: extract_files_direct() — 17 callers, 20 callees
  • new: extract_xaml() — 19 callers, 17 callees
  • new: extract_corpus_parallel() — 26 callers, 11 callees
  • new: dispatch_command() — 2 callers, 123 callees
  • …and 28 more — each is listed as a finding

Verification — 2114 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 1139 function(s) in the blast radius were not formally verified this run

Formal verification

Could not verify: Could not verify classify\_file.

The verifier did not have enough to check classify\_file, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `path` is annotated `Path` — outside the synthesizable primitive/collection set

Could not verify: Could not verify detect.

The verifier did not have enough to check detect, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: parameter `root` is annotated `Path` — outside the synthesizable primitive/collection set

· 36 more finding(s) on lines outside this diff (see the check run).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add Jupyter notebook (.ipynb) support via markdown sidecar extraction

2 participants