Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-25 11:48 UTC

scttfrdmn / go-notebook

A reactive notebook where the notebook is an ordinary Go package. A cell is a function; the dependency graph is derived from the type checker; it compiles to a single binary.

GoApache-2.0★ 0 stars⑂ 0 forkssince Jul 2026View on GitHub ↗

scttfrdmn/go-notebook holds a health index of 57 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (84/100) and lowest on Community & Adoption (24/100). It was last updated today. A single contributor accounts for most of its recent work.

57
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

57
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Scott FriedmanPersonal account
18 followers185 public repossince Dec 2012Amazon Web Services

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/scttfrdmn/go-notebookv0.5.0-55 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

69Moderate · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
1.4/36Commit cadence — 2/52 weeks with commits
18/18Commit volume — 157 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year157
human_commit_share1
days_since_last_push0
active_weeks_last_year2
How it's scored
27/27Ships releases — 5 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~0.3 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count5
latest_release_tagv0.5.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases0.3

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

24Critical · 18% of overall
How it's scored
0/60Stars — 0 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

58Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
41.5/46.8Issue resolution — 89% of issues closed
37.3/38.3PR acceptance — 156/160 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs156
open_issues9
closed_issues71
issue_closed_ratio0.887
closed_unmerged_prs4
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
9.2/25Owner reach — 18 followers of scttfrdmn
25/25Track record — 185 public repos, account ~13 yr old
Inputs used
followers18
owner_typeUser
is_verified
owner_loginscttfrdmn
public_repos185
account_age_days4,974
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 5 days ago
20/20Version history — 5 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/scttfrdmn/go-notebook
ecosystemsgo
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

84Good · 20% of overall
How it's scored
24/24CI workflows — 5 workflow(s)
24/24Tests present
16/16Linter config — .golangci.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

85Excellent
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 8 topics
10/10Wiki
Inputs used
topicsdataflow, go, golang, livecoding, notebook, reactive, repl, type-checker
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

44At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4.4

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

62Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
11/11Lint / format config — .golangci.yml
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileno
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
55/55Manageable file sizes — 0/281 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes53,319
source_files_sampled281
oversized_source_files0
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

0GitHub stars
1contributors
157commits, last 12 months
0days since last push
5releases
1bus factor
9open issues
Gopackage ecosystems

Data collection warnings

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

OpenSSF Scorecard 4.4 / 10
4.4aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-25 11:47 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 4
RegistryPackageVersion constraintManifest
Gogithub.com/alecthomas/chroma/v2v2.2.0go.mod
Gogithub.com/yuin/goldmarkv1.8.4go.mod
Gogithub.com/yuin/goldmark-highlighting/v2v2.0.0-20230729083705-37449abec8ccgo.mod
Gogolang.org/x/toolsv0.48.0go.mod
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "dataflow",
        "go",
        "golang",
        "livecoding",
        "notebook",
        "reactive",
        "repl",
        "type-checker"
      ],
      "is_fork": false,
      "size_kb": 8336,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 715172,
        "HTML": 67399,
        "Shell": 2419,
        "Makefile": 2201,
        "JavaScript": 25562
      },
      "pushed_at": "2026-07-25T05:15:03Z",
      "created_at": "2026-07-11T16:40:13Z",
      "owner_type": "User",
      "updated_at": "2026-07-25T05:15:22Z",
      "description": "A reactive notebook where the notebook is an ordinary Go package. A cell is a function; the dependency graph is derived from the type checker; it compiles to a single binary.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Scott Friedman",
      "type": "User",
      "login": "scttfrdmn",
      "company": "Amazon Web Services",
      "location": "Los Angeles, CA",
      "followers": 18,
      "avatar_url": "https://avatars.githubusercontent.com/u/3011922?v=4",
      "created_at": "2012-12-10T23:52:59Z",
      "is_verified": null,
      "public_repos": 185,
      "account_age_days": 4974
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-20T03:01:41Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-19T22:32:19Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-19T17:30:09Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-19T09:56:12Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-19T01:12:33Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "188f15c5d6d12f6d7fb92dc9b5f92437eeeb6e7c",
          "body": "…ipe) (#240)\n\nExplores the \"embed one notebook in another\" idea. Investigated both readings:\na true IMPORT (merged dependency graph) is the \"component model\" the paper's\n§69 forbids and would be a deep rewrite — the graph is derived from ONE\npackage's signatures via buildFromTypes(pkg.Types), welded\n[…]\nore build — the rule working as intended).\n\nNo engine graph change; rides the M11 port and the existing HTML escape hatch.\nSite build unchanged (it's a source recipe, like the other minimal examples).",
          "is_bot": false,
          "headline": "feat: embed a notebook in another as a live figure (?embed view + rec…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-25T05:15:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47ed77460ceaab4e2426704b2f8553eb3a27604c",
          "body": "…rt brief (#239)\n\n* docs: make run's auto-open-browser explicit in the build/run reference\n\nThe run verb's reference line said 'serves it in your browser' but didn't\nstate that it OPENS the browser (the quickstart says 'a browser opens', the\nreference only implied it via the --no-open flag). Spell i\n[…]\note to drop the cover-crop CSS once real art with no baked\nwhitespace lands). Producing the artwork itself is an illustration task; this\ndefines the slot and the spec so it can be made and dropped in.",
          "is_bot": false,
          "headline": "docs + site: explicit run->browser wording; fit hero illustration + a…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-22T03:40:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfa08f4fc66ed0a1c470f424bb33f6b2392374b4",
          "body": "The last #226 item. The 38-tile corpus is long; a filter helps a visitor find\ndemos by topic. Chose jump-to-section chips over a tag filter or search: the\ncorpus is ALREADY grouped into 8 curated sections (Controls, Linked views,\nPure recomputation, Documents in HTML, Typed units, Systems, Advanced \n[…]\nking a mid group → its 4 tiles; clicking \"All\" → all 38\nrestored with only \"All\" pressed. HTML parses.\n\nCloses the last open #226 item — no security or correctness work remains on the\nplatform review.",
          "is_bot": false,
          "headline": "site: jump-to-section filter chips on the corpus (#226) (#238)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-22T02:59:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ab397123360eb54859d289c3f1f310344621db3",
          "body": "The cross-USER layer above the DNS-rebinding Host guard (#235). That guard\nblocks a cross-origin browser (it can't forge Host), but on a shared host —\ngo-notebook's HPC target — any local PROCESS sends a real loopback Host and\nsails through. --token closes that: a caller that didn't read the readine\n[…]\n ports security section + the notebook-as-service\nreadiness contract (token rides the one line, forwarded opaquely).\n\nRemaining #226: the homepage example filter (UX). This was the last security\nitem.",
          "is_bot": false,
          "headline": "security: opt-in access token on the served port (#226) (#237)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-22T02:26:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a04694076b2430d9be02bb993084d5b8101407ea",
          "body": "…wave (#225 item 2) (#236)\n\nThe decision-free slice of snapshot-on-observe. Connecting to /events used to\nrun a full RunAll — and emit fans out to ALL subscribers, so a second tab\nrepainted the first, and a notebook with impure cells (file/time/rand) re-ran\nthem on the new client's behalf, changing \n[…]\naves for guaranteed state) the review asked for.\n\nRemaining on #225: the impure-refresh default (should a new observer force a\nfresh wave? ?initial=snapshot|recompute) — a behavioral-default decision.",
          "is_bot": false,
          "headline": "port: replay committed state to a new SSE client instead of a global …",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-22T01:45:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43cda1ed6e5de9e8528bde6f0338b743da7818fb",
          "body": "…opback Host (#226) (#235)\n\nCloses the hole I documented in #222's CORS fix: same-origin blocks a\ncross-origin page from READING /set+/events replies, but not from SENDING a\nPOST /set, and a page at evil.com can rebind its name to 127.0.0.1 to reach a\nlocalhost notebook (the browser sends the reques\n[…]\n\n\nRemaining #226 deferred item: the optional session token (changes the\nreadiness contract) and the homepage example filter (UX). This was the\nstandard, decision-free slice of the localhost hardening.",
          "is_bot": false,
          "headline": "security: DNS-rebinding defense — loopback-bound server requires a lo…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T21:55:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "314d35ac784af77599cf44340b01c451a59abfff",
          "body": "…ers as won't-fix (docs only) (#234)\n\nClosing out #224 by documenting the scope rather than swapping mechanisms —\nbecause investigation showed the proposed 'reconcile commit/dirty via\ndebug.ReadBuildInfo' would REGRESS, not improve:\n\n- BuildInfo's VCS fields are rich for the native build (go build r\n[…]\nh owned by whoever is\nauthoritative, rather than one hash straining to be all three. gitState comment\ncorrected to say dirty is whole-tree and matches vcs.modified. dirty doc row\nupdated. Closes #224.",
          "is_bot": false,
          "headline": "provenance: document the identity model; resolve #224's remaining lay…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T20:58:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9afa03566f81d14e22b9fe48535f3a468dfc77bf",
          "body": "… (#226) (#233)\n\nThe auditable-perf-links item of #226 turned up a 'running is not passing'\nfinding: the homepage said 'every number here reproduced in CI' (twice) — but\nCI ran NO benchmarks, and the two browser figures (~40 ms cold load, ~300 µs\nrepaint) have no measurement harness at all. A claim \n[…]\nected to #status, the real\n  heading over the table).\n\nVerified: bench smoke runs green locally (~2.5s, all 5 benchmarks); homepage\nHTML parses; no 'reproduced in CI' string remains; full suite green.",
          "is_bot": false,
          "headline": "perf: run the benchmark harness in CI; correct the homepage overclaim…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T20:07:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1516742e40196c1aaf3a038cd9240072abb145c6",
          "body": "The next layer of #224. sourceHash hashed the package's .go files but NOT its\ngo:embed'd data — so a dataset baked into the binary (embedded-data's\nsales.csv, and csv-native/sales-analysis/file-and-artifact/portfolio all use\ngo:embed) could change results with the artifact's identity unmoved. Real g\n[…]\ncgen + vet + lint green; interactive session load\nuntouched.\n\nStill open on #224: module graph (go.mod/versions) and a native artifact-bytes\nhash (sidecar — can't live inside the binary it describes).",
          "is_bot": false,
          "headline": "provenance: sourceHash now covers go:embed assets (#224) (#232)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T03:53:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "821a4e5c77a3e06fc0a9113625c9378f2b47443c",
          "body": "… a11y (#226) (#231)\n\nThe three self-contained items of #226 (the security tokens/Host-validation\nand the homepage filter are design/subjective — deferred, tracked on #226).\n\n- **/set body-size limit.** The served /set + /events port had NO request-size\n  bound (the 1 MiB cap was only on the supervi\n[…]\n Framed as the same care any hand-authored web UI needs\n  (not a framework obligation), with the docs site itself as the worked example.\n\nFull suite + wasm lane + docgen link check + vet + lint green.",
          "is_bot": false,
          "headline": "hardening + polish: /set body cap, pinned deploy toolchain, rendering…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T03:26:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d8fd1b96392fb7f08d5927300b829ddd5474de2",
          "body": "…#230)\n\nTwo of the three port-maturity items (snapshot-on-observe, item 2, deferred —\nit changes a behavioral default and wants its own call).\n\n## Item 1 — atomic multi-leaf edit\nSetting several related inputs (principal, rate, term) as separate edits ran\nseparate waves and exposed intermediate comb\n[…]\nadNotebook, setMany, atomic-set capability).\n\nItem 2 (snapshot-on-observe — decouple observation from recompute) stays open\non #225; it changes the /events-connect default and needs a design decision.",
          "is_bot": false,
          "headline": "port: atomic multi-leaf edit + component loader (#225, items 1 & 3) (…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T03:10:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98428fdf7fb6f7705bffae5974c8522437fd0f1b",
          "body": "… (#229)\n\nThe 'honest floor' of #224. The provenance reference called sourceHash the\nartifact's 'true identity' — an overclaim. Verified: sourceHash hashes ALL\npackage .go files (not just the marked one), so the review's worst fear (a\nsibling model.go changing results invisibly) does NOT hold. But i\n[…]\n0 build\nstamps toolVersion:v0.5.0 in --headless --json. TestToolVersionInProvenance\npins both directions + the emitted literal. webui footer shows it. Full suite +\nwasm lane + docgen link check green.",
          "is_bot": false,
          "headline": "provenance: add toolVersion + name sourceHash's scope honestly (#224)…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T02:28:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "242e41530f7bd14152b8a534274e9a72d55a2633",
          "body": "* check: report near-miss structural capability signatures (#223)\n\nA control-capability method named right but shaped wrong — Bounds() (int,int)\ninstead of Bounds() (float64,float64) — was matched by NAME by the analyzer\n(classified as a range), then silently dropped by the engine's runtime\ninterfac\n[…]\nsed the file beside it). Local tests passed\nbecause the file existed locally; CI on a clean checkout hit 'no such file'.\nThis tracks it. Caught by the test lane — the value of a clean-checkout CI run.",
          "is_bot": false,
          "headline": "check: report near-miss structural capability signatures (#223) (#228)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T02:05:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1056986b1969e49cb07cf22c67ad75ef9a0c480",
          "body": "Each verified against the code before changing; two were prose that was\nactually WRONG about the tool, not just imprecise.\n\n- authoring.md: the claim that duplicate result names / a renamed edge let\n  'check pass but build fail' is FALSE. check REJECTS both (exit 1) with a\n  pointed diagnostic — con\n[…]\nng\nat the design's 2x2, rather than flattening a deliberate distinction.\n\nDeeper items (provenance coverage #224, check near-miss signatures #223, port\nmaturity #225, hardening #226) filed separately.",
          "is_bot": false,
          "headline": "docs: verified doc-truth fixes from the platform re-review (#222) (#227)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T01:39:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46d0b81f48bd4606375775db078f35c988a9271d",
          "body": "client/example.mjs drives the JS client (client/notebook.js) against a real\nbuilt wasm notebook through the whole port surface — enumerate, capabilities,\nsubscribe, set, typed recompute, coherent snapshot — but it was only ever run\nby hand. That gap was named repeatedly across the #214 port-coherenc\n[…]\ny\nanti-pass held. Verified both directions: happy path exits 0; a tampered\nno-op set() exits 1 with 'ANTI-PASS FAIL'. Updated the header's run\ninstructions (dropped the stale GOROOT/PATH incantation).",
          "is_bot": false,
          "headline": "ci: run the JS client end-to-end against a real notebook (#221)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-21T00:47:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf40649d896db4d070615de1db1f01928c40d5bc",
          "body": "The port grew over releases (typed values, per-wave epochs, leaf types), and\na host had to call a method and catch the exception to learn what an older\n.wasm supports. This adds feature detection: nb.capabilities() and\nnb.can(cap).\n\nPer the design decision (probe + build-tied constants): the list is\n[…]\npabilities/can/subscribeEpoch + the settled/epoch event fields; JS-client\ndoc gains a Feature detection section.\n\nThis completes #214: all four port-coherence items shipped (3:#218, 1+2:#219,\n4:here).",
          "is_bot": false,
          "headline": "port: capability discovery on the JS client (#214, item 4) (#220)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T21:16:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95d05ffcbc65323e55734916f0c750eefd49c86e",
          "body": "… (#219)\n\nThe typed value stream (subscribeValues) dropped the epoch the engine\nalready stamps, and there was no signal that a wave had settled — so a host\ncombining several derived values from one edit couldn't tell its set came\nfrom one coherent wave or a mix of an old and new one. Both are the sa\n[…]\nc=40 edit).\n- Ports + JS-client docs updated; docgen link check + full suite + js,wasm\n  lane green.\n\nItem 4 (capability discovery) remains — the capstone, now that 1-3 give it\nsomething to advertise.",
          "is_bot": false,
          "headline": "port: epoch on typed events + wave-settled marker (#214, items 1 & 2)…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T20:55:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32521c20e09f99b719feb098bc26a81079ca295d",
          "body": "An invalid POST /set used to return 204 and silently change nothing: a\ntypo'd leaf name, or the result symbol of a derived cell instead of an\ninput leaf, looked successful. The worst failure mode for driving a\nnotebook as a durable component.\n\nThe error was already computed synchronously (the coerce\n[…]\nd not folded). Ports doc updated to the status contract.\n\nScope: HTTP /set only, per the #214 plan. Items 1/2/4 (epoch on typed\nevents, wave-complete signal, capability discovery) remain later passes.",
          "is_bot": false,
          "headline": "port: /set validates synchronously and fails loud (#214, item 3) (#218)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T20:20:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83d1b94461ac2eeb44c91505d54f9da65b7eb4d0",
          "body": "The JS-client docs mixed two naming conventions without saying so: leaves()\nreturns camelCase {symbol, cell, label, kind, columns, type}, but the raw\nport (notebook.meta, cells(), values()) is PascalCase Go wire fields, and\nthe nested type/columns objects stay PascalCase even inside a camelCased\nlea\n[…]\n linked as canonical source. Added a component-host row to\nthe Recipes page so it's discoverable there too.\n\ndocgen link check passes (incl the new #the-complete-host-page anchor);\ndocgen tests green.",
          "is_bot": false,
          "headline": "docs: JS-client casing table + complete host-page recipe (#213) (#217)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T19:49:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "859d69c1d22a46e5791cda966d12054d2b67aaab",
          "body": "* docs/CI: guard against doc skew (#212)\n\nThe docs re-review saw the deployed site apparently mixing pages from two\ngenerations, and the [impure] transcript bug (#211) showed output the tool\nnever produced. Both are 'a specification is a claim' — nothing asserted\nthe docs matched reality. This adds \n[…]\n so\nnever a stale notebook). Noted honestly in deployment.md rather than shipped\nas a meta-tag placebo that wouldn't touch the Fastly edge.\n\n* docs/CI: satisfy errcheck on the test's file close (#212)",
          "is_bot": false,
          "headline": "docs/CI: guard against doc skew (#212) (#216)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T19:24:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d08ccd63d2149b63619b31bd4228c9d9ddc848f",
          "body": "The check transcript in reference-build-run showed [impure]/[impure] for\nthe hello notebook's two cells; the analyzer actually emits [pure]/[pure]\n(verified against `notebook check examples/minimal/hello`). This is the\nfirst analyzer output a reader sees and it contradicted the purity model.\nCorrect\n[…]\n sales-analysis) -> \"most under ~75 lines\";\ncontrols table `Handle`s -> `Handle` grips.\n\nNo engine/cmd changes. docgen link check passes; the corrected transcript\nbyte-matches the real command output.",
          "is_bot": false,
          "headline": "docs: fix stale/contradictory statements (#211) (#215)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T19:08:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e4e65f70b196502f352c45e7c888f3cfb731ef7",
          "body": "… (#210)\n\nA batch run (--headless/--json) called engine.OpenHead(*headPath) on every\npath, before the headless branch — so it silently merged whatever a prior\ninteractive or --set run left as notebook-head.json in the working directory.\nSame binary + same flags + different CWD state gave different o\n[…]\n after. Also pins the explicit-head opt-in.\n\ndocs/reference-build-run.md: note the headless/served head split.\nsite/build.sh: drop the orphan embedded-data demo build (nothing linked it).\n\nCloses #208",
          "is_bot": false,
          "headline": "fix: headless --json must not merge a stray notebook-head.json (#208)…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T06:40:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6de15d0730151128dc6af98ec88cdb9932d661b6",
          "body": "…Go API (#209)\n\nThe adoption story for teams with existing Go: you don't rewrite your code to\nget a notebook, you wrap it. Cells just call the functions you already have.\nTo make that concrete with no invented domain, the \"existing package\" is the\nstandard library's regexp — every compute cell is a \n[…]\n— adding it to build.sh would only create\nan orphan build. Touch-list: minimal/README.md + docs/recipes.md \"Graph shape\nand behavior\" rows; recipes.md line-count caveat updated for the 195-line entry.",
          "is_bot": false,
          "headline": "examples: wrap-existing-package — a thin reactive view over a mature …",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T06:14:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f05ec3a06595a462ea220197fc8bcd459a686633",
          "body": "…hat can span files (#207)\n\nStage 3, PR 4 of 5 of the docs re-review examples thread. The fourth new\nexample teaches the literal \"a notebook is an ordinary Go package\" claim by\nSPANNING three .go files, only one carrying //go:notebook.\n\nThe mechanism (verified against internal/analyze/types.go): cel\n[…]\n and Book.Decade wrong-bucket (model.go) all\nfail the matching tests; restored code passes. make check green.\n\nTouch-list: examples/minimal/README.md + docs/recipes.md \"Graph shape and\nbehavior\" rows.",
          "is_bot": false,
          "headline": "examples: multi-file-package — a notebook is an ordinary Go package t…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T05:24:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "843ce252fe70696998ac7fb0f164b6210de40144",
          "body": "…#206)\n\nThe third re-review example (PR 3 of 5, first of the three new ones). A\nminimal/ recipe teaching where a notebook's data comes in and where its\nresults go out — both boundaries living OUTSIDE the pure cells:\n\n  - IN, at compile time: go:embed folds downloads.csv into the binary, so\n    the p\n[…]\no a cell), TestTotalSumsRows (silent dropped row).\n\nTouch-list: examples/minimal/README.md + docs/recipes.md \"Getting data in\"\nrows added (119 + writer lines). site/build.sh untouched (not showcased).",
          "is_bot": false,
          "headline": "examples: file-and-artifact — both I/O seams outside the pure cells (…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T04:41:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a69b2c09b092d511c759aa42bd73f8279af801b",
          "body": "…=wasm) (#205)\n\nAdds docs/deployment.md, registered under the \"Learn\" section, and links it\nfrom the WASM bullet + a new \"Getting it online\" tail in reference-build-run.md.\n\nCovers the three emitted files (index.html + content-addressed\nnotebook-<hash>.wasm + wasm_exec.js), the required application/\n[…]\nng trap for a deploy guide, cleared:\na static deploy yields a RUNNING notebook, not a page whose editor silently 404s.\n\ndocgen link check green; site/docgen tests pass; sitemap/llms.txt/pager updated.",
          "is_bot": false,
          "headline": "docs: publish + deployment guide (the wall right after build --target…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T04:06:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "246ce99d1ed6523179e72748903c6861c4e7cb2b",
          "body": "…-native (#204)\n\nThe 201-line minimal/csv did three things at once. Split it along the axis\nthat actually matters — where the data comes from, and whether that keeps the\nnotebook WASM-able:\n\n- sales-analysis: the full parse -> filter -> summarize -> chart workflow\n  (const CSV + strings, WASM-able).\n[…]\nthe minimal README and docs/recipes.md tables; fix the stale\n\"201 lines\" figure. Each example has a _test.go; csv-native's asserts the error\npath so the honest-error lesson can't be silently reverted.",
          "is_bot": false,
          "headline": "examples: split minimal/csv into sales-analysis + embedded-data + csv…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T03:45:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4654ca02f66b310c01ce5d95706a39e23e8c4bb8",
          "body": "Since v0.4.0:\n\n- fix: purity derivation is now wired into build/run/check (#200), so the\n  generated registry ships pure:true for pure cells and the engine's memoization\n  cache actually fires — it was inert in every built notebook because RefinePurity\n  had no non-test caller. A real behavior chang\n[…]\na docs build-provenance footer) (#202).\n\nTagging v0.5.0 mints the next Zenodo version DOI (concept DOI unchanged). The\nbinary's version string is injected from the tag by GoReleaser (-X main.version).",
          "is_bot": false,
          "headline": "release: bump metadata to v0.5.0 (#203)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T00:17:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70a925c74b0ccd1a848aad72a5eb0ca08f34b7d8",
          "body": "…e, both render tracks, security, feed badges, provenance footer) (#202)\n\nThe documentation-layer items from the re-review. No contradictions or bugs left\nafter Stage 1 (#201); this is additive coverage the site was missing.\n\n- Recipes section on the site (docs/recipes.md, new \"Learn\" nav entry). Th\n[…]\n check passes (caught + fixed a dead #fragment from\ngoldmark's em-dash double-hyphen slug), footer renders \"built 2026-07-19 ·\n0b78929\", ports/recipes pages screenshotted in-browser. make check green.",
          "is_bot": false,
          "headline": "docs: re-review Stage 2 — the doc layer (Recipes, ports/wire referenc…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-20T00:02:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b78929774e7c234f664521afd6bfd9f4167939f",
          "body": "… kill contradictions (#201)\n\nAddresses the Priority-0 items from a documentation re-review: eliminate\ncontradictory definitions, fix a real doc-site bug, and reconcile a stale claim.\n\n- Cell definition, one sentence everywhere. README opened with \"a cell is a\n  top-level function with a doc comment\n[…]\nintra-doc\n  slugs rewrite, external URLs are preserved.\n\nThe [impure] P0 item was resolved separately by #200 (purity now derived in the\nbuild path, so check shows [pure] correctly). make check green.",
          "is_bot": false,
          "headline": "docs: re-review P0 — one cell definition, testable control contracts,…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T23:24:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c5e54e184a1d3d77272112384a6bc7416ecfc6c",
          "body": "…y fires (#200)\n\nRefinePurity — the analysis that decides which cells are cacheable — had NO\nnon-test caller. build/run used analyze.LoadPackage and check used\nTypesAnalyzer.Analyze, neither of which refines purity, so every cell's Pure\nflag stayed at its safe `false` default. Consequences, all conf\n[…]\nes (recompute) — ~13× — where before\n  the fix every wave would recompute.\n\nNew tests: TestRefinePurityInColdPath (analyze), TestRegistryShipsRefinedPurity\n(gen). make check green, coverage 78.4→78.6.",
          "is_bot": false,
          "headline": "fix: wire purity derivation into build/run/check so the cache actuall…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T23:05:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d48d693e6b104b11e221be0062cb6bb3b9386f5",
          "body": "Two milestones since v0.3.0, both answering the M11 framing question \"what is a\nnotebook's interface to the outside world?\":\n\n- M12 (#189): edit the notebook source in the browser — the supervisor serves\n  GET/POST /__source and an in-page editor recompiles the whole binary on save\n  (server/native \n[…]\ng v0.4.0 mints the next Zenodo version DOI (concept DOI unchanged). The\nbinary's `notebook version` string is injected from the tag by GoReleaser\n(-X main.version), so no source constant changes here.",
          "is_bot": false,
          "headline": "release: bump metadata to v0.4.0 (#199)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T22:30:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6992484bec20fd47fcf00f61daae0c7f35833d67",
          "body": "…e schema (#198)\n\nThe typed value-out pipe (B1-B5) let a program compute on typed OUTPUTS, but the\nclient's own doc admitted it \"does not know each leaf's Go scalar type\" — a\nset() value's shape was validatable only by the far-side coercer. B4b closes that\nby surfacing the type the coercer already e\n[…]\nexes (lambda PerHour/float64,\n  c int/int, utilization Type:nil) — mutation-verified to fail if a non-leaf\n  emits a Type.\n\nmake check green (0 issues); client anti-pass green e2e against a real wasm.",
          "is_bot": false,
          "headline": "B4b: surface each leaf's Go type in CellMeta, so a client can read th…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T21:42:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c160b293b4e2cc16b34556a13ddb1a4fafefe7c",
          "body": "…nt demo + JS client doc (#197)\n\nThe typed value-out pipe (B1–B4a) shipped a JS/TS client (client/) verified only\nby a test harness and a CI lane — surfaced in no site page, doc, or llms.txt. Per\n\"running is not passing,\" an unreached artifact isn't done. This closes the arc\nwith a visible user path\n[…]\n40.24 (annualizable); headless Chrome confirmed\nboth the standalone page and the doc's embedded iframe paint the live values\n($80.48/hr, green \"number\" chip, $705,004.80 annualized). make check green.",
          "is_bot": false,
          "headline": "B5: make the typed value-out pipe reach someone — a host-page compone…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T21:10:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8cbcefdc22da674a1a8529d7d774f633294c9283",
          "body": "Add client/ — the optional JS/TS sibling of the Go nb package. A page never\nhas to import it (the port globalThis.notebook is already plain data); import\nit for editor autocomplete, a structural view of the notebook, and typed\nvalue events. No build step, no toolchain, no npm: notebook.js is pure ES\n[…]\ns,hourlyPrice), subscribed to typed values, set a leaf,\nand received recomputed values as real JS types — numbers (hourlyCost 80.48),\nbools (slaMet), and structured objects (capacityCurve X/Y arrays).",
          "is_bot": false,
          "headline": "B4a: structural JS/TS client for the WASM port (#188) (#196)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T20:20:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af88c257b5a078a6fcce37101860eecd974d52ff",
          "body": "…) (#195)\n\nAdd notebook.subscribeValues(fn), the program-facing sibling of subscribe:\nsubscribe hands the RENDERED projection (a string readout / <svg> / widget\nJSON), subscribeValues hands the TYPED value flattened by jsonToJS to a\nplain JS value. A named-numeric leaf (PerHour, USD) that stringifie\n[…]\nnode — subscribeValues delivered hourlyCost as a number 80.48, and\n40.24 after set('c',40), agreeing with the rendered readout. This is the\nexact value the F1 spike measured arriving only as a string.",
          "is_bot": false,
          "headline": "B3: WASM port subscribeValues(fn) -> {cell, value} typed values (#187…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T20:12:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c62335ff1c2494c0b6b32f1e85b1855a65925c9",
          "body": "Name the out-side capability of reading Event.Value: the cell's typed Go\nvalue, not its string readout. SubscribeValues() is the symmetric partner\nof the input capability probes (Bounded/Optioned/Reconciler) — inputs are\nprobed for what they accept, this names what a consumer may read on the way\nout\n[…]\nSubscribeValues() consumer receives perHour(40.24) intact while the\nSubscribe() consumer's ToWire projection carries only the \"40.24\" readout\nunder text/plain — the typed value never crosses the wire.",
          "is_bot": false,
          "headline": "B2: SubscribeValues() for in-process Go consumers (#186) (#194)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T20:05:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b253c0c9132525cf9928430f2bcdb802a7c6379f",
          "body": "…wire (#185) (#190)\n\nAdd Event.Value, the cell's typed Go value for the wave — the same value\nOut was rendered from, before any string readout. It is IN-PROCESS ONLY:\nToWire ignores it by construction, so no transport can marshal an arbitrary\nGo value and a wire-bound consumer still sees only render\n[…]\ns()[cell],\nand Out.Data equals scalarReadout(Value): the three-way agreement\nValue ≡ Finals ≡ rendered. The three byte-parity wire tests stay green\nuntouched — the proof the wire surface is unchanged.",
          "is_bot": false,
          "headline": "B1: Event.Value any — typed value-out, in-process only, inert to the …",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T19:57:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a060c120fbed58e5d6a64751e8bc4662fc25bdb",
          "body": "* A1: supervisor serves the raw notebook source (GET /__source)\n\nThe supervisor gains a second direct-served endpoint beside /__status:\nGET /__source returns the notebook's .go file verbatim from disk. The\nsupervisor is the right owner — the child is launched from a throwaway\noverlay dir with only -\n[…]\nEdit source' panel mounts\nand its GET/POST both work; the WASM build served statically 404s\n/__source and shows no editor (per-cell read-only source unchanged in\nboth). Phase A3 of #184.\n\nCloses #184.",
          "is_bot": false,
          "headline": "M12: edit the notebook source in the browser (A1–A3) (#189)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T18:59:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5ef8ad883bbeab988f48616b0e2bcc2f81066cd",
          "body": "Adds the nb/chart dataviz package (#180): five chart forms (Line, Scatter\nwith LinFit overlay, Bar, Histogram, Table) and five summary statistics,\nthe optional sibling of nb — the toolchain never depends on it. Plus the\nminimal/csv 'normal analysis' example, the Charts reference doc with its\nanti-goals boundary, and site polish (scrollbar-gutter, comment color).\n\nTagging v0.3.0 mints the next Zenodo version DOI (concept DOI unchanged).",
          "is_bot": false,
          "headline": "release: bump metadata to v0.3.0 (#181)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T17:29:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "432de8db7a44b585c58808118e1789de73bc56c9",
          "body": "* nb/chart: shared axis/tick/legend engine + Line and Scatter\n\nThe dataviz sibling of nb, doing the 1% of a plotting library that most\nanalysis needs, with the craft the hand-rolled corpus SVGs skip:\n\n- 1-2-5 nice-tick algorithm; log-decade ticks for YLog\n- recessive hairline grid, no chartjunk fram\n[…]\n);\n  quickstart teases the live tempconv notebook at its end. Both compiled to\n  WASM via site/build.sh (csv line added), same iframe mechanism authoring\n  already used. Verified rendering in-browser.",
          "is_bot": false,
          "headline": "nb/chart — the 1% of a plotting library, done excellently (#180)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T17:19:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "176627f81f13ee2fe971420cc7bb0ccabee1b6e0",
          "body": "…earning path (#179)\n\n* docs: fix P0 contradictions — remove phantom nocache, sync counts/feeds\n\nA friend's review of go-notebook.dev found the directives reference listing\n//notebook:nocache as a live feature while design.md and paper.md describe it as\nan explicitly-rejected idea. It is implemented\n[…]\n— three grips + the red centroid marker tracking them).\n\nWire the four grips demos' 'Learn: draggable points' links to it, and add the\ndraggable row + flat-[]float64 wire note to the control cookbook.",
          "is_bot": false,
          "headline": "Address the go-notebook.dev reviews: truth fixes, a cookbook, and a l…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T11:36:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed270d45414b3953b87417104a639e217b5be45c",
          "body": "* docs: record the Zenodo DOI (v0.2.0 archived)\n\nZenodo minted the record for v0.2.0 (https://zenodo.org/records/21440009).\nAdd the CONCEPT DOI (10.5281/zenodo.21440008 — always resolves to latest)\nto CITATION.cff and codemeta.json, and a DOI badge to the README. GitHub's\n'Cite this repository' butt\n[…]\nout was on .sidebar (now the nav's parent), so the links\nlost their stacking and flowed inline — a mess. Move the flex column to\n.sidebar nav, and likewise the mobile row layout. Sidebar stacks again.",
          "is_bot": false,
          "headline": "docs: record the Zenodo DOI (v0.2.0 archived) (#178)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T10:17:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83d2bb5683f74be68fb12a48791dc97e3ac35492",
          "body": "14 commits since v0.1.0, including toolchain changes (legible/dismissable\ngraph, slider-collapse fix, Atkinson embedded in every notebook page, the\na11y pass). Tagging v0.2.0 mints the Zenodo DOI (webhook now enabled);\nthe concept DOI gets pasted into CITATION.cff after the release.",
          "is_bot": false,
          "headline": "release: bump metadata to v0.2.0 (#177)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T09:53:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6229513f29679baa95493aba5201eecf5c90f2e8",
          "body": "* site+webui: accessibility, AI-readiness, and citation metadata\n\nCitation / DOI:\n  - CITATION.cff (author + ORCID, Apache-2.0) → GitHub \"Cite this\n    repository\" button and Zenodo metadata source.\n  - codemeta.json (schema.org SoftwareSourceCode).\n  - docs/citing-and-doi.md: the Zenodo / arXiv / S\n[…]\nl a map instead — json.Marshal escapes\ncorrectly and keeps HTML escaping on (< → <), so a value can't break\nthe quotes or close the <script> tag early. Verified: valid JSON-LD, no\nraw < in the output.",
          "is_bot": false,
          "headline": "site+webui: accessibility, AI-readiness, and citation metadata (#176)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T09:25:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bbb148e63928f83b23f4902d5336987c7a85e5b",
          "body": "… (#174)\n\nA documentation pass driven by walking the authoring page:\n\nFeature reference (new) — one page per area, every claim grounded in the\nanalyzer/engine/webui source, added to docgen + a sectioned sidebar\n(Guide / Reference / Deep reads):\n  directives, controls, rendering, build-and-run, layou\n[…]\n\ngenerated reference pages instead of raw GitHub markdown.\n\nnav + hero: unify the top bar across landing + doc pages (same links, same\nsizing, larger brand); recrop hero-art.png with balanced framing.",
          "is_bot": false,
          "headline": "docs: full feature reference, live tutorial demo, and doc-page polish…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T09:08:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4f60967635c4d1de7badcc5610e1a6d434ad30da",
          "body": "Replace the plain-logo hero with a two-column layout: the gopher-holding-\nan-open-book-of-a-dependency-graph illustration on the left, and the\nheadline, tagline, feature pills, and CTAs as REAL HTML on the right —\nselectable, responsive, screen-reader-legible, crisp at any DPI (the\nbanner mockup bak\n[…]\nclamp lowered to 2rem floor so it scales onto phones.\n- Nav collapses on <560px (drop the brand tagline, tighten links) so the\n  bar no longer overflows — verified scrollWidth == clientWidth at 390px.",
          "is_bot": false,
          "headline": "site: hero illustration (gopher + book + graph) beside live text (#173)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T07:55:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52043ab372f0ebf7738e3054198a53c9682c4d71",
          "body": "The toolchain's own pages — served by `notebook run`, emitted by\n`build --target=wasm`, opened straight off disk — used the system font\nstack, while the landing page had already adopted Atkinson. Bring the\ntypeface to the toolchain so a notebook looks the same everywhere.\n\n- go:embed the four woff2 \n[…]\ne data-URIs, no gstatic/googleapis/<link>, all four embeds\n  non-empty. Verified document.fonts.check() = true for both on a real\n  --target=wasm build.\n\nFonts: SIL OFL (internal/webui/fonts/OFL.txt).",
          "is_bot": false,
          "headline": "webui: embed Atkinson Hyperlegible in every notebook page (#164) (#172)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T07:21:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8490a20c28aea3df1790d877d1ecc4f9e20e8bd",
          "body": "… md (#171)\n\nThe landing-page nav pointed at raw GitHub markdown (github.com/.../blob/\nmain/docs/*.md) — GitHub's file view, not documentation. Build actual\ndocs pages instead:\n\n- site/docgen renders a CURATED set of docs/*.md (authoring, live-feeds,\n  design, paper) to HTML sharing the landing page\n[…]\nw points at docs/authoring.html, docs/index.html, docs/paper.html.\n- site/build.sh runs docgen after the demos; site/docs/ is gitignored\n  (generated); the pages workflow redeploys on docs/** changes.",
          "is_bot": false,
          "headline": "site: render curated docs to styled pages; nav links to them, not raw…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T06:44:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fd645151774b6aaf0c13a372a25fad6aa69b887",
          "body": "- Rework the hero: a real large <h1> (\"A cell is a function.\") with a\n  tight sub-line and CTA buttons, and the live capacity demo pulled up\n  into the hero so the first thing you see is something that moves. The\n  logo shrinks to a wordmark beside the headline; the code reveal follows\n  as a \"That \n[…]\n Add Atkinson Hyperlegible Mono (self-hosted variable woff2, 400–700) at\n  the front of --mono, so code blocks match the project's typeface.\n  Verified document.fonts.check() = true for both families.",
          "is_bot": false,
          "headline": "site: bigger hero (headline + live demo) + Atkinson mono for code (#170)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T06:36:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4af86e1bef586448dcfad6a5ad00b51d7e3a44a1",
          "body": "Two typography fixes for the landing page:\n\n- Atkinson Hyperlegible, self-hosted (assets/fonts/*.woff2, latin subset,\n  regular/bold/italic; SIL OFL text ships alongside). No CDN, no network\n  dependency — matches the project's offline-by-default identity. Verified\n  by consequence: document.fonts.c\n[…]\nthat made text jump. The hero tagline was .98rem (SMALLER than the\n  17px body) and muted grey — it now leads at 19px in ink. Section headings,\n  tile text, badges, and captions all snap to the scale.",
          "is_bot": false,
          "headline": "site: adopt Atkinson Hyperlegible + one consistent type scale (#169)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T06:25:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4473e0731c96523056efc0ff27da80304eb4bf2",
          "body": "With no //notebook:layout the notebook renders cells in SOURCE order,\nand the source had curves → readout → intro — so the orientation text\nthat sets up the whole example landed dead last, after the chart and\nnumbers it introduces. Move intro to the first view; a reader now meets\nthe idea, then the plot, then the payoff numbers.",
          "is_bot": false,
          "headline": "examples/amdahl: order cells intro → chart → numbers for reading (#168)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T06:07:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aefd005190bf3424bca9a857d54a5be6dfd02aa",
          "body": "…#167)\n\nThe controls grid was `max-content 1fr max-content`, so a long label\nconsumed the row and starved the 1fr slider column to ~zero width —\nleaving only the thumb, jammed at the right edge with no track to drag.\nIt read as a broken circle, not a slider.\n\nGive the label column minmax(0, 2fr) so \n[…]\nx(160px, 1fr) so it can never collapse, and the range input\nmin-width:0 so it fits its cell. Verified on amdahl (whose \"Cores n — …\"\nlabel triggered it): both sliders are now full-width and draggable.",
          "is_bot": false,
          "headline": "webui: stop the top-block slider collapsing to an undraggable thumb (…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T06:07:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e45c959a651af1d6ecee4a1d928e24297c1029c",
          "body": "The graph led every notebook page with no legend, no edge direction, and\noften overflowed its container — the most important view in the system\nwas also the least explained and the most in the way.\n\n- Placement: wrap the graph in a <details>. A showcase build leads with\n  it OPEN and before the cont\n[…]\n\n  height:auto) instead of forcing a horizontal scroll.\n\nGuarded by TestGraphPlacement (showcase = open-before-controls, working =\ncollapsed-after-cells, both carry the legend, edges are directional).",
          "is_bot": false,
          "headline": "webui: make the dependency graph legible and dismissable (#166)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T05:54:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cba156f056b49893d0af322c0c369be546b120c9",
          "body": "Readout had no Render method, so the engine had a value it couldn't\ndisplay and the entire number panel — ceiling, speedup, efficiency,\ncores-wasted, the payoff of the notebook — rendered nothing in the\nbrowser. `notebook check` was green and headless --json emitted the\nvalue, but half the page was \n[…]\nd/\ntickerfeed panels) and a TestReadoutRender guard that asserts the four\ncards reach the output — the render tests previously covered curves but\nnot readout, the one cell that lacked a Render method.",
          "is_bot": false,
          "headline": "examples/amdahl: render the readout panel (was silently blank) (#165)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T05:50:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f666a4a1bd0719efb2900c0486248ef7bedb5b4",
          "body": "The served/built notebook page had `body { margin: 2rem; max-width: 820px }`\n— a one-value margin sets all four sides, so with a max-width the column\npinned to the left edge instead of centering. Use `margin: 2rem auto` and\nadd symmetric side padding; bump the column to 900px to match the landing\npage. Affects every page emitted by `notebook run` and `build --target=wasm`.",
          "is_bot": false,
          "headline": "webui: center the notebook page instead of pinning it left (#163)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T05:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a4030bd8e458bbbaca76575406af43b795d1b0c",
          "body": "…162)\n\n- widen .wrap 900→1080px (tiles minmax 240→260)\n- add a sticky top nav (Demos / Get started / Paper / Docs / GitHub)\n- tighten the header: less top padding, smaller logo, and the hero\n  tagline rendered as prose (was colliding with the tile .tag label\n  style, so it showed monospace-blue) at \n[…]\n, reproduced in CI\"; \"the honest caveat\" → \"one limit worth\n  naming\"; footer \"not promised… if something reads as too good\" →\n  plain statement; anscombe \"only honest witness\" → \"only the plot shows\"",
          "is_bot": false,
          "headline": "site: wider layout, top nav bar, tighter hero, forward-stated copy (#…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T05:04:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d71837d8a5c5202d8092142de3b6ddb5ec576d0",
          "body": "…rt (#161)\n\nWire a real-time external source into a notebook. A feed can't be a cell (cells\nare pure, no timers), so the pattern is: an external DRIVER calls the notebook's\n`set` port as data arrives, and the notebook is pure cells reacting. The impure\nedge (socket, clock, hardware) lives in the dri\n[…]\nes sweep). Ships notebook + driver +\ntests on the pure logic (policy, moving-avg, projection) + golden fixture + live\ntile. Corpus 34 → 38 live. README + site + pages wired; docs/live-feeds.md linked.",
          "is_bot": false,
          "headline": "examples: four live-feed notebooks — a feed is a driver on the set po…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T01:48:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0ab585019ac7fcfdb406aabfe5842b3fd26cfda",
          "body": "… hygiene) (#160)\n\nRelease-readiness pass ahead of the first tag. Adds security scanning, the\nidiomatic Go test types the project was missing, and release automation.\n\nSecurity:\n- govulncheck as its own CI job (deps + stdlib vs the Go vuln DB; currently clean).\n- CodeQL SAST workflow (Go, security-a\n[…]\nd,\n  the tag for a released binary) + a dispatch test.\n\nFull suite + vet + gofmt + wasm lane green; govulncheck clean. No engine/graph\nbehavior changed. The v0.1.0 tag follows once this lands on main.",
          "is_bot": false,
          "headline": "ci+release: security scans, fuzz + example tests, GoReleaser (pre-tag…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T01:10:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11329ac3cfac45520d2a51c1f9b3bf89221f6125",
          "body": "…as reversals (#159)\n\nTwo documentation deficiencies from a review:\n\n1. No on-ramp. The docs were A-grade on rationale but had no \"write your first\n   notebook from scratch\" path — every sample ran an existing examples/*, and the\n   README never showed install/prereqs. Add docs/authoring.md: a from-\n[…]\nome, sql-decision.md, which both docs link.\n   \"Running is not passing\" (paper §12) kept intact — a finding stated forward.\n\nDocs only: no .go changed, build stays green, all README doc links resolve.",
          "is_bot": false,
          "headline": "docs: add an authoring tutorial; state design decisions forward, not …",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-19T00:26:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3aa4f127a626914c7cf6b0c3cf65ba66014747a1",
          "body": "The README had drifted several milestones behind (\"fifteen notebooks, nine\nlive\"; no mention of composition, the HTML-design family, or the new examples).\nThree docs, all source-of-truth:\n\n- docs/paper.md — a paper-style writeup of the whole system: the bet, the wiring\n  rule, the view-as-readout, t\n[…]\nwas only documented in the design doc); Documents table now links the\n  paper, composition, and notebook-as-service docs.\n\nDocs only — no code changed; all README doc links resolve; build stays green.",
          "is_bot": false,
          "headline": "docs: system paper, deck brief, and a README refresh (#158)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T19:38:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf3da13e619014502a28bb97d1cd0ef4120d6af6",
          "body": "…157)\n\nCompelling new corpus examples that stretch the \"a cell is a function\" model into\npresentation forms the default readout can't carry — the answer as a DOCUMENT,\nnot a chart. Go owns the science (pure cells, in the graph); the Render() method\nauthors the presentation as HTML/CSS because HTML i\n[…]\noth needed renaming — check passes, build\nfails). fmt stays in Render (engine-called), never in a cell body (the fmt→os\nWASM gate). Verified by consequence: all four rendered in-browser (screenshots).",
          "is_bot": false,
          "headline": "examples: four new notebooks, three deferring their design to HTML (#…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T19:16:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41746a11e33c7e2b84cc0bd7d2bcd5c6889c84c9",
          "body": "… (#156)\n\nComposition areas now read as a designed dashboard, not loose columns — the\nbiggest designerly upgrade from the layout research (Observable's card model):\n\n- Each arranged-layout area (.cellcol) becomes a CARD: subtle border/bg, rounded,\n  consistent padding, and align-items:stretch gives \n[…]\ned by consequence in-browser (screenshots): capacity and anscombe both read\nas dashboards; degrade-to-linear holds (strip the layout → source-order stack).\nFull build + test + gofmt + wasm lane green.",
          "is_bot": false,
          "headline": "webui+anscombe: card styling for arranged layouts + anscombe showcase…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T18:51:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f350e13042cacc71e60a6a56c25e4b0dea4a4e07",
          "body": "…composition rollout) (#155)\n\nThe composition slice (#154) added area=/layout but left the 7 //notebook:row=\nnotebooks on the old directive via the untouched no-layout path — two grouping\ndirectives for one job. Retire row=; area= is now the single grouping model:\n- with NO layout block, consecutive\n[…]\n-browser). This reproduces every notebook's\ncurrent appearance 1:1 — the arrangement power (full layout blocks) is opt-in\nper notebook, a later deliberate pass. Full build + test + gofmt + wasm green.",
          "is_bot": false,
          "headline": "webui+examples: retire //notebook:row=, one grouping model on area= (…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T17:53:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4acc5f58591c8f82d14afb2ea979bc0ef9f86977",
          "body": "…ed order (Tier A slice) (#154)\n\nBuilds the composition spec (docs/composition.md) end-to-end on ONE notebook\n(capacity) through the whole stack, to prove the seam before a broad rollout.\n\nAn author arranges the notebook with two presentation-only additions, both\noptional and degrade-to-linear:\n- //\n[…]\nser (sliders\nbeside the readouts they drive, chart full-width below); degrade-to-linear holds\n(headless batch unaffected, layout-less notebooks unchanged); full build + test +\ngofmt + wasm lane green.",
          "is_bot": false,
          "headline": "composition: area= + //notebook:layout — present a notebook in design…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T17:40:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a586b4c0758b0ac1c94d5ddce079e73f636dfeb",
          "body": "…ignerly) (#153)\n\nThe hand-rolled SVG charts had drifted across ~40 distinct hexes (Tailwind\nslate + indigo + fuchsia + one-off blues) — so the gallery's charts spoke a\ndifferent visual language than the chrome (sliders, cells, graph), the exact\nincongruence the design-quality goal warns against. Co\n[…]\ngofmt green; corpus-wide audit shows zero\noff-palette hexes remain in chart source; nbody rendered in-browser confirms the\ncharts now read in the chrome's language (Verlet flat=blue, Euler drift=red).",
          "is_bot": false,
          "headline": "examples: converge chart palettes on one validated brand palette (des…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T17:19:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ef54b9bf143d148d57f7bf1fbf21e0cd2d09c7b",
          "body": "…t source order (Tier A) (#152)\n\nNotebooks lay out in source order (authoring order), which is almost never\npresentation order. Today the only composition tool is //notebook:row= (7 users).\nThis spec lets an author arrange deliberately — explicit order, named regions,\ncontrols beside the cell they d\n[…]\nrs B (full grid) and C (status quo) rejected with reasons; geometry lives in\nthe existing raw-HTML escape hatch. Worked examples: lotka, capacity, anscombe.\nProposed, unbuilt — the spec to build from.",
          "is_bot": false,
          "headline": "docs: composition design — present a notebook in a designed order, no…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T10:24:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85c1f3c7c9208549928d0bdabf3a67558c8f2085",
          "body": "…vice step 2) (#151)\n\nThe addressing half of the notebook-as-service seam (docs/notebook-as-service.md):\nthe process picks its port — only it knows what's free on the box — but ANNOUNCES\nit rather than fixing it, so a launcher never polls-and-hopes.\n\n- engine/server: ServeNotebookReady binds with ne\n[…]\nThis is step 2 of the seam; the spore.host --service workload type is step 3,\nand KC18 ticks only on a real supervised billable spawn run. Independently\nuseful under any launcher, not just spore.host.",
          "is_bot": false,
          "headline": "server: --addr :0 resolves + a stdout readiness line (notebook-as-ser…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T09:31:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0002ebb6a33c0b307eea4b21ff3af0e411e21c71",
          "body": "…3/KC18) (#150)\n\nPins the contract between a notebook binary and an ephemeral-compute substrate\n(spore.host) before either side changes, because the seam spans two repos and\n\"it happens to work\" is not \"the contract is clean.\"\n\nThe agreed shape: ownership is inverted from the paper-scope's poll-and-\n[…]\ntebook side) is independently useful and\nverifiable locally at $0. Alternatives (notebook-aware substrate; --ready-file;\nliteral zero-change poll) recorded and rejected with reasons. Reported on #101.",
          "is_bot": false,
          "headline": "docs: notebook-as-service seam — the clean outside connection (M11 SQ…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T08:31:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3cec309d738af04921fe792a76010977e825acaf",
          "body": "…ndle (M11 SQ2/KC17) (#149)\n\nKC17: hand a running notebook a new dataset over the port, no rebuild, and watch\nevery downstream aggregate recompute. taxi is the Rel[Trip] notebook, so it's the\ntest bed — but its data entered through a fixed source (Open over a const), so\nnothing could be set. Two cha\n[…]\negistry API (path-is-not-a-handle, Equal\npruning, out-of-core all preserved) + new TestReconcileDeliversNewData (unit) and\nTestBatchHandleLeafDeliversNewData (e2e, guards KC17 in CI). Reports on #100.",
          "is_bot": false,
          "headline": "taxi: a settable handle leaf — bulk data-in as a content-addressed ha…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T07:58:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01a3ea884ec612ecefa1022646e3d49aa02c2c87",
          "body": "…sumer (M11 SQ1/KC16) (#148)\n\n* wasm: name the port — one globalThis.notebook object, our UI is a consumer (M11 SQ1/KC16)\n\nThe F1 spike (#99) proved a bare page can drive a wasm notebook with NB absent:\nthe port touches no DOM, so no structural cut in internal/webui was needed —\nNB.init owns the DOM\n[…]\nest\nTestFromJSObject pins the round trip.\n\nFolded into #148 rather than shipping the named port with a known IN gap; the\nhandle-leaf and sandbox-contents questions from the survey remain open on #100.",
          "is_bot": false,
          "headline": "wasm: name the port — one globalThis.notebook object, our UI is a con…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T07:26:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f660d8e66d03ea8f2fc78fef64c074a8c2987b1",
          "body": "… (M11 rank-3) (#147)\n\nThe CLI --set had its own weak string-parser (setLeaf): it could set only\nint/float/bool and, for a composite/widget leaf, silently stored the raw\nstring — an inert control. Meanwhile the browser and SSE paths already had a\ntype-aware coercer (setLeafValue over engine.CoerceWi\n[…]\nwn/mismatch/null --set exit 1 with a named error; a live SSE unknown-leaf\nPOST logs and the server stays up; capacity/clt wasm still build. New tests:\nTestBatchSetCompositeLeaf, TestBatchSetFailsLoud.",
          "is_bot": false,
          "headline": "gen: route --set through CoerceWire, one leaf coercer that fails loud…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-18T00:37:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff597831bdeca0d42eec03889a2024a36e2a7a8c",
          "body": "…) (#146)\n\nThe {epoch,cell,state,mime,data,err} wire shape was defined twice — server's\nwireEvent struct + toWire (engine/server/server.go) and an inline map[string]any\nhand-built in wasm.pump (engine/wasm/wasm.go) — kept in sync by eye. This is the\nfirst M11 finishing step (docs/m11 \"Evidence, now\"\n[…]\nhe new shared ToWire().Map() path. Events reach the DOM exactly as before.\n  - make check green (coverage 77.8→78.1).\n\nUnlocks the SQ1/KC16 precondition: \"consume the event\" now means one engine type.",
          "is_bot": false,
          "headline": "engine: one wire-event serializer, shared by SSE and WASM (M11 rank-1…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-17T23:42:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1d1087485ee3eb273cf2c7778e20482d03b96c1",
          "body": "…-port concept (#145)\n\nA three-transport code-mapping pass (server/wasm/headless) turned most of the M11\nframing doc's structural claims into evidence. This records that with file:line\npointers and names the organizing concept, without ticking any KC (mapping is not\npassing — nothing was observed re\n[…]\n vocabulary + no sandbox filesystem). Push-out excluded as an\nanti-goal (impure edge stays in the transport, never in a cell).\n\nDoc + issue comments only (#98/#99/#100/#101); no engine code this pass.",
          "is_bot": false,
          "headline": "docs/m11: convert the transport-seam claims to evidence; name the one…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-17T23:20:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ddefac958c0d330e85b7279fc0b3eedc0a69540e",
          "body": "… from the gallery (#143)\n\nThe landing page is a shop window — visitors want working demos, not tiles that\nsay \"read the source\" and prove a negative. Two changes:\n\n1. mandelbrot goes LIVE. Its escape-time render was always pure arithmetic\n   (z←z²+c per pixel); the only thing blocking the WASM gate\n[…]\nthat all run in the browser. mandelbrot: 7 cells, wasm\nbuild passes, 7 tests (purity, interior/exterior escape, zoom changes image,\nSVG-wrapped PNG, depth==escape), golden fixture, screenshotted live.",
          "is_bot": false,
          "headline": "mandelbrot: convert to a live fractal; drop the five true-batch tiles…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-17T19:50:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1076f6adb7493d320ceef806bc256a7b950c5525",
          "body": "…tworking #4) (#142)\n\nFourth networking notebook — the graph-topology one, distinct in shape from the\narithmetic link trio (it draws the interconnect). A binary fat-tree: nodes at\nthe leaves, switch tiers to a root, link width ∝ capacity. Bisection bandwidth\n(capacity across the cut through the root\n[…]\nd). Carries the Readout.Render() lesson.\n\nVerified: notebook check (7 cells, 4 helpers), wasm build (portable → live),\ntwo headless screenshots, 7 tests, golden fixture, live tile (35/29), make check.",
          "is_bot": false,
          "headline": "examples/fattree: fat-tree bisection & the oversubscription trade (ne…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-17T18:03:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bfa85d6a2b2374e83653e59eebabda93e9d8415f",
          "body": "…up (networking #3) (#141)\n\nThird networking notebook, completing the link-performance trio (latencybw →\naimd → bdp). TCP sends one window then waits a round trip for ACKs, so\nthroughput = min(bandwidth, window/RTT); to fill a link the window must cover\nthe bandwidth×RTT in flight — the bandwidth-de\n[…]\nLIMITED. Carries the Readout.Render() lesson.\n\nVerified: notebook check (8 cells, 4 helpers), wasm build (portable → live),\nheadless screenshot, 7 tests, golden fixture, live tile (34/28), make check.",
          "is_bot": false,
          "headline": "examples/bdp: bandwidth-delay product — why a 10Gb link runs at dial-…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-17T17:41:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5a85d0ce303ed38b40445a431f65da41cf4da30",
          "body": "…) (#140)\n\nSecond networking notebook (after latencybw). AIMD congestion control as two\nfixed-horizon folds: additive increase (cwnd += step per loss-free RTT),\nmultiplicative decrease (cwnd × β on loss, loss = window overruns the pipe).\nDeterministic, no RNG, so the sawtooth is reproducible and scr\n[…]\nurned `chart`); renamed to `saw`/`fair`.\n\nVerified: notebook check (9 cells, 6 helpers), wasm build (portable → live),\ntwo headless screenshots, 6 tests, golden fixture, live tile (33/27), make check.",
          "is_bot": false,
          "headline": "examples/aimd: the TCP AIMD sawtooth and why it's fair (networking #2…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-17T17:20:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "14bbd06ac291182d9205e04a3b8ceba795cb8a17",
          "body": "…r (#139)\n\nThe corpus had no networking notebook (existing \"bandwidth\" was all MEMORY\nbandwidth in roofline, or generic M/M/c queueing). This is the first: transfer\ntime = latency + size/bandwidth, so which link is faster depends entirely on\nhow much you're moving.\n\nCompare a near link (low latency,\n[…]\nslider. Carries the Readout.Render() lesson.\n\nVerified: notebook check (11 cells, 5 helpers), wasm build (portable → live),\nheadless screenshot, 8 tests, golden fixture, live tile (32/26), make check.",
          "is_bot": false,
          "headline": "examples/latencybw: latency vs bandwidth — the transfer-size crossove…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T21:33:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21f8386bd49ebcf226f1a7cf82f4c3bfe648aad6",
          "body": "… (#109 systems #3) (#138)\n\nThe best cache-eviction rule has no answer without the workload, and this\nnotebook makes that concrete. Replay LRU and LFU over a deterministic access\nstream at every cache size; plot both hit-rate curves for the selected\nworkload. Flip the workload toggle and the winner \n[…]\nle. Carries the Readout.Render() lesson.\n\nVerified: notebook check (8 cells, 5 helpers), wasm build (portable → live),\ntwo headless screenshots, 7 tests, golden fixture, live tile (31/25), make check.",
          "is_bot": false,
          "headline": "examples/cachepolicy: LRU vs LFU — the winner depends on the workload…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T21:20:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8592d879b513e01c84e871dce7eab9e013f492d",
          "body": "… (#137)\n\nThe Slurm scheduler what-if, reframed from the Prev[T]/sacct-trace sketch to a\nPURE function of (jobs, nodes, policy) → start times. A batch scheduler runs a\nqueue on a fixed node pool; the order is policy. FIFO with head-of-line\nblocking lets one wide job stall everyone behind it (idle no\n[…]\nes the Readout.Render() lesson from pid.\n\nVerified: notebook check (8 cells, 5 helpers), wasm build (portable → live),\ntwo headless screenshots, 8 tests, golden fixture, live tile (30/24), make check.",
          "is_bot": false,
          "headline": "examples/backfill: EASY backfill vs FIFO scheduling (#109 systems #1)…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T20:31:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5778be19f61727c743c27ca5dbba9036c94fc351",
          "body": "…ms #8) (#136)\n\nWatch a healthy service tip into metastable collapse. Load ramps up then back\ndown (a deterministic triangle); retries feed failed requests back as more\nload on an already-drowning server, so goodput cliffs past capacity — and\nhere's the postmortem detail no dashboard predicts: backi\n[…]\nd: notebook check (7 cells, 7 helpers), wasm build (portable → live),\ntwo headless screenshots (metastable + broken-loop), 7 claim-asserting tests,\ngolden fixture, live tile (29/23), make check green.",
          "is_bot": false,
          "headline": "examples/retrystorm: metastable collapse & the retry loop (#109 syste…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T20:16:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2cd45cdb478bff93a992b09e8920e3056b25ca00",
          "body": "Your autoscaler is a PID controller — the step response made scrubbable.\nLoad steps at t=0; the positional PID (replicas = baseline + Kp·e + Ki·∫e +\nKd·de) drives the queue back to target. A fold run to a fixed horizon inside\none cell, pure in (gains, load), so scrubbing re-runs from t=0 both ways —\n[…]\n, 7 helpers), wasm build (portable → live),\nheadless-Chrome screenshot (both traces + cards + intro render), 8 tests each\nasserting a teaching claim (91.3% cov), golden fixture, live tile, make check.",
          "is_bot": false,
          "headline": "examples/pid: PID autoscaler step response (#109 systems #7) (#135)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T19:58:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "10af07a8831ecca4d10f1c62fc56f1118f999c3c",
          "body": "…equest (#109 systems #2) (#134)\n\nSixth of the systems set, dead-center the project's niche (cluster procurement).\nSize a compute fleet for a month; two numbers get it approved — cost and carbon —\nand the point is that they are DIFFERENT KNOBS. Drag the spot fraction: the bill\ndrops (0→100% spot tak\n[…]\n has no such\n  split' caption.\n\nLive tile ('units'): corpus now twenty-seven notebooks / twenty-one live. Refs #109.\nSystems remaining: Slurm sim, cache-policy, PID, retry-storm (the trace/fold ones).",
          "is_bot": false,
          "headline": "examples: fleet — cost and carbon, the two numbers on a procurement r…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T19:25:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25548b2451f62ea7d086be1f0744778f75991710",
          "body": "… (#133)\n\nFifth of the systems set. The roofline model: attainable = min(peak, intensity ×\nbandwidth) — a rising memory-bandwidth slope meeting a flat peak-compute plateau at\nthe ridge point (peak/bandwidth). Where a kernel's arithmetic intensity (FLOP/byte)\nfalls decides whether it's memory- or com\n[…]\n region, red kernel dot on the slope at 50 GFLOP/s.\n\nLive tile ('fan-out'): corpus now twenty-six notebooks / twenty live. Refs #109.\nSystems remaining: Slurm sim, fleet cost, cache, PID, retry-storm.",
          "is_bot": false,
          "headline": "examples: roofline — compute-bound or memory-bound? (#109 systems #6)…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T18:26:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7013209374b4f8d622d33bda9ee02d2d1d3ec338",
          "body": "Fourth of the systems set. Amdahl's Law: speedup = 1/((1−p)+p/n), with the serial\npart setting a hard ceiling of 1/(1−p). The payload is the ceiling's cruelty — 95%\nparallel caps at 20× FOREVER, and you're already past 10× by ~20 cores. Drag the\nparallel fraction and watch the curve flatten against \n[…]\nting linear, marker at 12.5×/32 cores.\n\nLive tile ('fan-out'): corpus now twenty-five notebooks / nineteen live. Refs #109.\nSystems remaining: Slurm sim, fleet cost, cache, roofline, PID, retry-storm.",
          "is_bot": false,
          "headline": "examples: amdahl — why more cores stop helping (#109 systems #4) (#132)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T17:38:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45758d96c30bd5185dc435788f02c9a110451a59",
          "body": "… nothing (#109 systems #5) (#131)\n\nThird of the systems set. A build pipeline (checkout → deps → {compile ∥ lint} →\ntest → package → deploy) as a task DAG; the classic critical-path method (CPM:\nforward pass for earliest start, backward pass for latest start, slack = latest −\nearliest) computes the\n[…]\nk tail, red finish line at 145s.\n\nLive tile ('graph'): corpus now twenty-four notebooks / eighteen live. Refs #109.\nSystems remaining: Slurm sim, fleet cost, cache, Amdahl, roofline, PID, retry-storm.",
          "is_bot": false,
          "headline": "examples: critpath — the critical path, where speeding up a task does…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T17:18:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "090463d848729c8e40658e357dc0d6ce0a335497",
          "body": "…t (#109 systems #9) (#130)\n\nSecond of the systems set, and the smallest notebook in the corpus. L = λ·W:\nrequests in flight = throughput × latency. Pick two, the third computes; drag them\nand watch the identity hold, drawn as an area (λ wide, W tall, area = L).\n\nThe point is the units, which is the\n[…]\n= 500 requests.\n\nLive tile ('units'): corpus now twenty-three notebooks / seventeen live. Refs #109.\nSystems remaining: Slurm sim, fleet cost, cache, Amdahl, critical-path, roofline,\nPID, retry-storm.",
          "is_bot": false,
          "headline": "examples: little — Little's Law, and why the units won't let you chea…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T16:46:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2156e04af3a4210ccc03c554e6d3e5278c33e880",
          "body": "…s #10) (#129)\n\nThe first of the #109 SYSTEMS set. A request path (load balancer → app tier →\ndatabase) as a reliability block diagram, teaching two counterintuitive things:\n\n- SERIES composition multiplies, so the system is always worse than its worst\n  part: three three-nines stages compose to ~2.\n[…]\n tile ('graph'): corpus now twenty-two notebooks / sixteen live. Refs #109.\nSystems set remaining: Slurm sim, fleet cost, cache-policy, Amdahl, critical-path,\nroofline, PID, retry-storm, Little's Law.",
          "is_bot": false,
          "headline": "examples: reliability — nines, in series and in parallel (#109 system…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T16:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "366958b27bc8e57428e4466588f6274d8a9163f5",
          "body": "…128)\n\nThe notebook corpus pressure-tested the test suite itself, and it found a real\ngap: the two worst 'reached production without reaching an eye' bugs — the\n[object Object] control (#113, on shipped curvefit for the project's life) and the\ninert //notebook:row= directive (#121) — both lived in t\n[…]\nhe first\ntest checked a mechanism not a consequence (spectrogram's metric was inverted vs\nits own prose); (2) where a layer can't run in Go, contract-test the seam.\n\nmake check green (coverage 77.8%).",
          "is_bot": false,
          "headline": "webui: contract-test the analyzer↔client seam; spec §8 the finding (#…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T01:16:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09dca35a5907e241e2f8f5236280af619261d60c",
          "body": "…rs (#109 #19) (#127)\n\nAn original from #109 (#19), completing the menu. A signal (two tones + optional\nchirp) shown three ways from one source — waveform, spectrum, spectrogram — the\ngraph forking signal → {waveform, spectrum, spectrogram}. Switch the analysis\nwindow (a Select: rectangular ↔ Hann) \n[…]\nady bands (chirp off by default).\n\nLive tile ('linked views'): corpus now twenty-one notebooks / fifteen live.\n\nRefs #109 — with this, every candidate on the #109 menu is built or explicitly\ndeclined.",
          "is_bot": false,
          "headline": "examples: spectrogram — a signal three ways, and why the window matte…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T00:53:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eaf1c5ffb9db5069f9a54783856221252552d896",
          "body": "An original from #109 (#20). k-means clustering of three blobs, with the footgun\nmade interactive: where Lloyd's algorithm converges depends entirely on where the\ncentroids START.\n\n- Drag the initial centroids (dashed grips) and the clustering re-runs from your\n  placement — same data, same k, a dif\n[…]\nture a\npre-settle frame (which looked all-blue until it settled). Not a bug; the compute\nwas correct headless throughout.\n\nLive tile ('grips'): corpus now twenty notebooks / fourteen live.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: kmeans — why initialization ruins your day (#109 #20) (#126)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-15T00:08:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27893ed7b31cf06f02c0c7470c469658dc3532ca",
          "body": "…t back (#109 #18) (#125)\n\nAn original from #109 (#18). Any closed curve is a sum of rotating circles: walk\nthe shape as a stream of complex points, take the DFT, and each frequency is a\ncircle (radius + phase). Stack them tip-to-tail, spin each at its frequency, and\nthe chain retraces the curve. Th\n[…]\nstar with the\n  epicycle circle+spokes; at 40 terms the reconstruction snaps sharply onto the\n  star's points.\n\nLive tile ('grips + purity'): corpus now nineteen notebooks / thirteen live.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: fourier — epicycles, draw a shape and watch circles trace i…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T23:32:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4471f9419cea077170d79dfee2e2fa9abc7c80f2",
          "body": "An original from #109 (#21). A logistic-regression classifier over two draggable\nclouds: the plane shaded by confidence, the boundary drawn, every point a grip.\nDrag a point across the line and the boundary chases it; drag one into the wrong\nclass and it tilts to accommodate the outlier; turn regula\n[…]\n clouds.\n\nHit the cell-vs-helper rule again: boundarySegment had named returns and was read\nas a cell; made them unnamed.\n\nLive tile ('grips'): corpus now eighteen notebooks / twelve live.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: boundary — a draggable decision boundary (#109 #21) (#124)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T23:17:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2926bc8c23d7bc2c3c98c87a161824473884b8be",
          "body": "…109 #11) (#123)\n\nAn original from #109 (#11), and the flagship purity demo. Sculpt any wild\npopulation by dragging its histogram bars; the distribution of the sample mean\nbeside it stays a bell (with the CLT's N(μ, σ²/n) overlaid), however hideous the\npopulation. The teaching payload is what happen\n[…]\nlation (draggable, grips, mean marker)\n  beside the sampling histogram with the magenta normal sitting right on it.\n\nLive tile ('purity' tag): corpus now seventeen notebooks / eleven live.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: clt — the Central Limit Theorem, and why it needs purity (#…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T22:03:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "032f55c433a0ee6b3950bbf6ab0d38f441394b7f",
          "body": "…s #121) (#122)\n\nThe //notebook:row=<name> directive was parsed and carried to the client but\nnever rendered: buildControlsAndCells appended one .cell per cell, always\nstacked. Three shipped notebooks used it and silently stacked anyway — bayes\n(row=panels), seam (row=compare), lotka (row=panels) — \n[…]\nortrait side by side.\n- lotka at 560px: panels WRAP to stacked, each full-width and readable.\n- capacity (no row directive): still stacks vertically — no regression.\nmake check green (coverage 77.8%).",
          "is_bot": false,
          "headline": "webui: honor //notebook:row= — lay same-row cells side by side (close…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T21:44:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d45034743e4ba82e10b931857d9606d2b7a8563",
          "body": "…#17) (#120)\n\nAn original from #109. Lotka-Volterra: prey breed, predators eat prey and starve\nwithout them — the canonical oscillating-ecosystem model. One trajectory shown in\nthe two ways it's always drawn: a time series (prey and predators rising and\ncrashing, predators lagging prey) and a phase \n[…]\nime series with lagging predator waves, and the closed\n  phase-portrait loop with the draggable start point on it.\n\nLive tile ('linked views' tag): corpus now sixteen notebooks / ten live.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: lotka — predator-prey, one trajectory drawn two ways (#109 …",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T21:32:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "26b3e34c2f1151b102c751c179d158ee55071536",
          "body": "The README predated six notebooks and the grips/WASM/SQL developments. Corrected\nto match reality and docs/design.md (which was already current):\n\n- Status 'Built so far': grips, the widget vocabulary, and all four topologies\n  incl. WASM are BUILT (nine notebooks live in-browser); added engine/wasm\n[…]\nutine parallelism (gpulife answers\n  the latter on the GPU).\n\ncore-loop-spec.md left as-is: it's the milestone-1 spec, a historical snapshot,\nand its 'explicitly out' list is scoped to that milestone.",
          "is_bot": false,
          "headline": "docs: bring README up to date with the shipped corpus (#119)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T20:47:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e693666f43f7bd64b657288455bc84625258354",
          "body": "…#118)\n\nAn original from #109. Fill an n×n grid: each cell open with probability p. Is\nthere a connected path of open cells from top edge to bottom? Below the critical\np_c ≈ 0.593 the open cells are scattered islands (no path); above it one cluster\nsuddenly spans the grid. The switch is not gradual \n[…]\n of small clusters, no green) and p=0.65\n  (one bright-green spanning cluster top-to-bottom) — the transition, visible.\n\nLive tile ('purity' tag): corpus now fifteen notebooks / nine live.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: percolation — a phase transition you can scrub (#109 #22) (…",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T20:38:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "747fee2130fe139851977aaddbcdc66fc86e0d30",
          "body": "The WebGPU demo, and the answer to turing's own caveat. turing states its\nembarrassingly-parallel grid update — the goroutine fan-out the design is proudest\nof — is 'absent in the [WASM] tab' because GOOS=js is single-threaded. This\nnotebook puts the parallelism back, in the tab, on the GPU: Conway'\n[…]\nal\n  screenshots were a virtual-time-budget artifact (rAF frozen at a fixed virtual\n  timestamp), NOT a frozen sim — distinguished env from code bug rather than\n  trusting the first green.\n\nRefs #109.",
          "is_bot": false,
          "headline": "examples: gpulife — Conway's Life on a WebGPU compute shader (#117)",
          "author_name": "Scott Friedman",
          "author_login": "scttfrdmn",
          "committed_at": "2026-07-14T20:25:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 5,
      "commits_last_year": 157,
      "latest_release_at": "2026-07-20T03:01:41Z",
      "latest_release_tag": "v0.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 0.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/scttfrdmn/go-notebook",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/scttfrdmn/go-notebook",
          "is_deprecated": false,
          "latest_version": "v0.5.0",
          "repository_url": "https://github.com/scttfrdmn/go-notebook",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-20T00:17:38Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 9
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 53319,
      "source_files_sampled": 281,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/alecthomas/chroma/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.2.0"
        },
        {
          "name": "github.com/yuin/goldmark",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.4"
        },
        {
          "name": "github.com/yuin/goldmark-highlighting/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.0-20230729083705-37449abec8cc"
        },
        {
          "name": "golang.org/x/tools",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.48.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 156,
        "open_issues": 9,
        "closed_ratio": 0.887,
        "closed_issues": 71,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "scttfrdmn",
          "commits": 158,
          "avatar_url": "https://avatars.githubusercontent.com/u/3011922?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "codeql.yml",
        "lint.yml",
        "pages.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "188f15c5d6d12f6d7fb92dc9b5f92437eeeb6e7c",
        "ran_at": "2026-07-25T11:47:49Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-25T05:16:57Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-25T05:15:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 15,
          "created_at": "2026-07-11T16:43:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 16,
          "created_at": "2026-07-11T16:43:57Z",
          "last_comment_at": "2026-07-13T04:53:01Z",
          "last_comment_author": "scttfrdmn"
        },
        {
          "number": 28,
          "created_at": "2026-07-11T20:02:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 98,
          "created_at": "2026-07-14T04:05:57Z",
          "last_comment_at": "2026-07-20T07:14:20Z",
          "last_comment_author": "scttfrdmn"
        },
        {
          "number": 101,
          "created_at": "2026-07-14T04:06:28Z",
          "last_comment_at": "2026-07-20T07:14:03Z",
          "last_comment_author": "scttfrdmn"
        },
        {
          "number": 103,
          "created_at": "2026-07-14T04:06:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 108,
          "created_at": "2026-07-14T15:20:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 109,
          "created_at": "2026-07-14T15:42:09Z",
          "last_comment_at": "2026-07-15T21:21:15Z",
          "last_comment_author": "scttfrdmn"
        },
        {
          "number": 144,
          "created_at": "2026-07-17T22:49:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/scttfrdmn/go-notebook",
    "host": "github.com",
    "name": "go-notebook",
    "owner": "scttfrdmn"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 44,
        "vitality": 69,
        "community": 24,
        "governance": 58,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 69,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 157,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "157 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 157
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 5,
              "latest_release_tag": "v0.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 0.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "5 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "merged_prs": 156,
              "open_issues": 9,
              "closed_issues": 71,
              "issue_closed_ratio": 0.887,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "89% of issues closed",
                "points": 41.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "156/160 decided PRs merged",
                "points": 37.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 156,
                      "decided": 160
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 55,
            "inputs": {
              "followers": 18,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "scttfrdmn",
              "public_repos": 185,
              "account_age_days": 4974
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "18 followers of scttfrdmn",
                "points": 9.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 18,
                      "login": "scttfrdmn"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "185 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 185
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/scttfrdmn/go-notebook"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "5 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "dataflow",
                "go",
                "golang",
                "livecoding",
                "notebook",
                "reactive",
                "repl",
                "type-checker"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 62,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 53319,
              "source_files_sampled": 281,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/281 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 281,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T11:48:04.981638Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/scttfrdmn/go-notebook.svg",
  "full_name": "scttfrdmn/go-notebook",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo.