Skip to content

feat(notion-md): v-next frictionless, progressively-disclosed sync (#774)#775

Draft
schickling-assistant wants to merge 21 commits into
mainfrom
schickling/2026-06-10-756
Draft

feat(notion-md): v-next frictionless, progressively-disclosed sync (#774)#775
schickling-assistant wants to merge 21 commits into
mainfrom
schickling/2026-06-10-756

Conversation

@schickling-assistant

@schickling-assistant schickling-assistant commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator

Problem

PR #775 implemented the v-next notion-md sync core, but the long-term scope has grown into the integrated NotionMD + datasource workspace design captured in context/notion-db-markdown-sync. The PR should now land one coherent system rather than two competing local representations: .nmd page files for editor workflows, SQLite pages data files for tabular/scriptable workflows, hidden .notion/ sync-control state, first-class watch/dry-run, and shared property mutation semantics.

Goal

Land the full long-term VRS target end-to-end:

  • Preserve the completed track / status / sync NotionMD v-next core.
  • Make datasource workspaces feel like editing local .nmd and SQLite files.
  • Expose only data files and pages/**/*.nmd as intended user surfaces.
  • Move implementation control state into hidden .notion/ state.
  • Use pages as the canonical SQL user surface with no public rows table/view alias; internal row terminology may exist only as private planner language, not durable user API.
  • Materialize .nmd property descriptors by default as non-authoritative identity hints.
  • Share property semantics through @overeng/notion-effect-schema and a shared property-write core.
  • Ensure every write-capable command has dry-run semantics, including watch-style loops.
  • Keep watch first-class across NotionMD and datasource workspaces.
  • Use a clean-break v1 surface rather than preserving previous public surfaces.
  • Version durable workspace artifacts from v1: notion.workspace.v1.json, data/v1/<source>.sqlite, pages/v1/<source>/*.nmd, and .notion/v1/....

Completed Foundation

  • notion-md v-next public surface: track / status / sync; no public clone, plan, two-arg sync, or direction flags.
  • Required explicit source; no missing-source default.
  • Stateless Mirror Sync for source: local | remote.
  • Shared-only base snapshots and 3-way merge.
  • Dry-run for current NotionMD write-capable commands.
  • Watch through the v-next reconcile path with fake/live/OTEL coverage.
  • Public package surface exposes only the v-next sync helpers.
  • Datasource-sync NotionMD body adapter aligned with shared-state rules.
  • Cross-cutting VRS created for the integrated Notion DB Markdown Sync target.

Remaining Work Now In Scope

Phase 0 — VRS And Scope Lock

Dependency: none.

Tasks:

  • Finish VRS consistency pass across context/notion-db-markdown-sync, packages/@overeng/notion-md/docs/vrs, packages/@overeng/notion-datasource-sync/docs/vrs, and packages/@overeng/notion-effect-schema/docs.
  • Remove or reframe stale transition wording, row user-surface, _nds_* public-state, and previous replica-contract wording.
  • Lock and document the clean-break rule: v1 workspaces are explicitly version-namespaced; pages is the canonical user surface; public rows aliases, unversioned layouts, and alternate command paths are not supported.
  • Ensure protected VRS docs (vision.md, requirements.md) stay high-level/testable and that detailed sequencing lives only in PR/issue planning.

Acceptance criteria:

  • Every spec section traces to requirements.
  • No VRS doc presents two competing product contracts.
  • The PR body is the implementation epic; VRS remains timeless system design.

Primary file areas:

  • context/notion-db-markdown-sync/*
  • packages/@overeng/notion-md/docs/vrs/*
  • packages/@overeng/notion-datasource-sync/docs/vrs/**
  • packages/@overeng/notion-effect-schema/docs/*

Phase 1 — Shared Property Schema Foundation

Dependency: Phase 0 scope lock.

Tasks:

  • Add shared identity/descriptor schemas to @overeng/notion-effect-schema: data-source identity, property descriptors, schema/config descriptor hashes, and property identity evidence types.
  • Keep schema package boundary strict: values, codecs, descriptors, consistency checks, and write-class classification only; no authority modes, workspace convergence, outbox, conflicts, or live proof acquisition.
  • Re-export stable schema primitives from packages/@overeng/notion-effect-schema/src/mod.ts.
  • Add unit tests for descriptor decoding, canonical JSON stability, write-class consistency, and unsupported/computed/read-only classification.

Acceptance criteria:

  • NotionMD and datasource-sync can import one canonical property value/descriptor/write-class model.
  • No duplicated property descriptor type remains in higher packages except package-specific wrappers.
  • Schema package tests prove malformed descriptors and ambiguous write classes fail closed.

Primary file areas:

  • packages/@overeng/notion-effect-schema/src/properties/*
  • packages/@overeng/notion-effect-schema/src/property-schema.ts
  • packages/@overeng/notion-effect-schema/src/common.ts
  • packages/@overeng/notion-effect-schema/src/mod.ts

Phase 2 — .nmd Descriptor And Standalone Contract

Dependency: Phase 1 shared schemas.

Tasks:

  • Extend strict .nmd frontmatter decoding to accept default-materialized, non-authoritative property_descriptors.
  • Update NotionMD pull/track/materialization to emit compact descriptors by default when datasource parent/schema evidence is available.
  • Ensure descriptors are optional evidence: files without descriptors may still be handled if live/workspace proof can establish stable identity.
  • Preserve standalone .nmd validity for datasource page files.
  • Update file-format, CLI, sync-safety, and troubleshooting docs. (file-format done; cli/sync-safety/troubleshooting carry to Phase 5 CLI work)

Acceptance criteria:

  • A datasource page .nmd can be parsed by standalone notion-md.
  • Descriptor-bearing and descriptor-free files both have deterministic behavior.
  • Descriptors never contain freshness/base/outbox/settlement state.
  • Unknown descriptor fields are rejected unless deliberately modeled.

Primary file areas:

  • packages/@overeng/notion-effect-client/src/nmd.ts
  • packages/@overeng/notion-md/src/frontmatter.ts
  • packages/@overeng/notion-md/src/sync.ts
  • packages/@overeng/notion-md/docs/file-format.md

Phase 3 — Shared PropertyWriteCore And Proof Providers

Dependencies: Phases 1-2.

Tasks:

  • Introduce a shared property-write core that validates PropertyWriteProof and returns allow/block guard decisions.
  • Implement StandaloneLiveProofProvider for NotionMD: live schema read, page/property read, descriptor/name/property-id reconciliation, value consistency, and write-class validation.
  • Implement DatasourceWorkspaceProofProvider for datasource-sync: hidden state, local .nmd/SQLite convergence, relation availability, bases, outbox, conflicts, and settlement context.
  • Route NotionMD property patches and datasource-sync property plans through the shared core.
  • Add named guards: missing remote schema, ambiguous property identity, stale schema/config, unsupported/computed write class, incomplete property value, relation target unavailable, local surface disagreement, stale base, missing shared settlement context.

Acceptance criteria:

  • Safety is determined by proof, not by CLI entrypoint.
  • source: local standalone datasource property writes can proceed only with live proof.
  • source: shared datasource property writes require workspace proof.
  • source: remote local property mutation is reported as drift/refused by normal sync.
  • All guard cases have tests and human/actionable CLI messages.

Primary file areas:

  • shared property-write module under the selected package boundary
  • packages/@overeng/notion-md/src/sync.ts
  • packages/@overeng/notion-md/src/live.ts
  • packages/@overeng/notion-datasource-sync/src/planner/*
  • packages/@overeng/notion-datasource-sync/src/sync/*

Phase 4 — Datasource Workspace User Surface

Dependencies: Phases 0-3.

Tasks:

  • Redesign public SQLite export around clean-break v1 pages, plus read-only changes, conflicts, sync_status, schema, and debug_* surfaces.
  • Move private sync-control state out of the public data file into hidden .notion/v1/ state; do not expose alternate public table names or unversioned layouts.
  • Update workspace layout for single-source and multi-source projects: notion.workspace.v1.json, data/v1/<source>.sqlite, pages/v1/<source>/*.nmd, and .notion/v1/.
  • Ensure each tracked data source owns exactly one data file and one page directory.
  • Keep linked views as read-only projections/query contexts, not writable owners.
  • Implement local convergence across SQLite pages and pages/**/*.nmd before remote planning.

Acceptance criteria:

  • Users can edit either SQLite pages or .nmd properties/bodies and get one accepted local intent.
  • Same desired local fact coalesces; divergent local facts produce a local conflict before remote mutation.
  • Hidden .notion/v1 state is not part of the public data-file contract; public data files expose no _nds_* tables and no public rows alias.
  • Multi-source workspaces cannot accidentally mix authority modes; authority mode is persisted once per workspace manifest, not supplied per sync run.

Primary file areas:

  • packages/@overeng/notion-datasource-sync/src/replica/replica.ts
  • packages/@overeng/notion-datasource-sync/src/store/*
  • packages/@overeng/notion-datasource-sync/src/local/*
  • packages/@overeng/notion-datasource-sync/src/planner/*
  • packages/@overeng/notion-datasource-sync/src/export/replica-export.ts

Phase 5 — CLI, Dry-Run, And Watch Semantics

Dependencies: Phases 3-4.

Tasks:

  • Align datasource-sync commands with the minimal surface and integrated workspace vocabulary.
  • Establish authority mode through track --mode local|remote|shared in notion.workspace.v1.json; established sync, status, export, doctor, and watch commands must not accept per-run mode overrides.
  • Ensure every write-capable command supports dry-run with no durable Notion, filesystem, SQLite public data file, hidden-state, outbox, settlement, or object-store mutation.
  • Define and implement sync --watch --dry-run as observe/plan/report loops with suppressed durable effects.
  • Keep watch first-class in all authority modes, with guarantees following local, remote, or shared.
  • Preserve NotionMD track / status / sync as the body/page-file mental model and avoid adding alternate verbs.

Acceptance criteria:

  • CLI help/docs show one coherent model, with no sync --mode override on established workspaces.
  • Dry-run assertions cover filesystem, public SQLite, hidden .notion, object store, outbox, settlement, and Notion write suppression.
  • Watch tests cover cancellation, coalescing, local and remote triggers, repeated dry-run planning, and no overlapping unsafe passes.

Primary file areas:

  • packages/@overeng/notion-md/src/cli-program.ts
  • packages/@overeng/notion-datasource-sync/src/cli/main.ts
  • packages/@overeng/notion-datasource-sync/src/daemon/watch.ts
  • docs under both packages

Phase 6 — Non-Body Surfaces And Object Lifecycle

Dependencies: Phases 2, 5.

Tasks:

  • Implement the v1 files/media boundary: object-store refs, volatile URL exclusion, preservation, external URL attach where proven, durable byte upload/replacement/delete fail-closed guards, and dry-run behavior.
  • Implement the v1 comments boundary: comment writes are out of scope; local review markup and Notion comments stay distinct; unsupported comment writes emit named guards and dry-run-visible diagnostics.
  • Finalize destructive body modes: unknown-block deletion and Roughdraft review-markup behavior remain explicit, observable, and dry-run-covered.
  • Implement object-store reachable-object validation and GC planning/deletion via explicit flag.

Acceptance criteria:

  • Non-body surfaces cannot be silently dropped by normal sync.
  • File/comment/destructive boundaries emit named guards and spans.
  • Object GC has dry-run and mutation tests.

Primary file areas:

  • packages/@overeng/notion-md/src/storage-policy.ts
  • packages/@overeng/notion-md/src/state-store.ts
  • packages/@overeng/notion-md/src/reconcile.ts
  • packages/@overeng/notion-effect-client/src/files.ts
  • packages/@overeng/notion-effect-client/src/comments.ts

Phase 7 — Webhook Trigger Integration

Dependencies: Phase 5 watch scheduler.

Tasks:

  • Implement webhook payload schemas through Effect Schema for package-local dirty-hint intake.
  • Feed webhook dirty hints into the same watch/reconcile scheduler as polling and filesystem events, always followed by fresh reads before planning.
  • Keep subscription provisioning and hosted receiver lifecycle outside this PR; the package surface accepts decoded dirty hints rather than owning deployment lifecycle.
  • Add OTEL spans that distinguish dirty-hint intake from CLI/watch reconciliation without making webhooks a correctness source.

Acceptance criteria:

  • Webhook-hint-triggered passes share the same fresh-read correctness path as one-shot sync and polling watch.
  • Invalid/malformed webhook hint payloads fail closed without mutating local or remote state.
  • Tests prove coalescing, cancellation, and scoped lifecycle.

Primary file areas:

  • packages/@overeng/notion-md/src/webhook.ts
  • packages/@overeng/notion-datasource-sync/src/webhook/*
  • watch/daemon orchestration modules

Phase 8 — E2E Test Architecture And Verification Matrix

Dependencies: all implementation phases, but test scaffolding can begin after Phase 1.

Tasks:

  • Build a layered E2E matrix: pure unit, fake service, SQLite contract, filesystem workspace, daemon/watch, CLI black-box, OTEL assertions, live Notion synthetic workspace, and downstream integration.
  • Add scenario IDs that trace VRS requirements and guard names to test cases.
  • Cover descriptor materialization, proof-based property mutation, local surface convergence, clean-break pages SQL surface, hidden control-plane isolation, versioned workspace namespace, dry-run suppression, watch guarantees, multi-source workspaces, linked-view projection behavior, relation identity, file/comment/destructive guards, and object GC.
  • Keep live tests synthetic, allowlisted, cleanup-ledger-backed, and safe for a public repository.

Acceptance criteria:

  • Every named guard has at least one test at the cheapest sufficient layer.
  • Every user-visible workflow has at least one CLI or E2E test.
  • Live Notion tests cover API semantics that fake gateways cannot prove.
  • devenv tasks run check:quick --no-tui and devenv tasks run check:all --no-tui pass before handoff.

Primary file areas:

  • packages/@overeng/notion-md/src/*.test.ts
  • packages/@overeng/notion-md/src/*.e2e.test.ts
  • packages/@overeng/notion-datasource-sync/src/e2e/*
  • packages/@overeng/notion-datasource-sync/src/testing/*
  • packages/@overeng/notion-effect-schema/src/*.unit.test.ts

Decisions

  • Clean v1 workspace: durable artifacts are versioned from v1 (notion.workspace.v1.json, data/v1, pages/v1, .notion/v1); unknown or mixed namespaces fail closed.
  • Small user surface: users edit only SQLite pages and pages/v1/**/*.nmd; hidden sync state stays under .notion/v1; no public rows, _nds_*, sidecars, or alternate aliases.
  • Authority model: track --mode local|remote|shared establishes one workspace-wide mode; established commands read it and never accept per-run --mode.
  • Local composition: SQLite and .nmd are peer user surfaces, but not peer authorities; shared mode converges both locally before remote planning and conflicts on divergent local facts.
  • Standalone interop: datasource page files remain valid NotionMD .nmd; property descriptors are optional identity hints, not freshness, base, outbox, convergence, or settlement proof.
  • Property mutation: property writes are proof-based and entrypoint-neutral, using shared schema/descriptor/write-class semantics plus live or workspace proof providers.
  • Views and relations: linked views are read-only projections; relations use canonical page identity plus owning tracked source, with paths/titles as hints only.
  • Write boundaries: schema mutation is explicit-command-only; files support only proven external URL attachment; byte uploads/replacement/delete, comment writes, untracked relation lookup, and writable debug views fail closed in v1.
  • Watch and dry-run: watch is first-class in all modes, but only shared --watch promises the full durable bidirectional control plane; every write-capable command has true no-write dry-run semantics.
  • External signals: webhooks are dirty hints followed by fresh reads; hosted receiver/subscription lifecycle and Notion Workers are not correctness sources for local sync.

Dependency Order

  1. VRS/scope lock.
  2. Shared property schemas and descriptors.
  3. .nmd descriptor file-format support.
  4. Shared property-write core and proof providers.
  5. Datasource workspace/public surface convergence.
  6. CLI dry-run/watch semantics.
  7. Non-body surfaces and object lifecycle.
  8. Webhook trigger integration.
  9. Full verification and docs sweep.

E2E Test Architecture Proposal

Use a capability-layered matrix instead of one giant live suite:

Layer Purpose Examples
L0 pure unit schema/hash/guard determinism descriptor codecs, write-class consistency, canonical values
L1 fake services control-flow without IO flakiness proof-provider allow/block, sync decisions, dry-run suppression
L2 SQLite contract public/private data boundary pages surface, hidden state isolation, projection rebuild
L3 filesystem workspace real local file behavior .nmd materialization, path claims, object refs, local deletes
L4 CLI black-box actual user surface track, status, sync, datasource sync commands, JSON output
L5 daemon/watch long-running semantics coalescing, cancellation, dry-run watch, restart/lease behavior
L6 live Notion API semantics only real Notion proves property schema drift, relation completeness, files/comments capability, read-after-write settlement
L7 downstream integration package composition NotionMD body adapter, datasource workspace using .nmd files

Rule: test each invariant at the cheapest layer that can prove it, and use live Notion only where the API itself is the subject.

Current Verification Baseline

Already completed before the scope expansion:

  • devenv tasks run check:all --no-tui — passed on the completed v-next sync core.
  • Live Notion notion-md suite — passed, including watch.
  • Fake/local notion-md suite — passed.
  • Downstream datasource-sync body adapter E2E — passed.

The integrated workspace scope now needs fresh verification after implementation.

References

Closes #774.
Refs #756.

Posted on behalf of @schickling
field value
agent_name 🥣 cl1-basin
agent_session_id d8c9b009-8256-4b1f-986a-dbeeae38db7a
agent_tool Claude Code
agent_tool_version 2.1.165
agent_runtime Claude Code 2.1.165
agent_model claude-opus-4-8
runtime_profile /nix/store/4p78dsfk8riqcgk91zzjlgraibyf1hd4-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/cly1vi1qvxfyk37gmdk4qw4j33zrfpny-agent-skills-corpus/share/agent-skills/manifest.json
worktree effect-utils/schickling/2026-06-10-756
machine dev3
tooling_profile dotfiles@e7e383b

@github-actions

github-actions Bot commented Jun 10, 2026

Copy link
Copy Markdown

Storybook Previews

No storybooks were deployed.

github-actions Bot added a commit that referenced this pull request Jun 10, 2026
github-actions Bot added a commit that referenced this pull request Jun 10, 2026
@github-actions

github-actions Bot commented Jun 10, 2026

Copy link
Copy Markdown

CI Measurements

partial - advisory gate - readiness partial (17/26 enabled observations gateable) - commit b2a645f - 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

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=21, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=21, current n=1
Unchanged / 0-impact measurements (17)

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 processes --help 0.017 s -> 0.017 s +0 s / 0% 0.00x yes paired n=9, 25-75% delta -0.001 s..0.001 s Too small to matter
devenv / devenv cli devenv tasks list 0.038 s -> 0.038 s +0 s / 0% 0.00x yes paired n=9, 25-75% delta -0.001 s..0.001 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 1.862 s -> 1.871 s +0.009 s / 0.5% 0.00x yes paired n=5, 25-75% delta -0.021 s..0.015 s Too small to matter

devenv / genie

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / genie Genie run task 1.134 s -> 1.124 s -0.01 s / -0.9% 0.00x yes paired n=5, 25-75% delta -0.024 s..0.011 s Too small to matter
devenv / genie Genie check direct 5.696 s -> 5.705 s +0.009 s / 0.2% 0.00x yes paired n=5, 25-75% delta -0.025 s..0.014 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 3.416 s -> 3.186 s -0.23 s / -6.7% 0.00x yes paired n=5, 25-75% delta -4.623 s..-0.074 s Unchanged
devenv / quality gates Forced check:quick 12.716 s -> 12.75 s +0.034 s / 0.3% 0.00x yes paired n=3, 25-75% delta -0.035 s..0.034 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.631 s -> 0.611 s -0.02 s / -3.2% 0.00x yes paired n=5, 25-75% delta -0.025 s..-0.012 s Too small to matter

nix / closures / packages

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
nix / closures / packages Total closure size 535.4 MiB -> 535.9 MiB +535.7 KiB / 0.1% 0.00x yes noise_floor, baseline n=21, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 535.4 MiB -> 535.9 MiB +535.7 KiB / 0.1% 0.00x yes within_budget, baseline n=20, current n=1 Slightly higher, ok
nix / closures / packages Total closure size 144.4 MiB -> 144.4 MiB +60 KiB / 0% 0.00x yes noise_floor, baseline n=21, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 144.4 MiB -> 144.4 MiB +60 KiB / 0% 0.00x yes within_budget, baseline n=20, current n=1 Slightly higher, ok
nix / closures / packages Total closure size 156.3 MiB -> 156.3 MiB +9.8 KiB / 0% 0.00x yes noise_floor, baseline n=21, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 156.3 MiB -> 156.3 MiB +9.8 KiB / 0% 0.00x yes within_budget, baseline n=20, current n=1 Slightly higher, ok
nix / closures / packages Total closure path count 79 count -> 79 count +0 count / 0% 0.00x yes noise_floor, baseline n=21, 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=21, 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=21, 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 runtime lines 20266 lines 19809 lines diagnostic disabled Diagnostic only diagnostic, baseline n=22, current n=67
source / effect-utils Genie CI workflow helpers lines 7418 lines 7318 lines diagnostic disabled Diagnostic only diagnostic, baseline n=22, current n=9
source / effect-utils Genie runtime files 67 count 66 count diagnostic disabled Diagnostic only diagnostic, baseline n=22, current n=67
source / effect-utils Nix workspace tools lines 3632 lines 3631.5 lines diagnostic disabled Diagnostic only diagnostic, baseline n=22, current n=14
source / effect-utils Genie CI workflow helpers files 9 count 9 count diagnostic disabled Diagnostic only diagnostic, baseline n=22, current n=9
source / effect-utils Nix workspace tools files 14 count 14 count diagnostic disabled Diagnostic only diagnostic, baseline n=22, current n=14

devenv / devenv shell

Group Probe Current Baseline Impact Gate Reason Evidence
devenv / devenv shell Shell eval with OTEL trace 24.249 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 Genie package Total closure size bucket=total 535.4 MiB 535.9 MiB +535.7 KiB 0.1% 0.00x
pass yes Genie package Total serialized NAR size bucket=total
sizeKind=nar
535.4 MiB 535.9 MiB +535.7 KiB 0.1% 0.00x
pass yes Megarepo package Total closure size bucket=total 144.4 MiB 144.4 MiB +60 KiB 0% 0.00x
pass yes Megarepo package Total serialized NAR size bucket=total
sizeKind=nar
144.4 MiB 144.4 MiB +60 KiB 0% 0.00x
pass yes oxlint npm package Total closure size bucket=total 156.3 MiB 156.3 MiB +9.8 KiB 0% 0.00x
pass yes oxlint npm package Total serialized NAR size bucket=total
sizeKind=nar
156.3 MiB 156.3 MiB +9.8 KiB 0% 0.00x
pass disabled effect-utils repository Genie runtime lines scope=genie_runtime 19809 lines 20266 lines +457 lines 2.3% diagnostic
pass disabled effect-utils repository Genie CI workflow helpers lines scope=genie_ci_workflow 7318 lines 7418 lines +100 lines 1.4% diagnostic
pass disabled effect-utils repository Genie runtime files scope=genie_runtime 66 count 67 count +1 count 1.5% diagnostic
pass disabled effect-utils repository Nix workspace tools lines scope=nix_workspace_tools 3631.5 lines 3632 lines +0.5 lines 0% diagnostic
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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
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
3.416 s 3.186 s -0.23 s -6.7% 0.00x
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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
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
12.716 s 12.75 s +0.034 s 0.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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=5
phase=warm
probe=task_pnpm_install
probeLabel=pnpm install task
sampleCount=11
status=0
warmupCount=1
0.631 s 0.611 s -0.02 s -3.2% 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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=5
phase=warm
probe=task_genie_run
probeLabel=Genie run task
sampleCount=11
status=0
warmupCount=1
1.134 s 1.124 s -0.01 s -0.9% 0.00x
pass yes Dev shell Genie check direct aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=5
phase=warm
probe=genie_check_direct
probeLabel=Genie check direct
sampleCount=11
status=0
warmupCount=1
5.696 s 5.705 s +0.009 s 0.2% 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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=5
phase=warm
probe=shell_eval_warm
probeLabel=Warm shell eval
sampleCount=11
status=0
warmupCount=1
1.862 s 1.871 s +0.009 s 0.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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=9
phase=warm
probe=processes_help
probeLabel=devenv processes --help
sampleCount=19
status=0
warmupCount=1
0.017 s 0.017 s +0 s 0% 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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=9
phase=warm
probe=tasks_list
probeLabel=devenv tasks list
sampleCount=19
status=0
warmupCount=1
0.038 s 0.038 s +0 s 0% 0.00x
pass disabled effect-utils repository Genie CI workflow helpers files scope=genie_ci_workflow 9 count 9 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 14 count 14 count +0 count 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 79 count 79 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
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=27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29
pairedSampleCount=1
phase=warm
probe=shell_eval_traced
probeLabel=Shell eval with OTEL trace
sampleCount=2
status=0
warmupCount=0
n/a 24.249 s n/a n/a n/a
Previous runs
Commit Status Gate Top changes
0b0df25 partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
bd17541 partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
3e63b4b partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
4f94680 partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
dcafcb2 partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
843d54f partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
e3edd53 partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
cfa2108 partial advisory Slightly higher, ok Dev shell Warm shell eval +0.386 s / 17.7%
Slightly lower, ok Dev shell Genie check direct -0.109 s / -1.9%
Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
ca6d644 partial advisory Too small to matter Genie package Total closure size +535.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +535.7 KiB / 0.1%
Too small to matter Megarepo package Total closure size +60 KiB / 0%
8a7a1c0 partial advisory Too small to matter Genie package Total closure size +487.7 KiB / 0.1%
Slightly higher, ok Genie package Total serialized NAR size +487.7 KiB / 0.1%
Too small to matter oxlint npm package Total closure size +4.9 KiB / 0%
Source-of-truth JSON
{
  "schemaVersion": 1,
  "title": "CI Measurements",
  "status": "partial",
  "gate": "advisory",
  "readiness": "partial (17/26 enabled observations gateable)",
  "commit": {
    "shortSha": "b2a645f",
    "sha": "b2a645fbe18885d24b3f7418e17cbdf4eafea9af"
  },
  "run": {
    "id": "27512898824",
    "attempt": "1",
    "url": "https://github.com/overengineeringstudio/effect-utils/actions/runs/27512898824"
  },
  "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-775/b2a645fbe18885d24b3f7418e17cbdf4eafea9af/run-27512898824-attempt-1/ci-measurements.svg",
    "lightPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-775/b2a645fbe18885d24b3f7418e17cbdf4eafea9af/run-27512898824-attempt-1/ci-measurements.png",
    "darkPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-775/b2a645fbe18885d24b3f7418e17cbdf4eafea9af/run-27512898824-attempt-1/ci-measurements-dark.png"
  },
  "measurements": [
    {
      "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": 561373688,
      "current": 561922280,
      "delta": 548592,
      "ratio": 1.0009772314088223,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 21,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10678881.76,
      "evidenceDeltaUpper": 11776065.76,
      "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": "regressed",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 561373688,
      "current": 561922280,
      "delta": 548592,
      "ratio": 1.0009772314088223,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 20,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -55588776.800000004,
      "evidenceDeltaUpper": 56685960.800000004,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "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": 151364760,
      "current": 151426200,
      "delta": 61440,
      "ratio": 1.000405906896691,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 21,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10424320,
      "evidenceDeltaUpper": 10547200,
      "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": 151364760,
      "current": 151426200,
      "delta": 61440,
      "ratio": 1.000405906896691,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 20,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -15075036,
      "evidenceDeltaUpper": 15197916,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "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": 163874192,
      "current": 163884208,
      "delta": 10016,
      "ratio": 1.0000611200572693,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 21,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10475744,
      "evidenceDeltaUpper": 10495776,
      "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",
        "oxlint-npm",
        "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": 163874192,
      "current": 163884208,
      "delta": 10016,
      "ratio": 1.0000611200572693,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 20,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -16377403.200000001,
      "evidenceDeltaUpper": 16397435.200000001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "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": 19809,
      "current": 20266,
      "delta": 457,
      "ratio": 1.023070321571003,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 22,
      "currentSamples": 67,
      "pairedSamples": 0,
      "evidenceDeltaLower": -1523.9,
      "evidenceDeltaUpper": 2437.9,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_runtime"
      }
    },
    {
      "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": 7318,
      "current": 7418,
      "delta": 100,
      "ratio": 1.0136649357748018,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 22,
      "currentSamples": 9,
      "pairedSamples": 0,
      "evidenceDeltaLower": -631.8000000000001,
      "evidenceDeltaUpper": 831.8000000000001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_ci_workflow"
      }
    },
    {
      "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": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 66,
      "current": 67,
      "delta": 1,
      "ratio": 1.0151515151515151,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 22,
      "currentSamples": 67,
      "pairedSamples": 0,
      "evidenceDeltaLower": -5.6000000000000005,
      "evidenceDeltaUpper": 7.6000000000000005,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_runtime"
      }
    },
    {
      "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": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 3631.5,
      "current": 3632,
      "delta": 0.5,
      "ratio": 1.000137684152554,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 22,
      "currentSamples": 14,
      "pairedSamples": 0,
      "evidenceDeltaLower": -362.65000000000003,
      "evidenceDeltaUpper": 363.65000000000003,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "nix_workspace_tools"
      }
    },
    {
      "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": "within_budget",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 3.416,
      "current": 3.186,
      "delta": -0.22999999999999998,
      "ratio": 0.9326697892271663,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -4.623,
      "evidenceDeltaUpper": -0.074,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "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": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 12.716,
      "current": 12.75,
      "delta": 0.034000000000000696,
      "ratio": 1.0026737967914439,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 3,
      "currentSamples": 3,
      "pairedSamples": 3,
      "evidenceDeltaLower": -0.035,
      "evidenceDeltaUpper": 0.034,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "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": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.631,
      "current": 0.611,
      "delta": -0.020000000000000018,
      "ratio": 0.9683042789223455,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.025,
      "evidenceDeltaUpper": -0.012,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "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.134,
      "current": 1.124,
      "delta": -0.009999999999999787,
      "ratio": 0.9911816578483247,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.024,
      "evidenceDeltaUpper": 0.011,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "genie_check_direct",
      "label": "Genie check direct",
      "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": 5.696,
      "current": 5.705,
      "delta": 0.009000000000000341,
      "ratio": 1.0015800561797754,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.025,
      "evidenceDeltaUpper": 0.014,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "genie_check_direct",
        "probeLabel": "Genie check direct",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "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": 1.862,
      "current": 1.871,
      "delta": 0.008999999999999897,
      "ratio": 1.0048335123523093,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.021,
      "evidenceDeltaUpper": 0.015,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "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.017,
      "current": 0.017,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 9,
      "evidenceDeltaLower": -0.001,
      "evidenceDeltaUpper": 0.001,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "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.038,
      "current": 0.038,
      "delta": 0,
      "ratio": 1,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "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": "unchanged",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 9,
      "current": 9,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 22,
      "currentSamples": 9,
      "pairedSamples": 0,
      "evidenceDeltaLower": -1,
      "evidenceDeltaUpper": 1,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_ci_workflow"
      }
    },
    {
      "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": 21,
      "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": 21,
      "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": 21,
      "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": 14,
      "current": 14,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 22,
      "currentSamples": 14,
      "pairedSamples": 0,
      "evidenceDeltaLower": -1.4000000000000001,
      "evidenceDeltaUpper": 1.4000000000000001,
      "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": 21,
      "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": 21,
      "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": 21,
      "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": 21,
      "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": 21,
      "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": 21,
      "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": 79,
      "current": 79,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 21,
      "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": 21,
      "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": 21,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "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": 24.249,
      "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": "27512898824-1-be140ae0f449312fda432d6c80e5060eb6c3df29",
        "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 Jun 10, 2026
schickling-assistant added a commit that referenced this pull request Jun 10, 2026
The dispatch table's drift-REFUSE rows ("remote moved underneath", "local
hand-edited") are not realizable for single-source pages: with no stored base
(R31) the engine cannot distinguish "I edited" from "the other side moved" —
both are just `local ≢ remote`. Per R31/R32 the declared `source` decides the
winner unconditionally (local- or remote-authoritative mirror); concurrent-edit
detection/refusal is exclusively the `source: shared` story. Aligns the spec
with the implementation (PR #775) and the grilled statelessness invariant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@schickling schickling linked an issue Jun 10, 2026 that may be closed by this pull request
34 tasks
schickling-assistant and others added 10 commits June 12, 2026 11:45
…osed sync

Encode the settled design-grill conclusions into the notion-md VRS:

- requirements.md: revise R09/R11 (base-snapshot + 3-way merge are
  source:shared-only; single-source push/pull is stateless live-reconcile),
  revise R26/R27 (real-Notion golden-corpus fidelity layer; fakes
  insufficient for fidelity), add R30 (adversarial footgun coverage) and
  R31-R36 (single-source statelessness, progressive disclosure, semantic-
  equivalence in-sync oracle, self-describing frontmatter dispatch, fidelity
  corpus, measurable simplicity bar).
- spec.md: add a 'Target redesign (v-next)' section recording the
  candidate-to-beat 3-verb CLI, internal layering, the mandatory
  competing-designs bake-off, and a supersession map over the current model.

Proposed vision.md delta (frictionless / progressive-disclosure north star)
is recorded in the epic for human confirmation; vision.md is NOT edited here.

Refs #774

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add two high-level value bullets to the vision: notion-md as a simple, elegant,
reliable CLI for seamless authoring/collaboration/integration via local Markdown,
and the three natural directions (local→Notion, Notion→local, bidirectional) as
use cases. Keeps mechanism (statelessness, progressive disclosure) out of vision
— those live in requirements/spec.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… bake-off

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…gate (#774)

Add the self-describing `source: local|remote|shared` field (default `local`)
to the `.nmd` V2 frontmatter (R34), with a struct-level filter enforcing that
`remote`/`shared` files carry a `page_id` (null/absent ⇒ unbound create-on-push,
legal only for `local`).

Add `gateNmdLocalState`, the cross-file statelessness gate (R31/R32, DQ-2): it
pairs a decoded frontmatter with its optional page-id-keyed sidecar and yields a
tagged `NmdLocalState`. Single-source (`local`/`remote`) MUST NOT carry a stored
base (sidecar) — a present base is a schema violation, making the
stale-stored-base poisoned-noop class structurally unreachable. A bound `shared`
file REQUIRES a base. Only the `shared-bound` branch exposes a `syncState`/base,
so a single-source code path is structurally unable to construct a base.

Decode + gate property/unit tests in `nmd.unit.test.ts`. Existing engine call
sites set `source: 'local'` (current two-way behavior preserved; full
source-aware dispatch lands in stage 3). Build + full notion-md (112) and
notion-effect-client (131) suites green.

Refs #774 (child 3)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ence keystone) (#774)

Add a PURE `canonicalizer.ts` implementing DQ-VNEXT-1: the canonical normal
form over the block-tree-rendered body, plus `semanticEqual` (equality of the
normal form) and `canonicalHash` (the noop oracle for the stateless core).

FOLDS presentation-only differences (the #756 churn class): emphasis-marker
choice (`*`↔`_`, `**`↔`__`), ordered-list renumbering (`2.`→`1.`, item order
preserved), loose↔tight list spacing, table-alignment/padding whitespace,
trailing-whitespace + trailing-space hard breaks, and blank-line-run collapse.

DOES NOT FOLD semantic/block-type differences (the #759/#763 fidelity shapes):
heading level, heading-vs-paragraph type and adjacency, divider presence,
code-fence language, and list item order.

The relation is `===` over the normal form ⇒ reflexive/symmetric/transitive by
construction. Property tests: idempotency (`canonicalize∘canonicalize ==
canonicalize`) over fast-check strings + samples, the relation laws, a table of
#756-class cosmetic variant pairs all comparing EQUAL, and a table of
#759/#763-class semantic shapes all comparing DISTINCT. Pure, no Notion. 28
tests; full notion-md suite (140) green.

Refs #774 (children 3, 4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eaf + tree orchestration (#774)

Implement the three-layer internal design from the spec:

- `reconcile-core.ts` — the STATELESS per-page core. `decideReconcile` maps the
  gated `NmdLocalState` + a live `render(local) ⇄ read(remote)` R33 compare to
  the dispatch outcome (`noop|create|push|pull|refuse|shared-defer`). Imports
  the canonicalizer ONLY — never the merge planner or a base read — so a
  single-source path is structurally unable to construct a base (R31/R32 by the
  dependency graph). `porcelainStatus` maps to git-porcelain words.
- `reconcile-shared.ts` — the `source: shared` leaf, the SOLE importer of the
  merge planner (`tryMergeMarkdownBodies`) and the only base/3-way reasoning.
  `decideShared` ⇒ noop / merge / conflict; reached only via `shared-defer`.
- `reconcile.ts` — the Effectful engine: read+gate local state, read remote,
  decide, apply. Single-source applies directly (create/push/pull) sending the
  canonical R33 body; `shared` defers to the leaf, writes `conflict.roughdraft`,
  and re-settles a fresh base after a clean apply. `statusFile` is read-only and
  safe by construction (no write path in its call graph, R30). `statusTree`/
  `reconcileTree` map the core over discovered files via the now-exported
  `runBatch` (discovery + duplicate-page_id preflight + bounded concurrency).

Tests: 17 pure decision unit tests (dispatch table, porcelain words, shared
3-way) + 9 FakeNotion control-flow e2e (create/push/pull/noop dispatch, #756
cosmetic churn folds to noop, canonical push reaches noop, status never
mutates). Full notion-md suite (166) green.

DESIGN NOTE — single-source push tie-break: the spec dispatch table's "local
bound: remote moved underneath ⇒ REFUSE" row is not realizable statelessly (no
stored base to distinguish "local changed" from "remote moved"). Per R11/R31
this implements: `source: local` bound ⇒ equivalent=noop, else push (local
authority / mirror); the REFUSE-on-remote-drift safety is the `source: shared`
story (the table even suggests `clone --as shared`). Flagged for confirmation.

Refs #774 (children 3, 4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the pre-redesign `status`/`plan`/`sync` surface with the decided three
near-flagless verbs (spec "Decided surface"):

- `clone <id|url> [path]` — the ONLY command taking a page id. Bootstraps a
  local `.nmd` from an existing Notion page via the new `clonePage` (added to
  reconcile.ts): writes self-describing frontmatter with `--as local|remote|
  shared` (default `remote`), fails closed on a lossy remote body, refuses to
  overwrite a file bound to a different page, and establishes the base sidecar
  for `--as shared`.
- `status [path...]` — read-only, safe by construction; git-porcelain words
  (in-sync / local-ahead / remote-ahead / diverged / unbound) via `statusTree`,
  with `--json`. Emits the one-line "no push/pull — direction is each file's
  `source`" explainer.
- `sync [path...]` — reconciles via `reconcileTree`; dispatch per file on
  frontmatter `source`, never on flags/arity. Flags: `--watch`/
  `--poll-interval-ms`/`--recursive`/`--concurrency`/`--force`/`--json`.

DROPPED (subsumed by frontmatter dispatch, R34): the `plan` verb,
`--from-remote`, `--root`, `--root-file`, two-arg `sync`, and file-vs-tree flag
branching.

REVISED cli.e2e.test.ts deliberately: the old assertions encoded the superseded
surface (`plan`/`--from-remote`/`--root`) and would contradict the decided spec;
the new tests assert the three verbs, the `--as`/page-id `clone` contract, and
that the dropped flags/verb are gone. `--watch` still delegates to the existing
watch engine (legacy two-way) pending a watch port to the source-aware engine.

Build + full notion-md suite (165) green.

Refs #774 (children 3, 4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…un + live smoke (R30/R35/R27) (#774)

- `corpus.ts` + `corpus/fidelity-corpus.ts` — the golden fidelity corpus (R35):
  a Schema-decoded set of historically-broken Notion body shapes (#756
  paragraph-after-list + emphasis/ordered-list churn, #763 paragraph↔heading,
  #759 divider, code-fence language) each pinning the R33 relation it must hold
  (`equal` ⇒ fidelity preserved/noop; `distinct_from` ⇒ shape not folded).
  Replayed OFFLINE in `corpus.unit.test.ts` so it gates every run with no
  network. `notion_round_trip` values are authored from the documented Notion
  normalizations and flagged `captured: pending-live-refresh` — the schema +
  replay harness are permanent; a credentialed capture run is a data refresh.

- `adversarial-footgun.unit.test.ts` — the R30 zero-footgun pass. Each
  historical footgun has a test that ATTEMPTS to trigger it and asserts it is
  structurally impossible: poisoned-noop (a stored base on single-source is a
  schema violation; single-source gated states carry no `syncState`/base field),
  #756 cosmetic churn (semantically-equal pages reach noop), #759/#763 fidelity
  corruption (shapes stay canonically distinct), and wrong-direction push
  (`source: remote` has no push branch; bound-required `remote`/`shared`). All
  green ⇒ zero triggerable footguns.

- `reconcile-live.integration.test.ts` — the thin REQUIRED live-smoke tier
  (R27): clone(remote) → status in-sync → reconcile noop against a real
  temporary page with archive cleanup. `skipIf`-gated on NOTION_API_TOKEN +
  NOTION_TEST_PARENT_PAGE_ID (same contract as live.integration.test.ts);
  compiles and skips cleanly without a test parent.

Full notion-md suite 192 green (offline). Live capture/refresh of the corpus +
the live-smoke run need a credentialed session with a dedicated test parent.

Refs #774 (children 3, 4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The dispatch table's drift-REFUSE rows ("remote moved underneath", "local
hand-edited") are not realizable for single-source pages: with no stored base
(R31) the engine cannot distinguish "I edited" from "the other side moved" —
both are just `local ≢ remote`. Per R31/R32 the declared `source` decides the
winner unconditionally (local- or remote-authoritative mirror); concurrent-edit
detection/refusal is exclusively the `source: shared` story. Aligns the spec
with the implementation (PR #775) and the grilled statelessness invariant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@schickling-assistant schickling-assistant force-pushed the schickling/2026-06-10-756 branch from 8d11364 to ca6d644 Compare June 12, 2026 09:53
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
@schickling-assistant schickling-assistant marked this pull request as ready for review June 12, 2026 10:20
@github-actions github-actions Bot requested a review from schickling June 12, 2026 10:20
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
@schickling-assistant schickling-assistant marked this pull request as draft June 12, 2026 10:40
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
github-actions Bot added a commit that referenced this pull request Jun 12, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
…ion)

Provisional orchestrator decisions for landing the integrated Notion DB
Markdown Sync VRS in #775: merge shape, live-test gating, shared
property-write-core boundary, VRS authority, clean-break v1, execution
model, done-bar, webhook/non-body boundaries. Each records principled
options, trade-offs, evidence, and the chosen option for later
ratification.

Refs #775 #774.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@schickling-assistant

Copy link
Copy Markdown
Collaborator Author

Orchestration kickoff — autonomous milestone execution

Verified-green baseline (check:all) established. Live Notion harness is unblocked (token cached 24h; dedicated synthetic scratch parents accessible). Autonomous decision log recorded at context/notion-db-markdown-sync/pr775-autonomous-decisions.md (pending human ratification).

Current-state → VRS gap (sizing drives milestone order)

Phase Size Status today Core gap
1 — Shared property schema S Mostly done write-class, CanonicalPropertyValue, codecs exist in notion-effect-schema; missing canonical DataSourceId, PropertyDescriptor shape, config/schema-hash + property-identity evidence types
2 — .nmd descriptor contract S Partial NmdFrontmatterV2 exists; no optional property_descriptors; strict onExcessProperty:'error' must be handled
3 — PropertyWriteCore + proof providers L Greenfield named guards exist in datasource-sync but no shared entrypoint-neutral PropertyWriteCore/PropertyWriteProof; notion-md & datasource-sync decide write-safety independently
4 — Datasource workspace surface L Greenfield public view is rows not pages; flat unversioned layout (no notion.workspace.v1.json / data/v1 / pages/v1 / .notion/v1); authority mode (local|remote|shared) absent; no SQLite↔.nmd convergence
5 — CLI / dry-run / watch M Partial one-shot --dry-run ok; sync --watch --dry-run hard-rejected in datasource-sync; no track --mode authority CLI
6 — Non-body / object lifecycle M Partial guards exist; files.ts non-Effect + unguarded byte upload; comment-write/GC fail-closed wiring missing
7 — Webhook trigger S–M Partial receiver + signal-inbox + daemon-wake exist; payload not Effect-Schema-decoded; duplicate webhook schema across packages; no page-targeted fresh-read-before-plan
8 — E2E matrix M Partial L0–L7 layers have coverage but shadow current surfaces; pages/authority-mode/convergence/proof-core/descriptor tests are greenfield and land with their features

Execution order (dependency-driven)

1 → 2 → 3 → 4 → 5 → (6 ∥ 7) → 8 sweep. Test scaffolding (Phase 8) lands incrementally with each feature, not as a final block. Each milestone: implement → check:all green (+ live where the correctness is live-only) → independent adversarial sub-agent review → refine → commit + push → tick this checklist.

Decisions of note (full rationale in the decision log): new @overeng/notion-property-write package hosts the pure PropertyWriteCore (entrypoint-neutrality becomes structural); hard clean-break (delete rows/_nds_* public surfaces, rewrite dependent tests to the v1 surface); cross-cutting context/notion-db-markdown-sync VRS is canonical.

Posted on behalf of @schickling
field value
agent_name 🥣 cl1-basin
agent_session_id d8c9b009-8256-4b1f-986a-dbeeae38db7a
agent_tool Claude Code
agent_tool_version 2.1.165
agent_runtime Claude Code 2.1.165
agent_model claude-opus-4-8
runtime_profile /nix/store/4p78dsfk8riqcgk91zzjlgraibyf1hd4-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/cly1vi1qvxfyk37gmdk4qw4j33zrfpny-agent-skills-corpus/share/agent-skills/manifest.json
worktree effect-utils/schickling/2026-06-10-756
machine dev3
tooling_profile dotfiles@e7e383b

github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
…ndation (#775 phase 1)

Add the canonical shared property-identity layer all higher packages
build on (VRS A03, R09-R14):

- DataSourceId brand promoted to notion-effect-schema as the single
  canonical source; notion-datasource-sync core/domain.ts now aliases it.
- PropertyDescriptor / PropertyDescriptors matching the .nmd
  property_descriptors shape (property_id, property_name, property_type,
  data_source_id, config_hash), with strict fail-closed decoders.
- ConfigHash / SchemaHash distinctly-branded sha256 descriptor hashes.
- PropertyIdentityEvidenceSource data-only union (descriptor |
  workspace_state | live_schema) — classification, not a proof carrier.
- Deterministic canonical-JSON serialization for descriptor hashing.
- 17 unit tests: strict decode accept/reject, canonical-JSON stability,
  brand validation, write-class consistency (computed/unsupported never
  writable).

Schema package boundary kept strict: values/codecs/descriptors/
classification only; no authority, proof, or convergence.

Refs #775 #774.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
schickling-assistant and others added 2 commits June 14, 2026 23:20
…e hashing contract (#775 phase 1 review)

Adversarial review of phase 1 found the descriptor canonicalizer invented
a third serialization strategy (recursive codepoint key-sort) divergent
from the package contract and corrupting non-plain values.

- canonicalPropertyDescriptorJson now schema-encodes (deterministic struct
  field order) then plain JSON.stringify, matching canonical-codec.ts.
- Drop the generic recursive canonicalDescriptorJson (no consumers).
- Document decode* helpers as the sanctioned fail-closed entry points
  (bare Schema.Struct drops excess; composing schemas must decode with
  onExcessProperty: 'error').
- Note key/property_name disambiguation is the Phase 3 proof provider's
  job, not the schema layer.
- Note SchemaHash + PropertyIdentityEvidenceSource are foundation for the
  Phase 3 PropertyWriteCore / proof providers.

Refs #775.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…#775 phase 2)

Datasource page files can carry compact property descriptors as portable
identity hints (VRS R03, R09-R14, T01):

- NmdFrontmatterV2 gains optional property_descriptors (shared
  PropertyDescriptors from notion-effect-schema); absent key omitted on
  encode, present round-trips intact.
- notion-md frontmatter rendering emits descriptors only when datasource
  parent + schema evidence is available; standalone pages emit none.
- Descriptors are identity-only: never freshness, base, outbox,
  convergence, relation, or settlement state. Unknown descriptor fields
  fail closed via the strict envelope decode.
- Datasource page .nmd remains valid standalone NotionMD.
- file-format docs + 13 tests (standalone validity, round-trip, gated
  emission, fail-closed).

Refs #775 #774.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
…hase 0)

Scope-lock consistency pass: replace a stale non-namespaced telemetry
trace (R52/R57-R59/R67-R73) with the namespaced OBS/XC IDs, and add
requirement traces to the previously untraced Package Shape, Authority
Model, and Resolved Scope Boundaries sections. No competing product
contract remained in the per-package VRS; canonical context/ VRS is
authoritative.

Refs #775.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
github-actions Bot added a commit that referenced this pull request Jun 14, 2026
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.

Epic: notion-md frictionless, progressively-disclosed sync

2 participants