Skip to content

feat(notion-react): experimental JSX-to-Notion-Markdown projection - #1099

Open
schickling wants to merge 8 commits into
mainfrom
schickling/2026-08-21-jsx-nmd
Open

feat(notion-react): experimental JSX-to-Notion-Markdown projection#1099
schickling wants to merge 8 commits into
mainfrom
schickling/2026-08-21-jsx-nmd

Conversation

@schickling

Copy link
Copy Markdown
Collaborator

Closes #1097. Follow-up filed: #1098.

What

New @overeng/notion-react/markdown entry point exposing renderToNotionMarkdown(element) — a read-only, pure, network-free projection of authored JSX to a readable Notion-enhanced-Markdown body for review artifacts, CLI previews/exports, and optional .nmd envelope composition.

const { body, diagnostics } = renderToNotionMarkdown(<Instructions />)
// # Blocky instructions
//
// <details>
// <summary>Deploy</summary>
//
// Run the audited deploy command.
//
// </details>

Design (recorded in docs/vrs/.decisions/0001)

  • Shared semantics, dedicated serializer. Reuses the production buildCandidateTree pass (no HTML scraping, no mutation-op reconstruction). Delegation to the pull-side treeToMarkdown was rejected: no diagnostics channel, silent unknown-type drop, hardcoded list numbering, non-GFM tables — and modifying it risks .nmd wire drift (notion-react/markdown: centralize block spellings with pull-side renderer when second consumer lands #1098 tracks eventual centralization).
  • Structured result. { body, diagnostics } with typed kinds: unsupported-block, media-without-url, color-dropped, flattened. Nothing disappears silently; nothing fails hard.
  • Fidelity policy. Colors dropped with diagnostics; blockKey absent from the body; toggleable headings and child pages flatten with diagnostics; Raw blocks emit HTML-comment placeholders.
  • Composition without reverse coupling. Body composes with renderNmdFile({frontmatter, body}); notion-md is a devDependency used only by the colocated composition test — production imports stay clean.
  • Explicitly experimental per the notion-react: render JSX to Notion enhanced Markdown for previews and exports #1097 demand gate (@experimental JSDoc + CHANGELOG note).

Verification

  • 17 new tests: golden coverage (headings, rich text, links, mentions, equations, per-run numbered lists, nested lists, to-dos, toggles, quotes, callouts, code fences, GFM tables with header separator, media, bookmarks, embeds, dividers, TOC, page links) + determinism + composition
  • Full package suite green (335 tests); check:all green
  • VRS strict-profile clean for new artifacts (spec section, decision 0001, experiment 0001)
  • pnpm-deps FOD hashes refreshed for the lockfile change

Non-goals honored

No Markdown in any production sync chain, no CacheTree/sync-safety claims from Markdown equality, no second identity/cache/sync model, no round-trip fidelity promise.

#1097)

Add renderToNotionMarkdown at the new @overeng/notion-react/markdown entry
point: a read-only, pure, network-free projector that reuses the production
buildCandidateTree pass and serializes the CandidateTree to a readable
Notion-enhanced-Markdown body with typed diagnostics for lossy constructs.

- dedicated serializer over the shared CandidateTree; spellings aligned with
  the pull-side dialect where sound (delegation to treeToMarkdown rejected:
  no diagnostics channel, wire-drift risk)
- structured result { body, diagnostics }: unsupported-block,
  media-without-url, color-dropped, flattened
- drop-with-diagnostics fidelity: blockKey absent from body, toggleable
  headings and child pages flatten with diagnostics, Raw blocks emit
  HTML-comment placeholders
- composition test via @overeng/notion-md devDependency (renderNmdFile);
  production imports stay clean, no reverse coupling
- golden tests across headings/rich text/lists/toggles/tables/code/callouts/
  links/nesting + determinism check (17 new tests)
- VRS: spec section, decision 0001, experiment 0001 (strict-profile clean)
- refresh pnpm-deps FOD hashes staled by the lockfile change

Closes #1097
Filed #1098 for spelling centralization when a second consumer lands.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 086dc06cd0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown

Storybook Previews

Subject Status Report Details Updated
react-inspector success react-inspector preview deployed Preview is ready 2026-08-22 11:32 UTC
genie success genie preview deployed Preview is ready 2026-08-22 11:32 UTC
effect-schema-form-aria success effect-schema-form-aria preview deployed Preview is ready 2026-08-22 11:32 UTC
effect-react success effect-react preview deployed Preview is ready 2026-08-22 11:32 UTC
notion-cli success notion-cli preview deployed Preview is ready 2026-08-22 11:32 UTC
notion-md success notion-md preview deployed Preview is ready 2026-08-22 11:32 UTC
tui-react success tui-react preview deployed Preview is ready 2026-08-22 11:32 UTC
notion-react success notion-react preview deployed Preview is ready 2026-08-22 11:32 UTC
megarepo success megarepo preview deployed Preview is ready 2026-08-22 11:32 UTC
Report history

PR 1099 · 2026-08-22 11:33 UTC

Subject Status Report Details Updated
react-inspector success react-inspector preview deployed Preview is ready 2026-08-22 11:32 UTC
genie success genie preview deployed Preview is ready 2026-08-22 11:32 UTC
effect-schema-form-aria success effect-schema-form-aria preview deployed Preview is ready 2026-08-22 11:32 UTC
effect-react success effect-react preview deployed Preview is ready 2026-08-22 11:32 UTC
notion-cli success notion-cli preview deployed Preview is ready 2026-08-22 11:32 UTC
notion-md success notion-md preview deployed Preview is ready 2026-08-22 11:32 UTC
tui-react success tui-react preview deployed Preview is ready 2026-08-22 11:32 UTC
notion-react success notion-react preview deployed Preview is ready 2026-08-22 11:32 UTC
megarepo success megarepo preview deployed Preview is ready 2026-08-22 11:32 UTC

PR 1099 · 2026-08-22 09:16 UTC

Subject Status Report Details Updated
react-inspector success react-inspector preview deployed Preview is ready 2026-08-22 09:15 UTC
effect-react success effect-react preview deployed Preview is ready 2026-08-22 09:15 UTC
effect-schema-form-aria success effect-schema-form-aria preview deployed Preview is ready 2026-08-22 09:15 UTC
genie success genie preview deployed Preview is ready 2026-08-22 09:15 UTC
notion-cli success notion-cli preview deployed Preview is ready 2026-08-22 09:15 UTC
tui-react success tui-react preview deployed Preview is ready 2026-08-22 09:15 UTC
notion-md success notion-md preview deployed Preview is ready 2026-08-22 09:15 UTC
notion-react success notion-react preview deployed Preview is ready 2026-08-22 09:15 UTC
megarepo success megarepo preview deployed Preview is ready 2026-08-22 09:15 UTC

PR 1099 · 2026-08-22 08:43 UTC

Subject Status Report Details Updated
react-inspector success react-inspector preview deployed Preview is ready 2026-08-22 08:42 UTC
effect-schema-form-aria success effect-schema-form-aria preview deployed Preview is ready 2026-08-22 08:42 UTC
effect-react success effect-react preview deployed Preview is ready 2026-08-22 08:42 UTC
genie success genie preview deployed Preview is ready 2026-08-22 08:42 UTC
notion-md success notion-md preview deployed Preview is ready 2026-08-22 08:42 UTC
notion-cli success notion-cli preview deployed Preview is ready 2026-08-22 08:42 UTC
tui-react success tui-react preview deployed Preview is ready 2026-08-22 08:42 UTC
notion-react success notion-react preview deployed Preview is ready 2026-08-22 08:42 UTC
megarepo success megarepo preview deployed Preview is ready 2026-08-22 08:42 UTC

PR 1099 · 2026-08-21 20:23 UTC

Subject Status Report Details Updated
effect-react success effect-react preview deployed Preview is ready 2026-08-21 20:22 UTC
notion-md success notion-md preview deployed Preview is ready 2026-08-21 20:22 UTC
effect-schema-form-aria success effect-schema-form-aria preview deployed Preview is ready 2026-08-21 20:22 UTC
react-inspector success react-inspector preview deployed Preview is ready 2026-08-21 20:22 UTC
genie success genie preview deployed Preview is ready 2026-08-21 20:22 UTC
notion-cli success notion-cli preview deployed Preview is ready 2026-08-21 20:22 UTC
notion-react success notion-react preview deployed Preview is ready 2026-08-21 20:22 UTC
tui-react success tui-react preview deployed Preview is ready 2026-08-21 20:22 UTC
megarepo success megarepo preview deployed Preview is ready 2026-08-21 20:22 UTC

github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown

CI Measurements

partial - advisory gate - readiness partial (17/26 enabled observations gateable) - commit 0121708 - protocol devenv-perf-warm-median-v2

No regressions. Comparable movement is below the semantic impact threshold; neutral rows are collapsed below.

Measurement change vs baseline chart

SVG source

devenv / quality gates

What changed? Group Probe Baseline -> current Raw change Impact Confidence
no material impact devenv / quality gates Forced check:quick 17.046 s -> 22.078 s +5.032 s / 29.5% +0.08x paired n=3, 25-75% delta 0.21 s..3.025 s

nix / closures / packages

What changed? Group Probe Baseline -> current Raw change Impact Confidence
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=6, current n=1
Unchanged / 0-impact measurements (16)

These rows had compatible baseline data, but their semantic impact rounded to 0.00x because the movement was below the configured budget, below the noise floor, or inside the robust noise band.

devenv / devenv cli

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / devenv cli devenv tasks list 0.04 s -> 0.042 s +0.002 s / 5% 0.00x yes paired n=9, 25-75% delta -0.001 s..0.001 s Too small to matter
devenv / devenv cli devenv processes --help 0.02 s -> 0.021 s +0.001 s / 5% 0.00x yes paired n=9, 25-75% delta -0.001 s..0.002 s Too small to matter

devenv / devenv shell

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / devenv shell Warm shell eval 8.354 s -> 8.359 s +0.005 s / 0.1% 0.00x yes paired n=5, 25-75% delta -0.02 s..0.017 s Too small to matter

devenv / genie

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / genie Genie check task 4.56 s -> 4.699 s +0.139 s / 3% 0.00x yes paired n=5, 25-75% delta 0.032 s..0.078 s Unchanged
devenv / genie Genie run task 1.804 s -> 1.784 s -0.02 s / -1.1% 0.00x yes paired n=5, 25-75% delta -0.04 s..0.046 s Too small to matter

devenv / quality gates

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / quality gates Warm cached check:quick 8.175 s -> 8.182 s +0.007 s / 0.1% 0.00x yes paired n=5, 25-75% delta -0.157 s..0.051 s Too small to matter

devenv / workspace setup

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / workspace setup pnpm install task 0.966 s -> 0.86 s -0.106 s / -11% 0.00x yes paired n=5, 25-75% delta -0.069 s..-0.013 s Unchanged

nix / closures / packages

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
nix / closures / packages Total closure size 166 MiB -> 166 MiB +2 KiB / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 166 MiB -> 166 MiB +2 KiB / 0% 0.00x yes within_budget, baseline n=6, current n=1 Slightly higher, ok
nix / closures / packages Total closure path count 83 count -> 83 count +0 count / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total closure path count 5 count -> 5 count +0 count / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total closure path count 8 count -> 8 count +0 count / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total closure size 584 MiB -> 584 MiB +0 B / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total closure size 151.7 MiB -> 151.7 MiB +0 B / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 584 MiB -> 584 MiB +0 B / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 151.7 MiB -> 151.7 MiB +0 B / 0% 0.00x yes noise_floor, baseline n=6, current n=1 Too small to matter
Diagnostic / ungated measurements (7)

source / effect-utils

Group Probe Current Baseline Impact Gate Reason Evidence
source / effect-utils Genie CI workflow helpers lines 8863 lines 8374.5 lines diagnostic disabled Diagnostic only diagnostic, baseline n=6, current n=11
source / effect-utils Genie runtime lines 27636 lines 27507.5 lines diagnostic disabled Diagnostic only diagnostic, baseline n=6, current n=95
source / effect-utils Genie CI workflow helpers files 11 count 10.5 count diagnostic disabled Diagnostic only diagnostic, baseline n=6, current n=11
source / effect-utils Genie runtime files 95 count 95 count diagnostic disabled Diagnostic only diagnostic, baseline n=6, current n=95
source / effect-utils Nix workspace tools files 16 count 16 count diagnostic disabled Diagnostic only diagnostic, baseline n=6, current n=16
source / effect-utils Nix workspace tools lines 4291 lines 4291 lines diagnostic disabled Diagnostic only diagnostic, baseline n=6, current n=16

devenv / devenv shell

Group Probe Current Baseline Impact Gate Reason Evidence
devenv / devenv shell Shell eval with OTEL trace 117.078 s n/a n/a missing_baseline No baseline yet missing_baseline, baseline n=0, current n=1
All measurements
Status Gate Target Observation Dimensions Baseline Current Delta Ratio Impact
pass yes Dev shell Forced check:quick aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=3
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=3
phase=warm
probe=task_check_quick_forced
probeLabel=Forced check:quick
sampleCount=6
status=0
taskCacheMode=refresh
warmupCount=0
workload=forced-task-cache
17.046 s 22.078 s +5.032 s 29.5% +0.08x
pass yes Megarepo package Total closure size bucket=total 166 MiB 166 MiB +2 KiB 0% 0.00x
pass yes Megarepo package Total serialized NAR size bucket=total
sizeKind=nar
166 MiB 166 MiB +2 KiB 0% 0.00x
pass disabled effect-utils repository Genie CI workflow helpers lines scope=genie_ci_workflow 8374.5 lines 8863 lines +488.5 lines 5.8% diagnostic
pass disabled effect-utils repository Genie runtime lines scope=genie_runtime 27507.5 lines 27636 lines +128.5 lines 0.5% diagnostic
pass disabled effect-utils repository Genie CI workflow helpers files scope=genie_ci_workflow 10.5 count 11 count +0.5 count 4.8% diagnostic
pass yes Dev shell Genie check task aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=5
phase=warm
probe=genie_check_task
probeLabel=Genie check task
sampleCount=11
status=0
warmupCount=1
4.56 s 4.699 s +0.139 s 3% 0.00x
pass yes Dev shell pnpm install task aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=5
phase=warm
probe=task_pnpm_install
probeLabel=pnpm install task
sampleCount=11
status=0
warmupCount=1
0.966 s 0.86 s -0.106 s -11% 0.00x
pass yes Dev shell Genie run task aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=5
phase=warm
probe=task_genie_run
probeLabel=Genie run task
sampleCount=11
status=0
warmupCount=1
1.804 s 1.784 s -0.02 s -1.1% 0.00x
pass yes Dev shell Warm cached check:quick aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=5
phase=warm
probe=task_check_quick_warm
probeLabel=Warm cached check:quick
sampleCount=11
status=0
taskCacheMode=warm
warmupCount=1
workload=cached-no-op
8.175 s 8.182 s +0.007 s 0.1% 0.00x
pass yes Dev shell Warm shell eval aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=5
phase=warm
probe=shell_eval_warm
probeLabel=Warm shell eval
sampleCount=11
status=0
warmupCount=1
8.354 s 8.359 s +0.005 s 0.1% 0.00x
pass yes Dev shell devenv tasks list aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=9
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=9
phase=warm
probe=tasks_list
probeLabel=devenv tasks list
sampleCount=19
status=0
warmupCount=1
0.04 s 0.042 s +0.002 s 5% 0.00x
pass yes Dev shell devenv processes --help aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=9
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=9
phase=warm
probe=processes_help
probeLabel=devenv processes --help
sampleCount=19
status=0
warmupCount=1
0.02 s 0.021 s +0.001 s 5% 0.00x
pass disabled effect-utils repository Genie runtime files scope=genie_runtime 95 count 95 count +0 count 0% diagnostic
unknown missing_baseline Genie package Nix sources closure size bucket=nix-sources 0 B 0 B +0 B n/a n/a
unknown missing_baseline Megarepo package Nix sources closure size bucket=nix-sources 0 B 0 B +0 B n/a n/a
unknown missing_baseline oxlint npm package Nix sources closure size bucket=nix-sources 0 B 0 B +0 B n/a n/a
pass disabled effect-utils repository Nix workspace tools files scope=nix_workspace_tools 16 count 16 count +0 count 0% diagnostic
pass disabled effect-utils repository Nix workspace tools lines scope=nix_workspace_tools 4291 lines 4291 lines +0 lines 0% diagnostic
unknown missing_baseline Genie package Node / pnpm closure size bucket=node 0 B 0 B +0 B n/a n/a
unknown missing_baseline Megarepo package Node / pnpm closure size bucket=node 0 B 0 B +0 B n/a n/a
unknown missing_baseline oxlint npm package Node / pnpm closure size bucket=node 0 B 0 B +0 B n/a n/a
unknown missing_baseline Genie package Rust closure size bucket=rust 0 B 0 B +0 B n/a n/a
unknown missing_baseline Megarepo package Rust closure size bucket=rust 0 B 0 B +0 B n/a n/a
unknown missing_baseline oxlint npm package Rust closure size bucket=rust 0 B 0 B +0 B n/a n/a
pass yes Genie package Total closure path count bucket=total 83 count 83 count +0 count 0% 0.00x
pass yes Megarepo package Total closure path count bucket=total 5 count 5 count +0 count 0% 0.00x
pass yes oxlint npm package Total closure path count bucket=total 8 count 8 count +0 count 0% 0.00x
pass yes Genie package Total closure size bucket=total 584 MiB 584 MiB +0 B 0% 0.00x
pass yes oxlint npm package Total closure size bucket=total 151.7 MiB 151.7 MiB +0 B 0% 0.00x
pass yes Genie package Total serialized NAR size bucket=total
sizeKind=nar
584 MiB 584 MiB +0 B 0% 0.00x
pass yes oxlint npm package Total serialized NAR size bucket=total
sizeKind=nar
151.7 MiB 151.7 MiB +0 B 0% 0.00x
missing_baseline missing_baseline Dev shell Shell eval with OTEL trace aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=1
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c
pairedSampleCount=1
phase=warm
probe=shell_eval_traced
probeLabel=Shell eval with OTEL trace
sampleCount=2
status=0
warmupCount=0
n/a 117.078 s n/a n/a n/a
Previous runs
Commit Status Gate Top changes
a8bb2d9 partial advisory Too small to matter Megarepo package Total closure size +2 KiB / 0%
Slightly higher, ok Megarepo package Total serialized NAR size +2 KiB / 0%
Too small to matter Dev shell Forced check:quick +0.192 s / 1.1%
055615e partial advisory Slightly lower, ok Dev shell Genie check task -0.894 s / -12.7%
Too small to matter Megarepo package Total closure size +2 KiB / 0%
Slightly higher, ok Megarepo package Total serialized NAR size +2 KiB / 0%
3ec17fc partial advisory Too small to matter Megarepo package Total closure size +2 KiB / 0%
Slightly higher, ok Megarepo package Total serialized NAR size +2 KiB / 0%
Too small to matter Dev shell Forced check:quick -0.252 s / -1.7%
2428b38 partial advisory Too small to matter Dev shell Warm cached check:quick -0.042 s / -0.5%
Slightly lower, ok Dev shell Warm shell eval -0.226 s / -2.3%
Too small to matter Megarepo package Total closure size +2 KiB / 0%
086dc06 partial advisory Slightly lower, ok Dev shell Warm cached check:quick -0.613 s / -6.4%
Slightly higher, ok Dev shell Genie check task +0.147 s / 3.1%
Too small to matter Megarepo package Total closure size +2 KiB / 0%
Source-of-truth JSON
{
  "schemaVersion": 1,
  "title": "CI Measurements",
  "status": "partial",
  "gate": "advisory",
  "readiness": "partial (17/26 enabled observations gateable)",
  "commit": {
    "shortSha": "0121708",
    "sha": "0121708c89b3b64fce49f0eefe89abdfcd99ded0"
  },
  "run": {
    "id": "32564330286",
    "attempt": "1",
    "url": "https://github.com/overengineeringstudio/effect-utils/actions/runs/32564330286"
  },
  "baseline": null,
  "protocol": "devenv-perf-warm-median-v2",
  "chart": {
    "meaning": "semantic-impact",
    "zeroImpactMeaning": "no actionable PR impact after budgets, noise floor, and robust evidence checks",
    "svg": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-1099/0121708c89b3b64fce49f0eefe89abdfcd99ded0/run-32564330286-attempt-1/ci-measurements.svg",
    "lightPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-1099/0121708c89b3b64fce49f0eefe89abdfcd99ded0/run-32564330286-attempt-1/ci-measurements.png",
    "darkPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-1099/0121708c89b3b64fce49f0eefe89abdfcd99ded0/run-32564330286-attempt-1/ci-measurements-dark.png"
  },
  "measurements": [
    {
      "id": "task_check_quick_forced",
      "label": "Forced check:quick",
      "group": "devenv / quality gates",
      "path": [
        "devenv",
        "quality gates",
        "check:quick"
      ],
      "groupPath": [
        "devenv",
        "quality gates"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "paired_uncertain",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 17.046,
      "current": 22.078,
      "delta": 5.032,
      "ratio": 1.2952012202276193,
      "semanticImpactScore": 0.08213070515076856,
      "semanticImpactKind": "below_warn_boundary",
      "baselineSources": 3,
      "currentSamples": 3,
      "pairedSamples": 3,
      "evidenceDeltaLower": 0.21,
      "evidenceDeltaUpper": 3.025,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "workload": "forced-task-cache",
        "taskCacheMode": "refresh",
        "probe": "task_check_quick_forced",
        "probeLabel": "Forced check:quick",
        "status": 0,
        "sampleCount": 6,
        "warmupCount": 0,
        "measuredSampleCount": 3,
        "pairedSampleCount": 3,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "nix.closure.nar_size",
      "label": "Total closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "total",
        "closure-size",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 174113880,
      "current": 174115928,
      "delta": 2048,
      "ratio": 1.0000117624166436,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10483712,
      "evidenceDeltaUpper": 10487808,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.serialized_nar_size",
      "label": "Total serialized NAR size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "total",
        "serialized-nar-size",
        "nix closure diagnostics"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 174113880,
      "current": 174115928,
      "delta": 2048,
      "ratio": 1.0000117624166436,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -17409340,
      "evidenceDeltaUpper": 17413436,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "id": "source.lines",
      "label": "Genie CI workflow helpers lines",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "genie",
        "ci-workflow",
        "source / ci"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 8374.5,
      "current": 8863,
      "delta": 488.5,
      "ratio": 1.0583318407069078,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 6,
      "currentSamples": 11,
      "pairedSamples": 0,
      "evidenceDeltaLower": -348.95000000000005,
      "evidenceDeltaUpper": 1325.95,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_ci_workflow"
      }
    },
    {
      "id": "source.lines",
      "label": "Genie runtime lines",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "packages",
        "genie",
        "source / genie"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 27507.5,
      "current": 27636,
      "delta": 128.5,
      "ratio": 1.0046714532400254,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 6,
      "currentSamples": 95,
      "pairedSamples": 0,
      "evidenceDeltaLower": -2622.25,
      "evidenceDeltaUpper": 2879.25,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_runtime"
      }
    },
    {
      "id": "source.files",
      "label": "Genie CI workflow helpers files",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "genie",
        "ci-workflow",
        "source / ci"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 10.5,
      "current": 11,
      "delta": 0.5,
      "ratio": 1.0476190476190477,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 6,
      "currentSamples": 11,
      "pairedSamples": 0,
      "evidenceDeltaLower": -0.55,
      "evidenceDeltaUpper": 1.55,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_ci_workflow"
      }
    },
    {
      "id": "genie_check_task",
      "label": "Genie check task",
      "group": "devenv / genie",
      "path": [
        "devenv",
        "genie"
      ],
      "groupPath": [
        "devenv",
        "genie"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 4.56,
      "current": 4.699,
      "delta": 0.13900000000000023,
      "ratio": 1.030482456140351,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": 0.032,
      "evidenceDeltaUpper": 0.078,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "genie_check_task",
        "probeLabel": "Genie check task",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "task_pnpm_install",
      "label": "pnpm install task",
      "group": "devenv / workspace setup",
      "path": [
        "devenv",
        "workspace setup"
      ],
      "groupPath": [
        "devenv",
        "workspace setup"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.966,
      "current": 0.86,
      "delta": -0.10599999999999998,
      "ratio": 0.8902691511387164,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.069,
      "evidenceDeltaUpper": -0.013,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "task_pnpm_install",
        "probeLabel": "pnpm install task",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "task_genie_run",
      "label": "Genie run task",
      "group": "devenv / genie",
      "path": [
        "devenv",
        "genie"
      ],
      "groupPath": [
        "devenv",
        "genie"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 1.804,
      "current": 1.784,
      "delta": -0.020000000000000018,
      "ratio": 0.9889135254988913,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.04,
      "evidenceDeltaUpper": 0.046,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "task_genie_run",
        "probeLabel": "Genie run task",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "task_check_quick_warm",
      "label": "Warm cached check:quick",
      "group": "devenv / quality gates",
      "path": [
        "devenv",
        "quality gates",
        "check:quick"
      ],
      "groupPath": [
        "devenv",
        "quality gates"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 8.175,
      "current": 8.182,
      "delta": 0.006999999999999673,
      "ratio": 1.0008562691131497,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.157,
      "evidenceDeltaUpper": 0.051,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "workload": "cached-no-op",
        "taskCacheMode": "warm",
        "probe": "task_check_quick_warm",
        "probeLabel": "Warm cached check:quick",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "shell_eval_warm",
      "label": "Warm shell eval",
      "group": "devenv / devenv shell",
      "path": [
        "devenv",
        "devenv shell"
      ],
      "groupPath": [
        "devenv",
        "devenv shell"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 8.354,
      "current": 8.359,
      "delta": 0.005000000000000782,
      "ratio": 1.000598515681111,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.02,
      "evidenceDeltaUpper": 0.017,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "shell_eval_warm",
        "probeLabel": "Warm shell eval",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "tasks_list",
      "label": "devenv tasks list",
      "group": "devenv / devenv cli",
      "path": [
        "devenv",
        "devenv cli"
      ],
      "groupPath": [
        "devenv",
        "devenv cli"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.04,
      "current": 0.042,
      "delta": 0.0020000000000000018,
      "ratio": 1.05,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 9,
      "evidenceDeltaLower": -0.001,
      "evidenceDeltaUpper": 0.001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "tasks_list",
        "probeLabel": "devenv tasks list",
        "status": 0,
        "sampleCount": 19,
        "warmupCount": 1,
        "measuredSampleCount": 9,
        "pairedSampleCount": 9,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "processes_help",
      "label": "devenv processes --help",
      "group": "devenv / devenv cli",
      "path": [
        "devenv",
        "devenv cli"
      ],
      "groupPath": [
        "devenv",
        "devenv cli"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.02,
      "current": 0.021,
      "delta": 0.0010000000000000009,
      "ratio": 1.05,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 9,
      "evidenceDeltaLower": -0.001,
      "evidenceDeltaUpper": 0.002,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "processes_help",
        "probeLabel": "devenv processes --help",
        "status": 0,
        "sampleCount": 19,
        "warmupCount": 1,
        "measuredSampleCount": 9,
        "pairedSampleCount": 9,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "source.files",
      "label": "Genie runtime files",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "packages",
        "genie",
        "source / genie"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 95,
      "current": 95,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 6,
      "currentSamples": 95,
      "pairedSamples": 0,
      "evidenceDeltaLower": -9.5,
      "evidenceDeltaUpper": 9.5,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_runtime"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Nix sources closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "buckets",
        "nix-sources",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "nix-sources"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Nix sources closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "buckets",
        "nix-sources",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "nix-sources"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Nix sources closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "buckets",
        "nix-sources",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "nix-sources"
      }
    },
    {
      "id": "source.files",
      "label": "Nix workspace tools files",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "nix",
        "workspace-tools",
        "source / nix"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 16,
      "current": 16,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 6,
      "currentSamples": 16,
      "pairedSamples": 0,
      "evidenceDeltaLower": -1.6,
      "evidenceDeltaUpper": 1.6,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "nix_workspace_tools"
      }
    },
    {
      "id": "source.lines",
      "label": "Nix workspace tools lines",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "nix",
        "workspace-tools",
        "source / nix"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 4291,
      "current": 4291,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 6,
      "currentSamples": 16,
      "pairedSamples": 0,
      "evidenceDeltaLower": -429.1,
      "evidenceDeltaUpper": 429.1,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "nix_workspace_tools"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Node / pnpm closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "buckets",
        "node",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "node"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Node / pnpm closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "buckets",
        "node",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "node"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Node / pnpm closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "buckets",
        "node",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "node"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Rust closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "buckets",
        "rust",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "rust"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Rust closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "buckets",
        "rust",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "rust"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Rust closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "buckets",
        "rust",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "rust"
      }
    },
    {
      "id": "nix.closure.path_count",
      "label": "Total closure path count",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "total",
        "path-count",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 83,
      "current": 83,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.path_count",
      "label": "Total closure path count",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "total",
        "path-count",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 5,
      "current": 5,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.path_count",
      "label": "Total closure path count",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "total",
        "path-count",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 8,
      "current": 8,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.nar_size",
      "label": "Total closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "total",
        "closure-size",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 612328280,
      "current": 612328280,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -12246565.6,
      "evidenceDeltaUpper": 12246565.6,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.nar_size",
      "label": "Total closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "total",
        "closure-size",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 159040112,
      "current": 159040112,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.serialized_nar_size",
      "label": "Total serialized NAR size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "total",
        "serialized-nar-size",
        "nix closure diagnostics"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 612328280,
      "current": 612328280,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -61232828,
      "evidenceDeltaUpper": 61232828,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "id": "nix.closure.serialized_nar_size",
      "label": "Total serialized NAR size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "total",
        "serialized-nar-size",
        "nix closure diagnostics"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 159040112,
      "current": 159040112,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 6,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -15904011.200000001,
      "evidenceDeltaUpper": 15904011.200000001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "id": "shell_eval_traced",
      "label": "Shell eval with OTEL trace",
      "group": "devenv / devenv shell",
      "path": [
        "devenv",
        "devenv shell"
      ],
      "groupPath": [
        "devenv",
        "devenv shell"
      ],
      "status": "missing_baseline",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "missing_baseline",
      "comparisonMode": "historical",
      "unit": "seconds",
      "baseline": null,
      "current": 117.078,
      "delta": null,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": null,
      "baselineSources": 0,
      "currentSamples": 1,
      "pairedSamples": null,
      "evidenceDeltaLower": null,
      "evidenceDeltaUpper": null,
      "pairedEvidenceQuantile": null,
      "dimensions": {
        "probe": "shell_eval_traced",
        "probeLabel": "Shell eval with OTEL trace",
        "status": 0,
        "sampleCount": 2,
        "warmupCount": 0,
        "measuredSampleCount": 1,
        "pairedSampleCount": 1,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "32564330286-1-bfdf965a00686308c6b10f62f8c6a9e04a6c8a3c",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    }
  ]
}

github-actions Bot added a commit that referenced this pull request Aug 21, 2026
…tion

Review fixes (Codex P2s on #1099):
- mentions: infer type from keys for type-less authored envelopes; never
  double-prefix '@' when plainText already carries it; read href from item
  level (response shape)
- code fences: lengthen fence past embedded backtick runs (CommonMark)
- callouts: diagnose external icon drops instead of fabricating default icon
- toggleable headings: emit color-dropped before the early return

VRS foundation:
- requirements.md: A11 (offline fidelity reference), T10 (two spelling
  tables), R31-R36 projection constraint group
- ontology.md: Language layer (projection/body/diagnostic/dialect/envelope,
  sync-vs-project leitwort) + structure diagram
- spec section now traceable to R31-R36

User-facing docs:
- concepts/markdown-projection.md: mental model, diagnostics table,
  fidelity matrix, .nmd composition
- api.md: entry point + result shape
- README.md: integrator reading path

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2428b3836b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
Missed in the initial lockfile-driven sweep; caught by CI nix-fod-check
with the corrected hash printed in the job log.
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
- escape authored Markdown metacharacters in literal text runs (inline
  set + line-initial block markers) so '<Paragraph># literal</Paragraph>'
  stays a paragraph; $ deliberately left bare (documented)
- preserve annotation frames wrapping mentions and inline equations
  (flattenRichText bakes them onto the item); color drops diagnosed
- render span-array ChildPage titles from the normalized node.title
  spans instead of substituting Untitled
- diagnose has_row_header loss (no GFM spelling)
- diagnose empty toggleable headings (toggle affordance lost regardless
  of children)
- report root <Page> metadata omission (belongs to .nmd envelope/page
  properties), keeping the projection loss-accounted per R33

27 module tests green; fidelity matrix updated in concepts doc.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 055615e0a9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
github-actions Bot added a commit that referenced this pull request Aug 21, 2026
- inline code: serialize from raw content with a delimiter run strictly
  longer than any embedded backticks (CommonMark renders backslashes
  literally inside code spans, so escaped cores displayed stray
  backslashes); padded when content starts/ends with a backtick
- mentions without plainText: fall back to typed labels (@user/@page/
  @database); href-less page/database mentions resolve a deterministic
  notion.so/<id> link offline so authored identity survives
- metadata-free <Page> wrappers no longer emit the root-metadata
  diagnostic (buildCandidateTree records an empty rootPage object;
  diagnose only actual title/icon/cover fields)

30 module tests green; fidelity matrix updated.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a8bb2d991b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
- paragraphs with nested blocks now render the children as sibling
  blocks (blank-line separated) with a flattened diagnostic instead of
  dropping them silently
- list items (bulleted/numbered/to-do) insert a blank line before
  nested content so children parse as distinct blocks rather than lazy
  continuation of the item paragraph; quotes/callouts separate quoted
  children with a '>' line so they stay distinct paragraphs
- explicit color='default' on callouts/headings no longer emits
  color-dropped (nothing to lose; matches inline text behavior)

33 module tests green.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0121708c89

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
Comment thread packages/@overeng/notion-react/src/markdown/render-to-notion-markdown.ts Outdated
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
- callouts: absent icon stays absent instead of fabricating the default
  information icon; dead constant removed
- mentions: escape plainText before interpolating into link syntax so
  authored '[Q3]' / '*ops*' labels survive verbatim
- entity neutralization: escape ampersands that begin entity-like
  sequences (&copy;, &#35;, &#x..;) while leaving bare '&' untouched
- media captions: no second round of bracket escaping after
  renderRichText (doubled backslashes); bookmark URL-as-label fallback
  still escaped once
- tables: render each row exactly once so cell-level diagnostics are
  not duplicated across width/header/body derivation

37 module tests green.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7a0f461005

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

})

const withAnnotations = `${leading}${wrapped}${trailing}`
return item.text.link === null ? withAnnotations : `[${withAnnotations}](${item.text.link.url})`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Escape link destinations before emitting Markdown

When a valid href contains an unbalanced closing parenthesis, such as https://example.com/a)b, interpolating it directly produces [label](https://example.com/a)b), so the link ends early and part of the URL becomes visible text. Encode or safely angle-wrap Markdown destinations before interpolation; the same treatment should be applied consistently to the other URL-producing branches.

Useful? React with 👍 / 👎.

// length, so the fence must be strictly longer than any run inside.
const longestRun = Math.max(0, ...[...code.matchAll(/`+/g)].map((m) => m[0].length))
const fence = '`'.repeat(Math.max(3, longestRun + 1))
return `${fence}${typeof props.language === 'string' ? props.language : ''}\n${code}\n${fence}`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Avoid adding a blank line to newline-terminated code

When <Code> content already ends in \n, this template appends another newline before the closing fence. For example, authored "x\n" becomes a fenced block containing x followed by an extra empty line, changing the literal code content; add the separator only when the rendered code does not already end with a newline.

Useful? React with 👍 / 👎.

Comment on lines +233 to +235
if (item.type === 'text') return item.text.content
if (item.type === 'equation') return item.equation.expression
return typeof item.plain_text === 'string' ? item.plain_text : ''

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Diagnose annotations discarded inside code fences

When supported inline components such as <Bold>, <Color>, or <Link> occur inside <Code>, the candidate rich-text items retain those semantics, but this plain-text path discards every annotation and link without a diagnostic. Since fenced Markdown cannot preserve that formatting, emit a typed loss diagnostic rather than presenting this projection as lossless.

Useful? React with 👍 / 👎.

Comment on lines +282 to +288
return `[${label ?? 'Video'}](${url})`
case 'audio':
return `[${label ?? 'Audio'}](${url})`
case 'pdf':
return `[${label ?? 'PDF'}](${url})`
case 'file':
return `[${label ?? 'File'}](${url})`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Flatten linked captions before wrapping media links

When a video, audio, PDF, or file caption contains <Link>, renderRichText returns link syntax and this branch embeds it inside another link, for example [[source](caption-url)](video-url). Markdown does not support nested links, so parsers commonly preserve only the inner link and expose or misparse the outer syntax; flatten the caption link with a diagnostic or render the caption separately.

Useful? React with 👍 / 👎.

Comment on lines +106 to +108
case 'link_preview': {
const url = (mention.link_preview as { url?: unknown } | undefined)?.url
return typeof url === 'string' ? `[${plain}](${url})` : plain

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Give link-preview mentions a visible fallback

When an authored link_preview mention omits the optional plainText, this returns [](url), which has no visible label and effectively removes the mention from the rendered sentence. Fresh evidence beyond the earlier mention fallback fix is that only user/page/database mentions received fallbacks; use the preview URL or a typed label here as well.

Useful? React with 👍 / 👎.

Comment on lines +556 to +557
const md = renderNode({ node, ordinal, state: opts.state })
if (md !== '') out.push(md)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Diagnose empty paragraphs instead of dropping them

When the JSX contains an empty <Paragraph />, renderNode returns an empty fragment and this filter removes the block entirely, producing the same body and diagnostics as a document with no paragraph. Empty Notion paragraphs can represent deliberate blank blocks, so preserve a documented placeholder or emit a loss diagnostic instead of silently erasing them.

Useful? React with 👍 / 👎.

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.

notion-react: render JSX to Notion enhanced Markdown for previews and exports

2 participants