docs: in-code documentation, batch 1 #929

Closed
kayg wants to merge 0 commits from docs/in-code-batch-1 into dev
Owner

Adds in-code documentation to markdown-view, imap-uid, prefs, migrate-v0, plugin-hello, testkit and fixtures. The final diff changes comments and whitespace only; added lint attributes were removed. New prefs input explanations stay in module docs so JSON Schema and the action contract keep their existing descriptions.

The requested workspace rustdoc gate also required 15 one-line documentation corrections in 14 files under notes, contacts, tasks, contacts-actions and auth: private/ambiguous/unresolved links and unescaped placeholder paths. These are link repairs, not full documentation batches for those crates.

Final head: 35e233dda853836d2922cde00c4d017465eb1628, current with dev 9377d711217532a44973edcf63c2af0b7f7969d8. A string-aware non-comment token comparison covers all 35 changed Rust files with zero differences.

Final gate table, exact commands and evidence: fmt, clippy, workspace tests and warning-denied rustdoc pass. The first crash-test failure did not reproduce in ten candidate plus ten dev repeats; the subsequent full workspace run passed. Stability follow-up: #955.

Perf is not green. Stripped binaries differ from dev only in source-location line numbers, so the binary-identity exemption was not taken. Both perf locks were held for dev-vs-dev control and candidate ABAB. Every run completed all scenarios but exceeded the same existing page-tag and idle-CPU budgets; five metrics have slower candidate quantiles beyond the observed control range. All 51 deltas and raw reports. No flat-or-better claim or merge recommendation.

The other crates and web/packages still need their later documentation batches. No merge performed.

Adds in-code documentation to `markdown-view`, `imap-uid`, `prefs`, `migrate-v0`, `plugin-hello`, `testkit` and `fixtures`. The final diff changes comments and whitespace only; added lint attributes were removed. New prefs input explanations stay in module docs so JSON Schema and the action contract keep their existing descriptions. The requested workspace rustdoc gate also required 15 one-line documentation corrections in 14 files under notes, contacts, tasks, contacts-actions and auth: private/ambiguous/unresolved links and unescaped placeholder paths. These are link repairs, not full documentation batches for those crates. Final head: `35e233dda853836d2922cde00c4d017465eb1628`, current with dev `9377d711217532a44973edcf63c2af0b7f7969d8`. A string-aware non-comment token comparison covers all 35 changed Rust files with zero differences. [Final gate table, exact commands and evidence](https://git.kayg.org/kayg/calternal/pulls/929#issuecomment-79648): fmt, clippy, workspace tests and warning-denied rustdoc pass. The first crash-test failure did not reproduce in ten candidate plus ten dev repeats; the subsequent full workspace run passed. Stability follow-up: #955. **Perf is not green.** Stripped binaries differ from dev only in source-location line numbers, so the binary-identity exemption was not taken. Both perf locks were held for dev-vs-dev control and candidate ABAB. Every run completed all scenarios but exceeded the same existing page-tag and idle-CPU budgets; five metrics have slower candidate quantiles beyond the observed control range. [All 51 deltas and raw reports](https://git.kayg.org/kayg/calternal/pulls/929#issuecomment-79627). No flat-or-better claim or merge recommendation. The other crates and web/packages still need their later documentation batches. No merge performed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
docs(fixtures): fmt
Some checks failed
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
66b6ffa556
Author
Owner

resumed validation at head 7c886f30da against dev 9377d71121.

  • read the six original commits, PR description, comments and reviews (none posted), and previous dev-01 worktree/logs.
  • strict comments-only requirement supersedes the original description's lint additions: removed seven #![warn(missing_docs)] attributes in atomic commit 47c106c3 and pushed immediately.
  • merged origin/dev in 7c886f30 and pushed; no conflicts.
  • git diff origin/dev...HEAD touches 21 Rust files only. a string-aware lexer, including raw strings, character literals and nested block comments, compared non-comment tokens with the merge base: zero differences. token digest: 53aff8eac970013ddebfb4975bd1a75a426cbb32acff6020d9705528a4298505.
  • workspace gates running on dev-01 in the resumed VM worktree through Nix and ~/bin/slot. release comparison uses one separate VM worktree at the same absolute path for both revisions, the same Nix environment and commands, then strips debug info. final gate table follows.

no merge will be performed.

resumed validation at head 7c886f30daee2b0ba9803a19bbed0a3a867dde27 against dev 9377d711217532a44973edcf63c2af0b7f7969d8. - read the six original commits, PR description, comments and reviews (none posted), and previous dev-01 worktree/logs. - strict comments-only requirement supersedes the original description's lint additions: removed seven `#![warn(missing_docs)]` attributes in atomic commit 47c106c3 and pushed immediately. - merged origin/dev in 7c886f30 and pushed; no conflicts. - `git diff origin/dev...HEAD` touches 21 Rust files only. a string-aware lexer, including raw strings, character literals and nested block comments, compared non-comment tokens with the merge base: zero differences. token digest: `53aff8eac970013ddebfb4975bd1a75a426cbb32acff6020d9705528a4298505`. - workspace gates running on dev-01 in the resumed VM worktree through Nix and ~/bin/slot. release comparison uses one separate VM worktree at the same absolute path for both revisions, the same Nix environment and commands, then strips debug info. final gate table follows. no merge will be performed.
Author
Owner

validation update: the first cargo test --workspace stopped at plugins::tests::contract_matches_the_server (34 passed, 1 failed, 1 ignored in that binary). The new /// comments on prefs::Set and its fields feed schemars::JsonSchema, so comments can change the action contract even when non-comment tokens match.

Commit d5222549 moves that input explanation into module docs and restores the type/field docs to dev's state. It changes comments only; the token comparison still reports zero differences. No contract JSON or implementation code was changed. A contract-generation probe on the original head is queued to capture the exact difference, followed by fresh gates on the corrected head.

fmt and clippy passed on 7c886f30. rustdoc, the probe and the final release build are currently queued behind the dev-01 train lock through ~/bin/slot. Baseline dev release binaries have been built and saved. Final results will supersede this intermediate status.

validation update: the first `cargo test --workspace` stopped at `plugins::tests::contract_matches_the_server` (34 passed, 1 failed, 1 ignored in that binary). The new `///` comments on `prefs::Set` and its fields feed `schemars::JsonSchema`, so comments can change the action contract even when non-comment tokens match. Commit d5222549 moves that input explanation into module docs and restores the type/field docs to dev's state. It changes comments only; the token comparison still reports zero differences. No contract JSON or implementation code was changed. A contract-generation probe on the original head is queued to capture the exact difference, followed by fresh gates on the corrected head. fmt and clippy passed on 7c886f30. rustdoc, the probe and the final release build are currently queued behind the dev-01 train lock through ~/bin/slot. Baseline dev release binaries have been built and saved. Final results will supersede this intermediate status.
Author
Owner

head 38d99d2d5d fixes two rustdoc links in comments only: private Relationship became plain prose, and the unresolved Limits link is now crate::Limits. Full workspace tests, including the contract test and doctests, passed on d5222549; fresh gates and release binaries are rebuilding for 38d99d2d.

The release comparison against dev 9377d711 differs after strip --strip-debug, so the perf exemption is NOT taken. ELF inspection explains every difference: only .data.rel.ro differs; .text, .rodata, symbol tables and all other sections are byte-identical. Decoding relocations identifies only source-location line numbers: 119 in calternal, 4 in calternal-perf, and 85 in markdown-worker. Every referenced old/new source line is byte-identical, with the same column. For example, crates/markdown-view/src/lines.rs:287:26 moves to :372:26.

Perf-01's shared lock was acquired first, then perf-02's; both are held together. Measuring on perf-01, with SHA256 verified after relay through the control host. Dev-vs-dev ABAB control is running first with the same dev harness and server in both roles. Candidate ABAB follows on the final head. Command per invocation: calternal-perf --bin <server> --work <owned-work> --sizes 100k --runs 3 --cold-runs 1 --idle-secs 300 --budgets <pinned-perf/budgets.json> --gate --json <report.json> --md <report.md>. The 100k Home exercises the full server scenario set at the largest standard size; two candidate invocations yield six warm runs per revision. Both locks will be released and generated Homes/targets removed before handback.

git diff origin/dev...HEAD: 21 Rust files, zero non-comment token differences, same token digest as the prior note. No merge performed.

head 38d99d2d5d3a0102f457d2e8547faa7f510d3445 fixes two rustdoc links in comments only: private `Relationship` became plain prose, and the unresolved `Limits` link is now `crate::Limits`. Full workspace tests, including the contract test and doctests, passed on d5222549; fresh gates and release binaries are rebuilding for 38d99d2d. The release comparison against dev 9377d711 differs after `strip --strip-debug`, so the perf exemption is NOT taken. ELF inspection explains every difference: only `.data.rel.ro` differs; `.text`, `.rodata`, symbol tables and all other sections are byte-identical. Decoding relocations identifies only source-location line numbers: 119 in `calternal`, 4 in `calternal-perf`, and 85 in `markdown-worker`. Every referenced old/new source line is byte-identical, with the same column. For example, `crates/markdown-view/src/lines.rs:287:26` moves to `:372:26`. Perf-01's shared lock was acquired first, then perf-02's; both are held together. Measuring on perf-01, with SHA256 verified after relay through the control host. Dev-vs-dev ABAB control is running first with the same dev harness and server in both roles. Candidate ABAB follows on the final head. Command per invocation: `calternal-perf --bin <server> --work <owned-work> --sizes 100k --runs 3 --cold-runs 1 --idle-secs 300 --budgets <pinned-perf/budgets.json> --gate --json <report.json> --md <report.md>`. The 100k Home exercises the full server scenario set at the largest standard size; two candidate invocations yield six warm runs per revision. Both locks will be released and generated Homes/targets removed before handback. `git diff origin/dev...HEAD`: 21 Rust files, zero non-comment token differences, same token digest as the prior note. No merge performed.
Author
Owner

perf control update (unchanged dev 9377d711, both shared perf locks held, perf-01): the first two dev-vs-dev invocations completed every scenario without failures. Both exited 1 because existing budgets are exceeded:

dev control home.page_tag p95 (budget 50 ms) idle.cpu_pct (budget 0.1%)
c1-devA 63.906 ms 0.5167%
c2-devB 60.7 ms 0.53%

The remaining two controls and candidate ABAB are still running/queued. These are baseline budget failures; they are not evidence of a candidate regression. Final reporting will include every metric's candidate delta and the control spread.

Final head 38d99d2d is pinned in both dev-01 worktrees. Its gate rerun and release rebuild are waiting through ~/bin/slot behind the renewed train; the earlier complete workspace test passed on d5222549, and the two rustdoc link errors from that run are fixed in 38d99d2d. No implementation changes or merge performed.

perf control update (unchanged dev 9377d711, both shared perf locks held, perf-01): the first two dev-vs-dev invocations completed every scenario without failures. Both exited 1 because existing budgets are exceeded: | dev control | home.page_tag p95 (budget 50 ms) | idle.cpu_pct (budget 0.1%) | |---|---:|---:| | c1-devA | 63.906 ms | 0.5167% | | c2-devB | 60.7 ms | 0.53% | The remaining two controls and candidate ABAB are still running/queued. These are baseline budget failures; they are not evidence of a candidate regression. Final reporting will include every metric's candidate delta and the control spread. Final head 38d99d2d is pinned in both dev-01 worktrees. Its gate rerun and release rebuild are waiting through ~/bin/slot behind the renewed train; the earlier complete workspace test passed on d5222549, and the two rustdoc link errors from that run are fixed in 38d99d2d. No implementation changes or merge performed.
Author
Owner

perf results for head 38d99d2d5d3a0102f457d2e8547faa7f510d3445 versus dev 9377d711217532a44973edcf63c2af0b7f7969d8.

perf is not green. all eight invocations completed every scenario without failures, but all exited 1 on the existing home.page_tag and idle.cpu_pct budgets, including every unchanged-dev control. Five metrics also have at least one slower candidate quantile beyond the full observed dev-control range: home.page p95 (+71.74%), mem.after_opens p95 (+5.17%), shutdown p50 (+0.40%), sync.round_trip p50/p95 (+18.85%/+8.10%), and sync.save_ack p50 (+3.80%). The control range is descriptive, not a statistical confidence bound. These results do not establish flat-or-better performance, so no perf pass or merge recommendation is claimed.

Measurements ran on perf-01 with the shared ~/bin/perf-lock acquired on perf-01 first, then perf-02, held together for the entire control and candidate session. Dev-vs-dev ABAB (c1-devA, c2-devB, c3-devA, c4-devB) preceded dev/head/dev/head (a1-dev, a2-head, a3-dev, a4-head). The same pinned dev harness and budget file were used throughout. Two invocations per candidate role give six warm runs, two cold runs, and two 300-second idle samples per revision at 100k notes. No frame timing was measured. SHA256 values were checked after relaying the dev-01 builds through the control host.

Exact command per invocation, from ~/perf/pr929 on perf-01:

./dev/calternal-perf --bin "$PWD/$label/calternal" --work "$PWD/work" --sizes 100k --runs 3 --cold-runs 1 --idle-secs 300 --budgets "$PWD/budgets.json" --gate --json "$PWD/reports/$run.json" --md "$PWD/reports/$run.md"

Both holder units are now stopped and verified inactive; the 100k fixture/work directories were removed before releasing the locks. Raw JSON/Markdown, logs, before/after machine snapshots, scripts, hashes, budgets and the derived comparison are attached: perf results ZIP. Final workspace gate table follows when the queued test/doc run completes.

PR 929 perf comparison

median of each role's two invocation summaries; each invocation has 3 warm runs and 1 cold run; control spread is the full min-to-max range of four dev-control invocation summaries, not a confidence interval.

51 metrics; all eight invocations completed without scenario failures.

Budget failures

  • c1-devA: home.page_tag (p95 63.9061 > 50); idle.cpu_pct (p95 0.516663 > 0.1)
  • c2-devB: home.page_tag (p95 60.7479 > 50); idle.cpu_pct (p95 0.526663 > 0.1)
  • c3-devA: home.page_tag (p95 61.7474 > 50); idle.cpu_pct (p95 0.513332 > 0.1)
  • c4-devB: home.page_tag (p95 59.8924 > 50); idle.cpu_pct (p95 0.519998 > 0.1)
  • a1-dev: home.page_tag (p95 61.0645 > 50); idle.cpu_pct (p95 0.523331 > 0.1)
  • a2-head: home.page_tag (p95 58.5705 > 50); idle.cpu_pct (p95 0.523331 > 0.1)
  • a3-dev: home.page_tag (p95 61.8886 > 50); idle.cpu_pct (p95 0.523332 > 0.1)
  • a4-head: home.page_tag (p95 61.569 > 50); idle.cpu_pct (p95 0.519998 > 0.1)

Deltas for every metric

metric unit dev p50 → head p50 Δ p50 dev p95 → head p95 Δ p95 dev/dev control Δ p50 / p95 control p50 / p95 range beyond observed control range
cold.disk_written MB 1918.6 → 1918.9 +0.01% 1918.6 → 1918.9 +0.01% -0.01% / -0.01% 1.1018 / 1.1018
cold.first_page ms 1689.3 → 1605.1 -4.99% 1689.3 → 1605.1 -4.99% +2.96% / +2.96% 125.65 / 125.65
cold.index s 15.531 → 15.312 -1.41% 15.531 → 15.312 -1.41% +0.56% / +0.56% 0.39479 / 0.39479
cold.mem_peak MB 292.8 → 288.93 -1.32% 292.8 → 288.93 -1.32% +1.34% / +1.34% 7.2617 / 7.2617
cold.notes_per_s notes/s 6445.6 → 6532.1 +1.34% 6445.6 → 6532.1 +1.34% -0.57% / -0.57% 171.22 / 171.22
cold.startup ms 17.399 → 16.218 -6.79% 17.399 → 16.218 -6.79% +14.85% / +14.85% 4.3809 / 4.3809
home.first_page ms 3.6607 → 3.6667 +0.16% 4.1861 → 4.2706 +2.02% -13.49% / -37.30% 0.84378 / 2.9921
home.page ms 0.94903 → 1.1075 +16.70% 1.5498 → 2.6616 +71.74% -13.11% / -16.45% 0.25114 / 0.6971 p95
home.page_big ms 18.034 → 18.313 +1.55% 19.002 → 21.138 +11.24% -2.95% / -12.62% 0.83261 / 6.0369
home.page_next ms 0.81098 → 0.73479 -9.40% 1.3138 → 1.0816 -17.68% +5.14% / +22.58% 0.086912 / 0.31646
home.page_tag ms 56.935 → 56.339 -1.05% 61.477 → 60.07 -2.29% -0.43% / -3.99% 1.7597 / 4.0137
home.page_title ms 0.71753 → 0.91172 +27.06% 0.97476 → 1.2583 +29.09% -19.78% / -35.91% 0.44029 / 0.64018
idle.cpu_pct % 0.52333 → 0.52166 -0.32% 0.52333 → 0.52166 -0.32% +1.62% / +1.62% 0.013332 / 0.013332
idle.cpu_ticks ticks 157 → 156.5 -0.32% 157 → 156.5 -0.32% +1.62% / +1.62% 4 / 4
idle.rss MB 75.723 → 77.906 +2.88% 75.723 → 77.906 +2.88% +9.67% / +9.67% 13.605 / 13.605
idle.threads count 13 → 13 +0.00% 13 → 13 +0.00% +0.00% / +0.00% 0 / 0
idle.wakeups_per_s /s 0.088333 → 0.063333 -28.30% 0.088333 → 0.063333 -28.30% -2.22% / -2.22% 0.036666 / 0.036666
journal.catch_up ms 276.51 → 280.02 +1.27% 306.39 → 294.82 -3.78% +0.96% / +3.08% 6.9977 / 15.547
journal.entries count 1.0019e+05 → 1.0019e+05 +0.00% 1.0037e+05 → 1.0037e+05 +0.00% +0.00% / +0.00% 0 / 1
journal.page ms 2.4491 → 2.4685 +0.79% 2.8397 → 2.8736 +1.19% +0.96% / +1.81% 0.046036 / 0.1985
load.typing_cpu_pct % 1.1333 → 1.1416 +0.74% 1.1333 → 1.1416 +0.74% +0.00% / +0.00% 0.066657 / 0.066657
load.typing_wakeups_per_s /s 57.799 → 58.115 +0.55% 57.799 → 58.115 +0.55% -0.40% / -0.40% 0.51611 / 0.51611
mem.after_first_page MB 23.439 → 23.443 +0.02% 23.652 → 23.975 +1.36% -1.83% / -3.57% 0.57031 / 1.3438
mem.after_opens MB 93.848 → 96.174 +2.48% 96.607 → 101.6 +5.17% -0.88% / +1.18% 3.0469 / 3.1211 p95
mem.after_search MB 113.93 → 108.97 -4.35% 119.6 → 119.13 -0.39% +1.44% / +5.41% 7.75 / 19.426
mem.idle MB 19.338 → 19.672 +1.73% 20.648 → 20.576 -0.35% -4.28% / -7.84% 1.8789 / 2.2812
mem.peak MB 124.56 → 123.97 -0.48% 126.66 → 129.59 +2.31% -1.46% / +0.11% 3.6445 / 3.8125
open.api_get ms 2.5776 → 2.5548 -0.89% 7.2729 → 4.7509 -34.68% +0.07% / -52.40% 0.025869 / 5.5599
open.long_note ms 55.822 → 54.342 -2.65% 58.673 → 64.478 +9.89% +11.98% / +10.97% 8.1269 / 11.37
open.note ms 0.70537 → 0.71868 +1.89% 1.3873 → 1.4311 +3.16% -1.22% / -5.96% 0.051247 / 0.088746
search.catch_up s 2.0056 → 2.0054 -0.01% 2.0059 → 2.0057 -0.01% -0.02% / -0.01% 0.00071084 / 0.00035044
search.first_query ms 5.5244 → 4.6116 -16.52% 20.485 → 19.352 -5.53% +15.91% / +3.41% 0.99031 / 8.5367
search.query ms 1.7722 → 1.6952 -4.34% 4.0246 → 3.8023 -5.52% -2.44% / -7.47% 0.14729 / 0.63883
shutdown ms 84.86 → 85.198 +0.40% 138.33 → 106.26 -23.18% +0.18% / -2.53% 0.18218 / 26.555 p50
startup.healthz ms 5.489 → 4.9788 -9.29% 6.6208 → 5.818 -12.12% -24.35% / -23.96% 1.9962 / 3.9286
storm.converge ms 173.06 → 174.9 +1.06% 173.66 → 176.54 +1.66% -2.91% / -0.81% 11.383 / 4.808
storm.disk_written MB 41.914 → 41.976 +0.15% 44.493 → 45.361 +1.95% +3.06% / -1.03% 2.4781 / 1.5237
storm.dropped_clients count 0 → 0 +0.00% 0 → 0 +0.00% +0.00% / +0.00% 0 / 0
storm.edits_per_s edits/s 5677.3 → 5898.6 +3.90% 5980.6 → 6015.1 +0.58% +0.02% / +0.49% 131.14 / 131.34
storm.outside_edits count 4 → 4 +0.00% 4 → 4 +0.00% +0.00% / +0.00% 0 / 0
storm.save_ack ms 4.5841 → 4.4896 -2.06% 9.2969 → 8.5077 -8.49% -0.37% / +1.47% 0.034695 / 1.5346
storm.typing s 1.7614 → 1.6954 -3.75% 1.8328 → 1.7982 -1.89% -0.03% / -0.35% 0.038775 / 0.019999
sync.durable_write ms 15.274 → 15.141 -0.87% 19.57 → 21.532 +10.02% +1.48% / +9.92% 0.42734 / 2.8929
sync.round_trip ms 0.1879 → 0.22332 +18.85% 0.32037 → 0.34632 +8.10% +8.44% / +3.26% 0.023224 / 0.012134 p50, p95
sync.save_ack ms 2.3682 → 2.4581 +3.80% 3.8412 → 5.1413 +33.85% +2.05% / +60.17% 0.062628 / 3.0628 p50
trash.delete ms 64.811 → 66.11 +2.00% 88.447 → 105.57 +19.36% -1.21% / -5.59% 3.1847 / 18.953
trash.forget ms 7.5306 → 7.5178 -0.17% 9.5424 → 15.004 +57.24% +0.23% / -22.47% 0.054192 / 8.7298
trash.restore ms 55.254 → 57.079 +3.30% 91.615 → 89.787 -2.00% +2.58% / +12.73% 2.4957 / 21.151
uploads.response ms 101.11 → 100.89 -0.22% 109.86 → 113.56 +3.36% +0.81% / -0.14% 2.2238 / 4.7603
uploads.round_trip ms 0.98199 → 0.98438 +0.24% 1.303 → 1.2842 -1.45% +0.77% / -1.65% 0.081872 / 0.036849
uploads.save_ack ms 3.2064 → 3.1708 -1.11% 5.8445 → 6.0529 +3.57% -0.03% / +5.53% 0.065593 / 0.68675
perf results for head `38d99d2d5d3a0102f457d2e8547faa7f510d3445` versus dev `9377d711217532a44973edcf63c2af0b7f7969d8`. **perf is not green.** all eight invocations completed every scenario without failures, but all exited 1 on the existing `home.page_tag` and `idle.cpu_pct` budgets, including every unchanged-dev control. Five metrics also have at least one slower candidate quantile beyond the full observed dev-control range: `home.page` p95 (+71.74%), `mem.after_opens` p95 (+5.17%), `shutdown` p50 (+0.40%), `sync.round_trip` p50/p95 (+18.85%/+8.10%), and `sync.save_ack` p50 (+3.80%). The control range is descriptive, not a statistical confidence bound. These results do not establish flat-or-better performance, so no perf pass or merge recommendation is claimed. Measurements ran on perf-01 with the shared `~/bin/perf-lock` acquired on perf-01 first, then perf-02, held together for the entire control and candidate session. Dev-vs-dev ABAB (`c1-devA`, `c2-devB`, `c3-devA`, `c4-devB`) preceded dev/head/dev/head (`a1-dev`, `a2-head`, `a3-dev`, `a4-head`). The same pinned dev harness and budget file were used throughout. Two invocations per candidate role give six warm runs, two cold runs, and two 300-second idle samples per revision at 100k notes. No frame timing was measured. SHA256 values were checked after relaying the dev-01 builds through the control host. Exact command per invocation, from `~/perf/pr929` on perf-01: ```sh ./dev/calternal-perf --bin "$PWD/$label/calternal" --work "$PWD/work" --sizes 100k --runs 3 --cold-runs 1 --idle-secs 300 --budgets "$PWD/budgets.json" --gate --json "$PWD/reports/$run.json" --md "$PWD/reports/$run.md" ``` Both holder units are now stopped and verified inactive; the 100k fixture/work directories were removed before releasing the locks. Raw JSON/Markdown, logs, before/after machine snapshots, scripts, hashes, budgets and the derived comparison are attached: [perf results ZIP](https://git.kayg.org/attachments/eacf227a-5d99-4b5e-9ed4-84fda7c42f5b). Final workspace gate table follows when the queued test/doc run completes. # PR 929 perf comparison median of each role's two invocation summaries; each invocation has 3 warm runs and 1 cold run; control spread is the full min-to-max range of four dev-control invocation summaries, not a confidence interval. 51 metrics; all eight invocations completed without scenario failures. ## Budget failures - c1-devA: home.page_tag (p95 63.9061 > 50); idle.cpu_pct (p95 0.516663 > 0.1) - c2-devB: home.page_tag (p95 60.7479 > 50); idle.cpu_pct (p95 0.526663 > 0.1) - c3-devA: home.page_tag (p95 61.7474 > 50); idle.cpu_pct (p95 0.513332 > 0.1) - c4-devB: home.page_tag (p95 59.8924 > 50); idle.cpu_pct (p95 0.519998 > 0.1) - a1-dev: home.page_tag (p95 61.0645 > 50); idle.cpu_pct (p95 0.523331 > 0.1) - a2-head: home.page_tag (p95 58.5705 > 50); idle.cpu_pct (p95 0.523331 > 0.1) - a3-dev: home.page_tag (p95 61.8886 > 50); idle.cpu_pct (p95 0.523332 > 0.1) - a4-head: home.page_tag (p95 61.569 > 50); idle.cpu_pct (p95 0.519998 > 0.1) ## Deltas for every metric | metric | unit | dev p50 → head p50 | Δ p50 | dev p95 → head p95 | Δ p95 | dev/dev control Δ p50 / p95 | control p50 / p95 range | beyond observed control range | |---|---|---:|---:|---:|---:|---:|---:|---| | cold.disk_written | MB | 1918.6 → 1918.9 | +0.01% | 1918.6 → 1918.9 | +0.01% | -0.01% / -0.01% | 1.1018 / 1.1018 | | | cold.first_page | ms | 1689.3 → 1605.1 | -4.99% | 1689.3 → 1605.1 | -4.99% | +2.96% / +2.96% | 125.65 / 125.65 | | | cold.index | s | 15.531 → 15.312 | -1.41% | 15.531 → 15.312 | -1.41% | +0.56% / +0.56% | 0.39479 / 0.39479 | | | cold.mem_peak | MB | 292.8 → 288.93 | -1.32% | 292.8 → 288.93 | -1.32% | +1.34% / +1.34% | 7.2617 / 7.2617 | | | cold.notes_per_s | notes/s | 6445.6 → 6532.1 | +1.34% | 6445.6 → 6532.1 | +1.34% | -0.57% / -0.57% | 171.22 / 171.22 | | | cold.startup | ms | 17.399 → 16.218 | -6.79% | 17.399 → 16.218 | -6.79% | +14.85% / +14.85% | 4.3809 / 4.3809 | | | home.first_page | ms | 3.6607 → 3.6667 | +0.16% | 4.1861 → 4.2706 | +2.02% | -13.49% / -37.30% | 0.84378 / 2.9921 | | | home.page | ms | 0.94903 → 1.1075 | +16.70% | 1.5498 → 2.6616 | +71.74% | -13.11% / -16.45% | 0.25114 / 0.6971 | p95 | | home.page_big | ms | 18.034 → 18.313 | +1.55% | 19.002 → 21.138 | +11.24% | -2.95% / -12.62% | 0.83261 / 6.0369 | | | home.page_next | ms | 0.81098 → 0.73479 | -9.40% | 1.3138 → 1.0816 | -17.68% | +5.14% / +22.58% | 0.086912 / 0.31646 | | | home.page_tag | ms | 56.935 → 56.339 | -1.05% | 61.477 → 60.07 | -2.29% | -0.43% / -3.99% | 1.7597 / 4.0137 | | | home.page_title | ms | 0.71753 → 0.91172 | +27.06% | 0.97476 → 1.2583 | +29.09% | -19.78% / -35.91% | 0.44029 / 0.64018 | | | idle.cpu_pct | % | 0.52333 → 0.52166 | -0.32% | 0.52333 → 0.52166 | -0.32% | +1.62% / +1.62% | 0.013332 / 0.013332 | | | idle.cpu_ticks | ticks | 157 → 156.5 | -0.32% | 157 → 156.5 | -0.32% | +1.62% / +1.62% | 4 / 4 | | | idle.rss | MB | 75.723 → 77.906 | +2.88% | 75.723 → 77.906 | +2.88% | +9.67% / +9.67% | 13.605 / 13.605 | | | idle.threads | count | 13 → 13 | +0.00% | 13 → 13 | +0.00% | +0.00% / +0.00% | 0 / 0 | | | idle.wakeups_per_s | /s | 0.088333 → 0.063333 | -28.30% | 0.088333 → 0.063333 | -28.30% | -2.22% / -2.22% | 0.036666 / 0.036666 | | | journal.catch_up | ms | 276.51 → 280.02 | +1.27% | 306.39 → 294.82 | -3.78% | +0.96% / +3.08% | 6.9977 / 15.547 | | | journal.entries | count | 1.0019e+05 → 1.0019e+05 | +0.00% | 1.0037e+05 → 1.0037e+05 | +0.00% | +0.00% / +0.00% | 0 / 1 | | | journal.page | ms | 2.4491 → 2.4685 | +0.79% | 2.8397 → 2.8736 | +1.19% | +0.96% / +1.81% | 0.046036 / 0.1985 | | | load.typing_cpu_pct | % | 1.1333 → 1.1416 | +0.74% | 1.1333 → 1.1416 | +0.74% | +0.00% / +0.00% | 0.066657 / 0.066657 | | | load.typing_wakeups_per_s | /s | 57.799 → 58.115 | +0.55% | 57.799 → 58.115 | +0.55% | -0.40% / -0.40% | 0.51611 / 0.51611 | | | mem.after_first_page | MB | 23.439 → 23.443 | +0.02% | 23.652 → 23.975 | +1.36% | -1.83% / -3.57% | 0.57031 / 1.3438 | | | mem.after_opens | MB | 93.848 → 96.174 | +2.48% | 96.607 → 101.6 | +5.17% | -0.88% / +1.18% | 3.0469 / 3.1211 | p95 | | mem.after_search | MB | 113.93 → 108.97 | -4.35% | 119.6 → 119.13 | -0.39% | +1.44% / +5.41% | 7.75 / 19.426 | | | mem.idle | MB | 19.338 → 19.672 | +1.73% | 20.648 → 20.576 | -0.35% | -4.28% / -7.84% | 1.8789 / 2.2812 | | | mem.peak | MB | 124.56 → 123.97 | -0.48% | 126.66 → 129.59 | +2.31% | -1.46% / +0.11% | 3.6445 / 3.8125 | | | open.api_get | ms | 2.5776 → 2.5548 | -0.89% | 7.2729 → 4.7509 | -34.68% | +0.07% / -52.40% | 0.025869 / 5.5599 | | | open.long_note | ms | 55.822 → 54.342 | -2.65% | 58.673 → 64.478 | +9.89% | +11.98% / +10.97% | 8.1269 / 11.37 | | | open.note | ms | 0.70537 → 0.71868 | +1.89% | 1.3873 → 1.4311 | +3.16% | -1.22% / -5.96% | 0.051247 / 0.088746 | | | search.catch_up | s | 2.0056 → 2.0054 | -0.01% | 2.0059 → 2.0057 | -0.01% | -0.02% / -0.01% | 0.00071084 / 0.00035044 | | | search.first_query | ms | 5.5244 → 4.6116 | -16.52% | 20.485 → 19.352 | -5.53% | +15.91% / +3.41% | 0.99031 / 8.5367 | | | search.query | ms | 1.7722 → 1.6952 | -4.34% | 4.0246 → 3.8023 | -5.52% | -2.44% / -7.47% | 0.14729 / 0.63883 | | | shutdown | ms | 84.86 → 85.198 | +0.40% | 138.33 → 106.26 | -23.18% | +0.18% / -2.53% | 0.18218 / 26.555 | p50 | | startup.healthz | ms | 5.489 → 4.9788 | -9.29% | 6.6208 → 5.818 | -12.12% | -24.35% / -23.96% | 1.9962 / 3.9286 | | | storm.converge | ms | 173.06 → 174.9 | +1.06% | 173.66 → 176.54 | +1.66% | -2.91% / -0.81% | 11.383 / 4.808 | | | storm.disk_written | MB | 41.914 → 41.976 | +0.15% | 44.493 → 45.361 | +1.95% | +3.06% / -1.03% | 2.4781 / 1.5237 | | | storm.dropped_clients | count | 0 → 0 | +0.00% | 0 → 0 | +0.00% | +0.00% / +0.00% | 0 / 0 | | | storm.edits_per_s | edits/s | 5677.3 → 5898.6 | +3.90% | 5980.6 → 6015.1 | +0.58% | +0.02% / +0.49% | 131.14 / 131.34 | | | storm.outside_edits | count | 4 → 4 | +0.00% | 4 → 4 | +0.00% | +0.00% / +0.00% | 0 / 0 | | | storm.save_ack | ms | 4.5841 → 4.4896 | -2.06% | 9.2969 → 8.5077 | -8.49% | -0.37% / +1.47% | 0.034695 / 1.5346 | | | storm.typing | s | 1.7614 → 1.6954 | -3.75% | 1.8328 → 1.7982 | -1.89% | -0.03% / -0.35% | 0.038775 / 0.019999 | | | sync.durable_write | ms | 15.274 → 15.141 | -0.87% | 19.57 → 21.532 | +10.02% | +1.48% / +9.92% | 0.42734 / 2.8929 | | | sync.round_trip | ms | 0.1879 → 0.22332 | +18.85% | 0.32037 → 0.34632 | +8.10% | +8.44% / +3.26% | 0.023224 / 0.012134 | p50, p95 | | sync.save_ack | ms | 2.3682 → 2.4581 | +3.80% | 3.8412 → 5.1413 | +33.85% | +2.05% / +60.17% | 0.062628 / 3.0628 | p50 | | trash.delete | ms | 64.811 → 66.11 | +2.00% | 88.447 → 105.57 | +19.36% | -1.21% / -5.59% | 3.1847 / 18.953 | | | trash.forget | ms | 7.5306 → 7.5178 | -0.17% | 9.5424 → 15.004 | +57.24% | +0.23% / -22.47% | 0.054192 / 8.7298 | | | trash.restore | ms | 55.254 → 57.079 | +3.30% | 91.615 → 89.787 | -2.00% | +2.58% / +12.73% | 2.4957 / 21.151 | | | uploads.response | ms | 101.11 → 100.89 | -0.22% | 109.86 → 113.56 | +3.36% | +0.81% / -0.14% | 2.2238 / 4.7603 | | | uploads.round_trip | ms | 0.98199 → 0.98438 | +0.24% | 1.303 → 1.2842 | -1.45% | +0.77% / -1.65% | 0.081872 / 0.036849 | | | uploads.save_ack | ms | 3.2064 → 3.1708 | -1.11% | 5.8445 → 6.0529 | +3.57% | -0.03% / +5.53% | 0.065593 / 0.68675 | |
Author
Owner

head 199f1c13ea282d353d81f100b9a5306cfd3129cc fixes seven existing dev rustdoc diagnostics in comments only (notes: private links and ambiguous format; contacts: unescaped <calternal-id> placeholders). This adds seven one-line comment edits outside the original seven crates because the requested workspace-wide warning-denied doc gate encounters them. No implementation or visibility change. Pushed atomically.

On 38d99d2d, the final pinned fmt, clippy and full workspace test gates all passed; doc exited 101 on those pre-existing diagnostics. The comments-only token check now covers 28 Rust files with zero differences. Rustdoc is rerunning first, followed by final-head gates and a release hash check. The final release hash check will determine whether the completed perf measurements cover the updated head byte-for-byte. No merge performed.

head `199f1c13ea282d353d81f100b9a5306cfd3129cc` fixes seven existing dev rustdoc diagnostics in comments only (notes: private links and ambiguous `format`; contacts: unescaped `<calternal-id>` placeholders). This adds seven one-line comment edits outside the original seven crates because the requested workspace-wide warning-denied doc gate encounters them. No implementation or visibility change. Pushed atomically. On 38d99d2d, the final pinned fmt, clippy and full workspace test gates all passed; doc exited 101 on those pre-existing diagnostics. The comments-only token check now covers 28 Rust files with zero differences. Rustdoc is rerunning first, followed by final-head gates and a release hash check. The final release hash check will determine whether the completed perf measurements cover the updated head byte-for-byte. No merge performed.
Author
Owner

final gate table for 35e233dda8, against dev 9377d71121. PR remains open and unmerged; no reviews are posted. Overall status: perf is not green.

gate exact command result
strict comments-only git diff origin/dev...HEAD plus python3 /tmp/pr929-tokens.py PASS: 35 Rust files, zero non-comment token changes; lexer handles strings, raw strings, chars and nested block comments
dev sync git merge origin/dev included by merge 7c886f30, pushed; final fetch reports git rev-list --left-right --count origin/dev...HEAD = 0 13
format cargo fmt --check PASS, exit 0
clippy cargo clippy --workspace --all-targets -- -D warnings PASS, exit 0
workspace tests cargo test --workspace PASS on rerun, exit 0; Cargo summaries total 1,474 passed, 0 failed, 22 ignored
rustdoc RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps PASS, exit 0
release build cargo build --release --locked --bin calternal --bin calternal-perf --bin markdown-worker PASS, exit 0
release identity vs dev strip --strip-debug <binary>; sha256sum <binary>; cmp -s <dev-binary> <head-binary> DIFFERENT: only embedded source line numbers, detailed below; perf exemption not used
perf ./dev/calternal-perf --bin "$PWD/$label/calternal" --work "$PWD/work" --sizes 100k --runs 3 --cold-runs 1 --idle-secs 300 --budgets "$PWD/budgets.json" --gate --json "$PWD/reports/$run.json" --md "$PWD/reports/$run.md" NOT GREEN: every invocation exited 1 on existing budgets; five metrics have slower quantiles beyond the observed control range

All Cargo commands ran on dev-01 in owned VM worktrees with Nix, CARGO_BUILD_JOBS=4 and ~/bin/slot. The gate batch used nix develop -c bash -c '~/bin/slot bash ~/pr929-final-inner.sh'; the release build used nix develop -c bash -c 'export CARGO_BUILD_JOBS=4; ~/bin/slot cargo build --release --locked --bin calternal --bin calternal-perf --bin markdown-worker'. No build/test ran on the control host.

The first test attempt on this head exited 101 in kill_nine_mid_append_on_a_long_note: std::fs::read(path) returned NotFound after an existence check. Ten separate candidate invocations and ten dev invocations of cargo test -p calternal --test notes_crash kill_nine_mid_append_on_a_long_note -- --exact --nocapture all passed; then the full candidate workspace rerun passed. Stability follow-up: #955. The initial failure remains in the attached logs; it is not hidden by the final passing result.

Corrections are pushed atomically: removed the seven added lint attributes (47c106c3); kept new prefs explanations out of schema-derived type/field docs to preserve the action contract (d5222549); fixed two batch rustdoc links (38d99d2d); fixed 15 existing workspace documentation diagnostics in notes, contacts, tasks, contacts-actions and auth (199f1c13, 0579688e, 35e233dd). Those last changes are 15 one-line comment corrections in 14 additional files. No code, visibility, contract fixture or warning suppression changed. Final token digest: cda90d75c05d76f24b6616fd3a7d609aeb7128ead6ae5c8e0bf02856b73cd83f.

Stripped release SHA256 values:

binary dev final head
calternal b79f4a0d60f9cc3ae6b72866b3d9aab86966c1085c238ad8267521efc0e98e68 0dca9a8510027589e1297b92407f87083e62c7d976c2f8383e1818b727c760e5
calternal-perf 677df49109343d668111b4debe086ba0db89428b9268ed09fa4f9433fa424bb1 30b897e5ee40391ac34b55c263d0ea10d147116389e85fda23e3b2837f34d411
markdown-worker 5db4a8f048ca957b398cf78ca3ee6fad963769c403501cbe9be331e661344f59 62afb986bea1522ded7d3706085cc8a5cb6980d9020bd94751d4af42c82dbb48

ELF validation against the final source finds only .data.rel.ro changed: 119 source line numbers in calternal, 4 in calternal-perf and 85 in markdown-worker. .text, .rodata, symbols and all other sections are byte-identical. Every decoded old/new source line and column matches. The final-head binaries are byte-identical to the measured 38d99d2d candidate, so the completed ABAB report, all 51 deltas and raw perf artifacts apply to this head without another measurement. Both shared perf locks were held throughout the dev-vs-dev control and candidate ABAB, then stopped and verified inactive. No flat-or-better claim is made: existing page-tag/idle budgets fail on dev and candidate, and home.page, mem.after_opens, shutdown, sync.round_trip and sync.save_ack have the slower quantiles listed in that report.

Gate evidence ZIP contains complete Cargo logs, the first failure, repeat logs, scripts, final summary, lexer/proof and ELF analysis. All owned jobs are finished; both perf locks are released; seeded perf Homes and both throwaway VM target directories (about 12.8 GiB) are removed. Working trees are clean. Remaining risks are the non-green perf evidence and the intermittent test tracked in #955. Never merged.

final gate table for **35e233dda853836d2922cde00c4d017465eb1628**, against dev **9377d711217532a44973edcf63c2af0b7f7969d8**. PR remains open and unmerged; no reviews are posted. Overall status: **perf is not green**. | gate | exact command | result | |---|---|---| | strict comments-only | `git diff origin/dev...HEAD` plus `python3 /tmp/pr929-tokens.py` | PASS: 35 Rust files, zero non-comment token changes; lexer handles strings, raw strings, chars and nested block comments | | dev sync | `git merge origin/dev` | included by merge 7c886f30, pushed; final fetch reports `git rev-list --left-right --count origin/dev...HEAD` = `0 13` | | format | `cargo fmt --check` | PASS, exit 0 | | clippy | `cargo clippy --workspace --all-targets -- -D warnings` | PASS, exit 0 | | workspace tests | `cargo test --workspace` | PASS on rerun, exit 0; Cargo summaries total 1,474 passed, 0 failed, 22 ignored | | rustdoc | `RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps` | PASS, exit 0 | | release build | `cargo build --release --locked --bin calternal --bin calternal-perf --bin markdown-worker` | PASS, exit 0 | | release identity vs dev | `strip --strip-debug <binary>`; `sha256sum <binary>`; `cmp -s <dev-binary> <head-binary>` | DIFFERENT: only embedded source line numbers, detailed below; perf exemption not used | | perf | `./dev/calternal-perf --bin "$PWD/$label/calternal" --work "$PWD/work" --sizes 100k --runs 3 --cold-runs 1 --idle-secs 300 --budgets "$PWD/budgets.json" --gate --json "$PWD/reports/$run.json" --md "$PWD/reports/$run.md"` | NOT GREEN: every invocation exited 1 on existing budgets; five metrics have slower quantiles beyond the observed control range | All Cargo commands ran on **dev-01** in owned VM worktrees with Nix, `CARGO_BUILD_JOBS=4` and `~/bin/slot`. The gate batch used `nix develop -c bash -c '~/bin/slot bash ~/pr929-final-inner.sh'`; the release build used `nix develop -c bash -c 'export CARGO_BUILD_JOBS=4; ~/bin/slot cargo build --release --locked --bin calternal --bin calternal-perf --bin markdown-worker'`. No build/test ran on the control host. The first test attempt on this head exited 101 in `kill_nine_mid_append_on_a_long_note`: `std::fs::read(path)` returned NotFound after an existence check. Ten separate candidate invocations and ten dev invocations of `cargo test -p calternal --test notes_crash kill_nine_mid_append_on_a_long_note -- --exact --nocapture` all passed; then the full candidate workspace rerun passed. Stability follow-up: [#955](https://git.kayg.org/kayg/calternal/issues/955). The initial failure remains in the attached logs; it is not hidden by the final passing result. Corrections are pushed atomically: removed the seven added lint attributes (47c106c3); kept new prefs explanations out of schema-derived type/field docs to preserve the action contract (d5222549); fixed two batch rustdoc links (38d99d2d); fixed 15 existing workspace documentation diagnostics in notes, contacts, tasks, contacts-actions and auth (199f1c13, 0579688e, 35e233dd). Those last changes are 15 one-line comment corrections in 14 additional files. No code, visibility, contract fixture or warning suppression changed. Final token digest: `cda90d75c05d76f24b6616fd3a7d609aeb7128ead6ae5c8e0bf02856b73cd83f`. Stripped release SHA256 values: | binary | dev | final head | |---|---|---| | calternal | `b79f4a0d60f9cc3ae6b72866b3d9aab86966c1085c238ad8267521efc0e98e68` | `0dca9a8510027589e1297b92407f87083e62c7d976c2f8383e1818b727c760e5` | | calternal-perf | `677df49109343d668111b4debe086ba0db89428b9268ed09fa4f9433fa424bb1` | `30b897e5ee40391ac34b55c263d0ea10d147116389e85fda23e3b2837f34d411` | | markdown-worker | `5db4a8f048ca957b398cf78ca3ee6fad963769c403501cbe9be331e661344f59` | `62afb986bea1522ded7d3706085cc8a5cb6980d9020bd94751d4af42c82dbb48` | ELF validation against the final source finds only `.data.rel.ro` changed: 119 source line numbers in calternal, 4 in calternal-perf and 85 in markdown-worker. `.text`, `.rodata`, symbols and all other sections are byte-identical. Every decoded old/new source line and column matches. The final-head binaries are byte-identical to the measured 38d99d2d candidate, so the [completed ABAB report, all 51 deltas and raw perf artifacts](https://git.kayg.org/kayg/calternal/pulls/929#issuecomment-79627) apply to this head without another measurement. Both shared perf locks were held throughout the dev-vs-dev control and candidate ABAB, then stopped and verified inactive. No flat-or-better claim is made: existing page-tag/idle budgets fail on dev and candidate, and home.page, mem.after_opens, shutdown, sync.round_trip and sync.save_ack have the slower quantiles listed in that report. [Gate evidence ZIP](https://git.kayg.org/attachments/8a834adb-0ecc-4531-a4c4-84741c0f6288) contains complete Cargo logs, the first failure, repeat logs, scripts, final summary, lexer/proof and ELF analysis. All owned jobs are finished; both perf locks are released; seeded perf Homes and both throwaway VM target directories (about 12.8 GiB) are removed. Working trees are clean. Remaining risks are the non-green perf evidence and the intermittent test tracked in #955. **Never merged.**
Author
Owner

Orchestrator decision: no perf change, by proof.

  • .text, .rodata and the symbols are byte-identical to dev. Only the panic-location line numbers in .data.rel.ro differ, and the section sizes are equal.
  • So the program executes exactly the same instructions as dev. The quantile spread in the ABAB is measurement noise and can't come from this diff.
  • The page-tag and idle budgets fail on dev as well, so they are not from this PR.

I'll merge this after BM14e (#914) lands, so that BM14e's green run stays on the dev it was tested against. The crash-test flake is tracked in #955.

Orchestrator decision: **no perf change, by proof.** - `.text`, `.rodata` and the symbols are byte-identical to dev. Only the panic-location line numbers in `.data.rel.ro` differ, and the section sizes are equal. - So the program executes exactly the same instructions as dev. The quantile spread in the ABAB is measurement noise and can't come from this diff. - The page-tag and idle budgets fail on dev as well, so they are not from this PR. I'll merge this after BM14e (#914) lands, so that BM14e's green run stays on the dev it was tested against. The crash-test flake is tracked in #955.
Author
Owner

Landed in dev via ca7dead12c — closing.

Landed in dev via ca7dead12c6bc873e9932a1ae93b749e2c06326d — closing.
kayg closed this pull request 2026-11-07 17:53:06 +00:00
Some checks failed
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal!929
No description provided.