Unified /sk-cli-design output for the notion CLI surface#794
Draft
schickling-assistant wants to merge 6 commits into
Draft
Unified /sk-cli-design output for the notion CLI surface#794schickling-assistant wants to merge 6 commits into
schickling-assistant wants to merge 6 commits into
Conversation
…n (trace diagnosability) Close two tracing gaps on the `edit` push path so its latency is visible in a trace BEFORE we fix it: - The init/status/observe/preflight/settle `gateway.pullPage` round-trips emitted byte-identical `notion-md.gateway.pull-page` spans, so the redundant status↔observe duplicate (#788) was indistinguishable from the legitimate preflight/settle pulls. Add an optional `purpose?` on the gateway `pullPage` arg (non-edit callers default to `other`, no churn), surfaced as `notion_md.pull.purpose` and folded into the span label. - Wrap the interactive editor wait in `notion-md.editor.session` so the previously-dark editor-exit→push boundary is a separable sibling under `notion-md.edit`. Instrumentation only — additive spans/attributes, zero behavior change. A capture regression test (editor-observability.unit.test.ts) pins the five distinct purposes + the editor-session span. notion-md 198 pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Slice A of the unified notion-CLI output refactor. Promotes the /sk-cli-design vocabulary — currently "design fiction" living only in notion-md's stories (a story-local `displayLines`) — into a real, reusable kit in @overeng/tui-react that every CLI can render through. Schema pieces (JSON-encodable SSOT for per-command state schemas): Severity, ProblemItem (with fix:/skip:), DetailSection, StatusSymbol. Components (all route through useSymbols/useRenderConfig, so unicode/ ascii + color honor the active OutputMode): SeverityBadge, ProblemList, DetailSections, SummaryLine, StatusGlyph, StageList (thin wrapper over the existing TaskList, reusing TaskItemSchema), and CommandOutput — the assembly enforcing problems-first → CRITICAL → WARNING → separator → content → summary with the conditional-display rules. Pure addition — no existing command or renderer changed. 17 unit tests (ci/log/ascii-fallback rendering pinned); full tui-react suite 242 pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Storybook PreviewsNo storybooks were deployed. |
CI Measurementspartial - advisory gate - readiness
nix / closures / packages
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
devenv / devenv shell
devenv / genie
devenv / quality gates
devenv / workspace setup
nix / closures / packages
Diagnostic / ungated measurements (7)source / effect-utils
devenv / devenv shell
All measurements
Previous runs
Source-of-truth JSON{
"schemaVersion": 1,
"title": "CI Measurements",
"status": "partial",
"gate": "advisory",
"readiness": "partial (17/26 enabled observations gateable)",
"commit": {
"shortSha": "6c92fdc",
"sha": "6c92fdc5fa29cf7fa9b0d26335b9c04cf2aacdd1"
},
"run": {
"id": "27694290331",
"attempt": "1",
"url": "https://github.com/overengineeringstudio/effect-utils/actions/runs/27694290331"
},
"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-794/6c92fdc5fa29cf7fa9b0d26335b9c04cf2aacdd1/run-27694290331-attempt-1/ci-measurements.svg",
"lightPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-794/6c92fdc5fa29cf7fa9b0d26335b9c04cf2aacdd1/run-27694290331-attempt-1/ci-measurements.png",
"darkPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-794/6c92fdc5fa29cf7fa9b0d26335b9c04cf2aacdd1/run-27694290331-attempt-1/ci-measurements-dark.png"
},
"measurements": [
{
"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": 17,
"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": 16,
"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",
"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": 561873128,
"current": 561922280,
"delta": 49152,
"ratio": 1.0000874788231553,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 17,
"currentSamples": 1,
"pairedSamples": 0,
"evidenceDeltaLower": -11188310.56,
"evidenceDeltaUpper": 11286614.56,
"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": 561873128,
"current": 561922280,
"delta": 49152,
"ratio": 1.0000874788231553,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 16,
"currentSamples": 1,
"pairedSamples": 0,
"evidenceDeltaLower": -56138160.800000004,
"evidenceDeltaUpper": 56236464.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",
"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": 17,
"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": 16,
"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": 18,
"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": 18,
"currentSamples": 9,
"pairedSamples": 0,
"evidenceDeltaLower": -631.8000000000001,
"evidenceDeltaUpper": 831.8000000000001,
"pairedEvidenceQuantile": 0.25,
"dimensions": {
"scope": "genie_ci_workflow"
}
},
{
"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": 3632,
"current": 3694,
"delta": 62,
"ratio": 1.0170704845814977,
"semanticImpactScore": null,
"semanticImpactKind": "diagnostic",
"baselineSources": 18,
"currentSamples": 14,
"pairedSamples": 0,
"evidenceDeltaLower": -301.20000000000005,
"evidenceDeltaUpper": 425.20000000000005,
"pairedEvidenceQuantile": 0.25,
"dimensions": {
"scope": "nix_workspace_tools"
}
},
{
"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": 18,
"currentSamples": 67,
"pairedSamples": 0,
"evidenceDeltaLower": -5.6000000000000005,
"evidenceDeltaUpper": 7.6000000000000005,
"pairedEvidenceQuantile": 0.25,
"dimensions": {
"scope": "genie_runtime"
}
},
{
"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": "within_budget",
"comparisonMode": "paired",
"unit": "seconds",
"baseline": 12.439,
"current": 11.652,
"delta": -0.7870000000000008,
"ratio": 0.936731248492644,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 3,
"currentSamples": 3,
"pairedSamples": 3,
"evidenceDeltaLower": -1.583,
"evidenceDeltaUpper": -0.597,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"measurementProtocol": "devenv-perf-warm-median-v2",
"aggregation": "median",
"phase": "warm",
"devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
"otelServiceName": "devenv-perf-ci"
}
},
{
"id": "task_check_quick_warm",
"label": "Warm cached check:quick",
"group": "devenv / quality gates",
"path": [
"devenv",
"quality gates",
"check:quick"
],
"groupPath": [
"devenv",
"quality gates"
],
"status": "pass",
"direction": "unchanged",
"gateable": true,
"gateReason": "eligible",
"confidence": "noise_floor",
"comparisonMode": "paired",
"unit": "seconds",
"baseline": 3.317,
"current": 3.259,
"delta": -0.058000000000000274,
"ratio": 0.9825143201688272,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 5,
"currentSamples": 5,
"pairedSamples": 5,
"evidenceDeltaLower": -0.067,
"evidenceDeltaUpper": 0.027,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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.748,
"current": 5.736,
"delta": -0.012000000000000455,
"ratio": 0.9979123173277661,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 5,
"currentSamples": 5,
"pairedSamples": 5,
"evidenceDeltaLower": -0.198,
"evidenceDeltaUpper": 0.076,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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.131,
"current": 1.123,
"delta": -0.008000000000000007,
"ratio": 0.9929266136162688,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 5,
"currentSamples": 5,
"pairedSamples": 5,
"evidenceDeltaLower": -0.014,
"evidenceDeltaUpper": 0.025,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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.622,
"current": 0.616,
"delta": -0.006000000000000005,
"ratio": 0.9903536977491961,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 5,
"currentSamples": 5,
"pairedSamples": 5,
"evidenceDeltaLower": -0.008,
"evidenceDeltaUpper": 0.003,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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.836,
"current": 1.837,
"delta": 0.0009999999999998899,
"ratio": 1.0005446623093681,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 5,
"currentSamples": 5,
"pairedSamples": 5,
"evidenceDeltaLower": 0.001,
"evidenceDeltaUpper": 0.008,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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.018,
"current": 0.018,
"delta": 0,
"ratio": 1,
"semanticImpactScore": 0,
"semanticImpactKind": "neutral",
"baselineSources": 9,
"currentSamples": 9,
"pairedSamples": 9,
"evidenceDeltaLower": 0,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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.037,
"current": 0.037,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"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": 18,
"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": 17,
"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": 17,
"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": 17,
"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": 18,
"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": 17,
"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": 17,
"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": 17,
"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": 17,
"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": 17,
"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": 17,
"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": 17,
"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": 17,
"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": 17,
"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": 106.467,
"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": "27694290331-1-9a8216a719acca93737245dfc5e3972ae1a4ae4d",
"measurementProtocol": "devenv-perf-warm-median-v2",
"aggregation": "median",
"phase": "warm",
"devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
"otelServiceName": "devenv-perf-ci"
}
}
]
} |
CommandOutput emitted a React duplicate-key warning when two problems
shared severity+name (key `${severity}:${name}` collided). Key by array
index too. Kit cli-output suite 17 pass, no key warnings.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eporter bridge
Slice B of the unified output refactor. `edit` now renders through the
tui-react seam instead of raw stderr writes + JSON-by-default:
- progress-bridge.ts: `progressReporterTui(dispatch)` Layer maps the
engine's `ProgressReporter` emits → `tui.dispatch` actions. The engine
(sync.ts withStage/reportNote emits, progress.ts Tag+helpers) is
UNCHANGED — only the backing Layer changes (R45 preserved; proven by
the ported progress.unit.test: identical EditResult under no/capturing/
hostile dispatch).
- cli-output/edit/{schema,app,view}: tagged EditState (Running → Success
| Conflict | Error), lazy `getEditApp()` (#787-safe), EditView rendering
through the shared `/sk-cli-design` CommandOutput kit. Drift (conflict /
auto-merge) is a WARNING badge + actionable `fix:`, not a flat `note:`.
- makeEditCommand: `run(getEditApp(), handler+bridge, {view})
.pipe(Effect.provide(outputModeLayer(output)))` + `--output` option,
replacing `logJson` + the hand-rolled stderr-TTY gate. Mode-exclusive
stdout (pipe → json/log, never animated; R44). Removed the now-vestigial
ProgressReporterStderrLines.
- EditOutput story: 5 fixtures × ALL_OUTPUT_TABS.
notion-md 197 pass; tsc/oxlint clean; per-mode tui-stories renders
conform to /sk-cli-design.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Slice C-write of the unified output refactor, replicating the `edit` template (run + ProgressReporter bridge + --output, replacing logJson). - put: instrumented `putEditorPage` with `withStage` (observe → write-body → write-title[skip if unchanged]) — additive, no-op without the bridge (R45). `PutState` adds a `Partial` terminal tag for the body-written / title-failed case (NmdPartialWriteError, exit 10): a ✗ write-title row + a WARNING with a `--base-hash` re-cat `fix:`. - sync (one-shot): single-page renders like edit (live stages + outcome); tree/batch renders one result row per page via `sync/map.ts` (normalizes the four engine result shapes) + a counts summary. `--watch` is untouched (stays on its ndjson `writeJsonLine` path). - progress-bridge made generic over the shared stage/note action subset so one bridge drives edit/put/sync. - Exit-code mappers mirror the runMain `editorExitCode` teardown (errors propagate uncaught; no second exit path). Summaries carry no glyphs. - PutOutput / SyncOutput stories × ALL_OUTPUT_TABS. notion-md 204 pass; tsc/oxlint clean; per-mode renders conform to /sk-cli-design. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Slice C-read of the unified output refactor. The read-only result
commands adopt a thin, stage-less shape (no progress bridge, no engine
instrumentation, no exit-code dance — clean exit 0 for drift):
- StatusState/PlanState = Success{sections, problems, summary} | Error.
- status/map.ts normalizes the three statusPath/statusMany result shapes
(single StatusResult → state + deduped unknown-blocks sections; tree →
per-page rows). Drift / unresolved unknown blocks → WARNING problems
with a fix:.
- plan/map.ts maps the tree diff → one DetailSection per op-kind
(create/update/move/trash/noop) + a counts summary; a predicted sync
refusal (conflict) → CRITICAL (plan predicts; status observes — a
deliberate severity distinction).
- Both handlers: run(getXApp(), …, {view}).pipe(Effect.provide(
outputModeLayer(output))) + --output, replacing logJson. Pre-flight
validations stay outside run (before token resolution) — the
plan-is-directory-only e2e contract is preserved.
- StatusOutput / PlanOutput stories × ALL_OUTPUT_TABS.
notion-md 214 pass; tsc/oxlint clean; per-mode renders conform to /sk-cli-design.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
notion-md's CLI output is non-idiomatic and inconsistent:edit/put/status/plan/synchardcodelogJson(prettyJSON.stringify→ stdout) with no--outputflag. A user in a terminal gets a wall of JSON, not a scannable result — the exact inversion/sk-cli-designforbids (JSON should be an explicit mode).edit's sync progress is hand-written viaprocess.stderr.write, bypassing the tui-react render seam — so it ignoresNO_UNICODE/mode detection and hand-rolls a TTY gate the seam already provides./sk-cli-designvocabulary (CRITICAL/WARNING badges,fix:/skip:,·summary, status symbols) already exists innotion-md/src/stories/but no live command renders through it.editconflict exits 0 (it's the result) yet renders as a flat lowercasenote:with no badge and no actionablefix:for the recoverable.conflict.md.Goal
One unified output system the whole notion CLI surface renders through:
/sk-cli-designkit in@overeng/tui-react(badges, problem-items, summary line, status glyphs, stage-list,CommandOutputassembly), consumed by notion-md (and available to notion-cli/megarepo).app/schema/viewtriple notion-cli already uses: one tagged state per command drives the human view AND--output jsonfrom a single source.--output auto|log|ci|json|ndjson, defaultauto(human view; JSON only via--output json).fix:.catstays a pure-stdout Markdown pipe (excluded).Decisions
@overeng/tui-react(not a new package or notion-md-local): co-located withTaskList/useSymbols/the OutputMode seam; the only option that unifies notion-cli + notion-md.TaskListviarun(notrunResult, which always JSON-serializes to stdout), behind the existingProgressReporterContext.Tag — the engine stays render-agnostic (R45). A bridge Layer turns enginereportStage*/reportNoteemits intotui.dispatch.run, the human view and the json payload both go to stdout, switched by mode (a pipe → json/log, never animated). The old "progress-on-stderr + json-on-stdout simultaneously" model is replaced.Running | Success | Warning | Conflict | Error) for precise exit-code mapping.--outputdefault flips toauto— a breaking change to current default stdout (JSON → human view). Accepted deliberately (the feature only just merged as notion-md: $EDITOR-based editing — VRS + implementation epic #786).Verification
Per-slice: package-local typecheck + tests + lint, and (per
/sk-cli-design)tui-storiesstories withALL_OUTPUT_TABS+ headlesstui-stories render … --output json|log|ciassertions. Landed so far:@overeng/tui-reactsuite 242 pass; tsc/oxlint clean.(Full end-to-end verification + the pre-flip checklist will be completed before this is flipped ready.)
Complexity
The kit + per-command apps add structure, but it removes a parallel mechanism: today progress (raw stderr) and result (logJson) are two ad-hoc paths; the refactor collapses progress + human result + json payload into one state schema per command. Net: fewer bespoke output code paths, and the
/sk-cli-designvocabulary stops being duplicated between stories and (absent) runtime.Concerns
notion-md edit/status/plan/syncdefault stdout changes from pretty-JSON to a human view; machine callers must pass--output json.@overeng/tui-react's public surface (new components every CLI can depend on).Follow-ups
notion-clirenderer convergence onto the kit (e.g.diff --exit-codedrift → WARNING badge).modified/divergedstatus symbols into@overeng/tui-core's registry; DRYTaskList's internal summary onto the kitSummaryLine.References
Refs #786 (the merged $EDITOR-editing epic this builds on), #788.
Posted on behalf of @schickling
agent_nameagent_session_idagent_toolagent_tool_versionagent_runtimeagent_modelruntime_profileskills_manifestworktreemachinetooling_profile