JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 1166,
"has_wiki": true,
"homepage": null,
"languages": {
"C#": 252732,
"Go": 196698,
"PHP": 270886,
"Java": 310116,
"Python": 414057,
"JavaScript": 221514
},
"pushed_at": "2026-07-21T14:38:42Z",
"created_at": "2026-07-08T23:40:48Z",
"owner_type": "User",
"updated_at": "2026-07-21T14:39:41Z",
"description": "A library that records a program's external inputs — database, HTTP, clock, randomness — and replays them, so any past run can be reproduced and debugged exactly.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "Python",
"significant_languages": [
"Python",
"Java",
"PHP",
"C#",
"JavaScript"
]
},
"owner": {
"blog": null,
"name": null,
"type": "User",
"login": "xag",
"company": null,
"location": null,
"followers": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/8071468?v=4",
"created_at": "2014-07-04T22:44:39Z",
"is_verified": null,
"public_repos": 12,
"account_age_days": 4403
},
"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.8.0",
"kind": "minor",
"published_at": "2026-07-17T15:53:26Z"
}
],
"recent_commits": [
{
"oid": "761b40bf5f170cb3d2fb057aee810ec71e9a3d43",
"body": "The three provenance contracts a gate calls shared one description — \"standard\ngrounding contract; see the package description\" — and an empty params_doc, which\nreads as three identical, uninformative rows anywhere they are listed. grounding@1.1.0\ngives each its own prose and arguments; ledger@0.5.0\n[…]\nding pin moved, so a closure can carry the legible ones.\n\nNo kind, rule or example of this project changes. Checks re-run and unchanged.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
"is_bot": false,
"headline": "Repin to ledger@0.5.0 / grounding@1.1.0",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-21T14:38:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3416d25a03441e4ecf59a1f0d4d6a6f466fc3d03",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014BmDSBi8RuBcXUwYsdqCoq",
"is_bot": false,
"headline": "Pin ledger@0.4.1",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-19T11:17:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "53c38add5ac02ca5181fcd39ec73880e53ae67cb",
"body": "…r budget\n\nThe word budget's biggest catch: php-port-mechanisms (1043 words),\njava-port-mechanisms (883) and one-canonical-fixture-scenario (699) were the\nestate's heaviest entries. All three tightened under 600 - every mechanism,\ncost, rejection and finding kept; what left was the second telling of\n[…]\n\nquern 57c4ae1 (brief, said_words, relational tree_get). 30 rules green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014BmDSBi8RuBcXUwYsdqCoq",
"is_bot": false,
"headline": "Pin ledger@0.4.0; the three port essays are tightened under the reade…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-19T11:13:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4171dc837a14f37125d67e0aed3520deb559278e",
"body": "…y says\n\nA payload rewritten in place goes red instead of passing as an edit\n(xag/ledger#1); corrections travel by supersession, on every entry kind. Roll\nregenerated with a digest per entry; check and workflow unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014BmDSBi8RuBcXUwYsdqCoq",
"is_bot": false,
"headline": "Pin ledger@0.3.0 and quern c6d8cbc: the roll now reads what each entr…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-19T09:58:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0ced2fdccb080be9904310e0dc61eb38d2a9fc6a",
"body": "Entries may now declare what they `rests_on`, and three rules go red while a\ntarget has been superseded or deleted. This ledger declares none yet - the\nprose-to-link migration is a separate, per-entry judgement - so this commit\nlands the mechanism and the baseline.\n\nThe half no rule can do: every ru\n[…]\nmparing against HEAD compares the tree with itself and passes anything.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014BmDSBi8RuBcXUwYsdqCoq",
"is_bot": false,
"headline": "Take ledger@0.2.0, and make removal from the record a visible act",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-19T00:31:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0176e4cb631e2214bfbbe5011fa44be82eb0e268",
"body": "docs/slides.html sat at \"Two runtimes / One tape, two languages\" for a week after Java\nand PHP shipped, claiming a checker \"written twice\" when six exist. Every doc gate here\nreads docs/index.html or a README, and the deck is neither — so it drifted in public,\nunnoticed, exactly like the install blo\n[…]\nong count -> exit 1, missing runtime -> exit\n1, correct deck -> exit 0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "The deck said two runtimes; there are six. And nothing was reading it",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-19T00:14:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "71f6c046b2390d2f6cd5aeff66da4470b1880583",
"body": "The test instructions covered Python and Node — 2 of 6. dotnet, go, mvn and composer all\nhave CI jobs no contributor was told about.\n\nReleasing was documented nowhere at all, which is worse, because the constraints are\ninvisible in the code and each one cost real time to find: the distribution name \n[…]\ne workflows, and all of it is a trap for whoever\ncuts the next release.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "CONTRIBUTING: how to test all six runtimes, and how to release each",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-19T00:06:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0c5c3bfecdd3e67271903c75b642922b8e6f6ebd",
"body": "Packagist accepted poietic/flight-recorder v0.1.0, resolving to mirror commit ab844f50.\nThat was the last install line in the guide carrying a warning, so the install block is\nnow six commands and no caveats — every one of them verified against the registry that\nserves it, not against this repo's be\n[…]\ndone — which was the point of writing it first and letting it stay\nred.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "All six runtimes install from their own registry",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T23:43:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "11528c56b20547fab18b8aa0bd668513f0252922",
"body": "Deployment a4365972 published; jar, sources, javadoc, pom and their signatures all\nresolve from repo1.maven.org. Verified by fetching the artifacts, not by reading the\nworkflow's exit code.\n\nFive of six runtimes now install from their real registry. Packagist is the last, and\nit is waiting on a submission, not on code.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "Java is on Maven Central: io.github.xag:flight-recorder:0.1.0",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T23:32:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ec4678fd0276ed7838528efa9540e0e926aaca6f",
"body": "PACKAGIST. The vendor \"xag\" is already held by someone else — it carries xag/mongo,\nan unrelated package — so xag/flight-recorder could never be submitted. The vendor moves\nto poietic, which is the estate's own name and free. The PHP namespace stays\nXag\\FlightRecorder: a Packagist vendor and a PHP n\n[…]\nmmutable, so the first\nthing to prove is the signature, not the upload.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "php becomes poietic/flight-recorder; java gets its release profile",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T23:21:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f68a53b8adc3dd67b6018b371193a750e64ca1ea",
"body": "One canonical fixture scenario — and the two runtimes that could not record it",
"is_bot": false,
"headline": "Merge pull request #45 from xag/canonical-fixtures",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-18T23:07:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8389a39b93107ce06725c2cf166e9783a3e14b55",
"body": "…record it\n\nThe fixtures proved the tape is one format: every checker accepted every tape.\nThey had also quietly split into two families. Python and .NET recorded a\nchained read, an email user and a \"kaput\" failure; Node, Go, Java and PHP\nrecorded an effect, a named user and \"no such key: alice\". Bo\n[…]\nx plain tapes carry an identical event sequence; ledger 12 rules green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "One canonical fixture scenario — and the two runtimes that could not …",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T23:05:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5d0c091cc9fa06816d20ea001ae6c1517d5369cb",
"body": "Packagist.org does not install packages that are not at the root of their repository —\nsubdirectory packages are a Private Packagist feature — so php/composer.json was\ninvisible to it (\"No composer.json was found in the main branch\").\n\nMoving composer.json to the repo root was the simpler fix and wa\n[…]\n owns.\n\nFirst release is already up: xag/flight-recorder-php at v0.1.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "php: publish through a read-only split at xag/flight-recorder-php",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T22:59:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d4797f8f3d10f461530243029a80fae1eb30c9bd",
"body": "The gate is discharged the only way it allows — by shipping the package, not by\ndeleting the warning. `dotnet add package flight-recorder` now installs\nlib/netstandard2.0/FlightRecorder.dll and lib/net8.0/FlightRecorder.dll, where three\nhours ago it installed a 0.0.0 stub containing nothing.\n\nFour o\n[…]\nay marked pending; both need account state only their\nowner can create.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": ".NET is published: flight-recorder 0.1.0 is real on NuGet",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T22:45:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "882bf60daaab1fcd82ea6bad703ee14af3db9040",
"body": "First attempt failed at token exchange, 401: \"Workflow mismatch for policy\n'estate-publish': expected 'nuget-publish.yml', actual 'nuget-release.yml'\". A NuGet\ntrusted-publishing policy is bound to a workflow FILE NAME, so a release job in a new\nfile can build and pack perfectly and still never be a\n[…]\nhe 0.0.0 guard all passed on the first run — only the push was refused.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "NuGet: put the release job in the file the trust policy names",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T22:38:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "13c02e2212f6721ffe5f71d3975ed37d9989b107",
"body": "The ledger job I just added went red on its first run: `ledger@0.1.0 (pinned) is not\nin the library`. .quern/ is a gitignored local cache, and the fallback registry path is\na sibling directory that exists on my machine and nowhere else — so build() died before\na single gate ran. That is the same cla\n[…]\n deleting the local cache and resolving from the public registry alone.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "CI: give the ledger job a library to resolve against",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T22:21:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "47a6791dbd128fcc85dc977deb906b1319d76daa",
"body": null,
"is_bot": false,
"headline": "Merge: the install block is checked, not asserted",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T22:18:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1590c0cadf2d1ac84878f33afe7f73dedde73e94",
"body": "Six runtimes at feature parity were shipping as three. The guide printed an install\ncommand per runtime; four of the six did not work:\n\n .NET `dotnet add package flight-recorder` SUCCEEDED and installed a 0.0.0\n name-reservation stub containing no code — the worst kind of wrong,\n \n[…]\ne and had\n never once had to honour it. There is now a `ledger` job.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "Make the install block true, and gate it so it stays true",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T22:18:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1cca9f97789b615c9759f07bc6b2c70dc9d0fb85",
"body": "PHP is the sixth implementation, at full parity",
"is_bot": false,
"headline": "Merge pull request #44 from xag/php-impl",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-18T21:49:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56bb2c90e543ab795d89a38231c442bd3ef5e972",
"body": "Record, replay, mutate, invariants, semantic spans, redaction in all three\nlayers, the forbid tripwire on all four write paths, and variable-level\ntracing — the same feature set as the other five, not a subset.\n\nThree mechanisms the language forced, and one choice only PHP has to make:\n\n- The bounda\n[…]\nrwise go red over.\n\n102 PHP tests; Python 207 and Node 123 still green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "php: the sixth runtime, at full parity",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T21:48:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2826e8744ab494e597525b596a5ac55b889b336b",
"body": null,
"is_bot": false,
"headline": "Merge: flight-recorder is on PyPI as xag-flight-recorder",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T21:27:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e1ca5cbc492431524ab9af1eb4de7994d8bde10",
"body": "… the sdist\n\nThe bare name is unavailable and always will be: PyPI collapses separators, so\n`flight-recorder` is `flightrecorder` — taken in 2014 by an unrelated project for\nparagliding GPS loggers. npm had already answered this by scoping to @xag, so PyPI\ntakes the scope as a prefix. The import nam\n[…]\nthe import to match, and coining a fresh short\nname. All 7 rules green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PhMzSVTvC4CKYwTXRsKobx",
"is_bot": false,
"headline": "Publish to PyPI as xag-flight-recorder, and stop shipping the repo in…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T21:26:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dd664d28bd3f1957b8c3b62badb243828589134e",
"body": "A note claiming variable-level tracing was \"not in the .NET port yet\" sat in the\nguide through the entire Go port, reporting green the whole time. It was wrong\ntwice: .NET shipped tracing in 3d8d3d6, and the reasoning it gave — that the CLR\n\"needs a debugger backend\" — is the exact reading the parit\n[…]\nvives anywhere in the guide. Ledger 6 rules green, Java 93, Python 205.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "docs+ledger: the parity gate had a hole shaped like \".NET\"",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T19:22:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6121d8a38ec1ab6f6762fa6b65890e15fd995970",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "Merge: Java is the fifth implementation, at full parity",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T19:00:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "80d0c6433f9ba78c4cfdc25da04733abb8d813c1",
"body": "Java joins Python, Node, .NET and Go as an implementation of the frozen tape-v1\nformat — not a port trailing a lead, which is what the feature-parity gate exists\nto forbid. Every feature ships: the boundary codec with both redaction layers,\nthe recorder (lazy open, gate, sink, spans), the reader and\n[…]\n all packages, .NET 62, ledger 6 rules green including the parity gate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "java: the fifth runtime, at full parity",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T19:00:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1be44f5426d093bc532f9e7f04a5a3e92a8a41b8",
"body": "Closes #43. The tripwire held only of the tape; the trace sidecars, Node's render\ntape, and Save() were all unguarded — uniformly, in every runtime.\n\nPython 203, Node 123, .NET 60, Go all packages. Ledger green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "Merge: forbid guards every artifact the recorder writes",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T17:05:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c60cebd4bb3c5e4259f8fdf1d49ce491ee118099",
"body": "`forbid` declares a property — THIS RECORDING CARRIES NO CREDENTIAL — and it held\nonly of the tape. Everything else the recorder writes was unguarded, so a value\nthe tape correctly refused was written to a file beside it.\n\nThe audit, done by reading every write site rather than inferring:\n\n artif\n[…]\n 203, Node 123, .NET 60, Go all packages incl. tracehook. Ledger green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "forbid: guard every artifact, not just the tape (closes #43)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T17:04:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7709c94c2284210683edf051c07c6f2170cf917b",
"body": "Closes #22. scrub ports to Python and .NET, forbid ports to Node; Go was the\nonly complete implementation and is the reference for both.\n\nPython 195, Node 116, .NET 51, Go unchanged. Ledger green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "Merge: redaction reaches parity — all three layers, all four runtimes",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T15:57:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "55e4e8b62078eb3aff6a3a3465bd611cdbb7746f",
"body": "Issue #22 filed this when there were two runtimes and called it a Python-vs-JS\nproblem. Adding .NET and Go made it wider, not narrower: three distinct layers,\nand until now only Go — written last — had all three.\n\n layer Python Node .NET Go\n mask by field name \n[…]\n5, Node 116 (+2 playwright skips), .NET 51, Go unchanged. Ledger green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "redaction: all three layers, in all four runtimes (closes #22)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T15:57:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7173e64acc313cd2321228bacd7f35e06ddda341",
"body": "Node gains an invariant runner; .NET and Go gain variable-level tracing. The\nparity gate in the docs ledger is green for the first time.\n\nThe tracing result is worth recording: the gate had held red on the reading that\ntracing needed a debugger backend where there is no sys.settrace. That reading\nwa\n[…]\n87 passed, Node 108 passed, .NET 40 passed, Go all packages, vet clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "Merge: every runtime ships every feature",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T15:02:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "12b0170cf29d2f30470804c28c7ccf832af969ce",
"body": "Every runtime now ships every feature, so the guide stops documenting the gap:\nthe tracing row describes two rewriters instead of two \"not yet\"s, the .NET\ninvariants paragraph no longer waits on anything, and the cs and go tabs gain the\ntrace-driven form the py tab always had.\n\nThe ledger's own cons\n[…]\nnd it is now a worked\nexample rather than a claim.\n\n5 rules, all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "docs+ledger: the parity gate goes green, and records what it cost",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T15:00:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d9d5c752e35d2bbbd6bc2b52f3901a36ef7ef7f6",
"body": "Go has no sys.settrace and no in-process debugger, so the same question the .NET\nport faced arrives here: rewrite the code, or drive a debugger. Delve was the\nobvious answer and is the wrong one. It does not avoid the out-of-process run —\nit still needs the traced code compiled into a binary it laun\n[…]\n —\nthat claim is what this falsifies.\n\ngo vet clean; all packages pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "go: variable-level tracing, via go/ast instrumentation rather than Delve",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T15:00:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3d8d3d656551eb75b8afbf0001abb04781b23bcd",
"body": "…gging it\n\nThe .NET port could record, replay, mutate and judge, but it could not answer\n\"what was `level` when it went wrong?\" except by inference. Python gets that from\nsys.settrace, Node from the V8 Inspector. .NET has neither, and not by oversight:\nthe runtime exposes exactly two mechanisms that\n[…]\nes Tracer and nothing else.\n\n40 tests pass, the original 29 among them.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "dotnet: variable-level tracing, by rewriting the code instead of debu…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T14:59:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c3d733e071e1ab0e860bc8a8fa5eee2e70d8a40b",
"body": "Node could record, replay, mutate and trace, but it could not judge: invariants\nexisted in Python, .NET and Go, and the guide carried a badge saying so. A badge\nthat names three of four runtimes IS the disparity, which is why the gate reads\nthe guide rather than the source.\n\nAn invariant consumes th\n[…]\nis awaited: a claim that quietly was not awaited\nwould pass every time.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BDQqLwKrPXJ73ZtvdyAt1n",
"is_bot": false,
"headline": "node: an invariant runner, closing the one gap the parity gate named",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T14:01:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f23db0c21aa290fa1f0c3ecbd0faf6016a3d133f",
"body": "… guide tab + parity ledger rule\n\nBrings the Go implementation to the same feature set as Python/.NET, and adds a\nledger gate that holds every runtime to it.\n\nGo features (all tested):\n- Per-call gate (Boundary.Enabled) with lazy session-open — a gate that never\n admits a call leaves no file, like \n[…]\nule now enforces, discharged only by building\nthem, never by rewording.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "go: feature parity (gate, sink, reader, mutation/probe, invariants) +…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T07:49:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4e3d1bb84f6552117217045814bf5f6d561a91ec",
"body": "The README is a landing that links to the guide; install instructions belong in\nthe doc, not duplicated here.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "readme: drop the Install section entirely — install lives in the guide",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T07:30:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "92359427c41e4c6426e8d78d909639b049ea3422",
"body": "The table promised a per-runtime quickstart that does not exist — its Python and\n.NET links were dead, and Node/Go pointed at neutral stubs, not tutorials. That\nis exactly the docs-single-source decision in the ledger: no per-language\ntutorial, the guide is the one home. Replaced with a plain instal\n[…]\nEADME.md (no code walkthrough to drift); both say \"all four languages\".\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "readme: drop the install table; the guide is the single doc",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T07:26:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2186027cc6708921eb5e184c03dac12378f3fe85",
"body": "- README: \"in all three languages\" → \"in Python, Node and .NET\" (it describes the\n guide's coverage; it sat above a now-four-row install table).\n- docs: give Go users a copyable `go get`, not just a prose pointer.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "docs: tidy the four-implementations copy",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T07:05:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "625c9f3cdc7e6671fc8dffc6adea215d2b78aba0",
"body": "Go: a fourth conformant implementation of the tape-v1 standard",
"is_bot": false,
"headline": "Merge pull request #42 from xag/go-impl",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-18T06:57:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ed63d74513666d3e288685616ee9c9a22b83988",
"body": "…mirror)\n\nThe runtime addition in brick 2b updated validate.py, validate.js and\nvalidate.go — but the .NET checker (csharp/src/FlightRecorder/Spec/Validate.cs)\nis a fourth mirror, and it still rejected the committed go-*.jsonl fixtures with\n\"must name exactly one runtime (python|node|dotnet)\". CI's dotnet job caught it.\nAll four checkers now agree; dotnet suite 29/29.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "csharp: add \"go\" to the checker's recognized-runtime set (the fourth …",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T06:55:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "24f3429a41523061de043eddcdef2be6391781cd",
"body": "- CI: add a `go` job (vet + test) to .github/workflows/test.yml. The fixture\n generator is env-gated so `go test` never mutates the committed go-*.jsonl,\n and the Python/Node fixture sweeps already validate them — a tape fork between\n runtimes now fails a build in three languages.\n- README: add t\n[…]\nDME.md: an API-accurate Go quickstart (record, replay, semantic spans).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "docs+ci: Go is the fourth implementation",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T06:52:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ee77e9ab9d4b492736fa0c1d1e856bc0ddc90fe9",
"body": "…p (brick 4)\n\nThe Go recorder now contributes two tapes to spec/fixtures/, produced by a\nFR_REGEN_FIXTURES-gated generator (go/fixtures_test.go) the same way the JS and\nPython fixtures are made. go-toy.jsonl is a rich basic tape (fx success + error,\na chained read and write, both clocks, all four ra\n[…]\n repr.\n\nVerified: Go all pass; Python 187 passed; JS 102 tests, 0 fail.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "go: contribute go-toy + go-sem-toy fixtures to the cross-runtime swee…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T06:33:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cf2ebd38f5c615abf54534be57d6184043a9cf15",
"body": "Replay re-executes a recorded call with the recording as its world. Boundary\nprimitives are now record-OR-replay on the same context: while replaying, Now/\nPerf/Effect/SampleIndices/RandBytes/RandFloat/RandIntn/Query/QueryOne/Exec serve\nthe recorded answer from a Feed instead of doing the real thing\n[…]\ned question; a different result\nwith identical questions is caught too.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "go: strict replay engine (brick 3)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T05:56:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b7a919b100c580ca79309ef2a837b6a2a4e72544",
"body": "…(brick 2b)\n\nThe record side of the Go implementation. Go cannot monkeypatch a module's\nfunctions the way the Python recorder shims datetime/random, so instrumentation\nis explicit: the active call rides on context.Context, and boundary reads go\nthrough primitives (Now, Perf, Effect[T], SampleIndices\n[…]\ns a call carrying an AWS-key-shaped value without it reaching the tape.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "go: recorder emitting conformant tapes, + go runtime in all checkers …",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T00:50:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4466412b83911aef9602cdaebad77ac1ac7a9a4c",
"body": "The Go half of the tape-v1 \"Value encoding\" contract, mirroring serial.py /\nserial.js: markers for datetimes (__dt__/__date__), __undef__ revived to nil,\nopaque degrade for the unrepresentable with the memory address scrubbed (a\npointer is nondeterministic and would never match on replay), depth-16 \n[…]\nrub sweep, idempotence,\npanic→mask), struct tag handling. go vet clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "go: boundary value codec (brick 2a)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T00:50:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "04a05c450960e703051b924d71e114fb5b93d65f",
"body": "A faithful Go mirror of the normative spec/validate.py, importing nothing from\nany implementation so it cannot bless what an implementation happens to do —\nthe same contract the Python and JS checkers hold. Uses json.Number to preserve\nthe int/float distinction Python's json.loads gives for free.\n\nT\n[…]\nted change across all three checkers, when Go contributes its fixtures.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016oQvtMqZzNeY5ReFs7mZi4",
"is_bot": false,
"headline": "go: tape-v1 conformance validator (brick 1 of the Go implementation)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T00:40:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "35f2eda9b0bad7ebe93a503dd509d59907bcd1b1",
"body": "…ighting\n\nBoth dependency-free — no CDN, no network — to keep the page self-contained: a small\nvanilla highlighter (one combined regex per language: python, javascript, csharp, json,\nshell; comments and strings claimed before keywords) sets GitHub-flavoured token colours\nthat already track the page'\n[…]\n tab-switching still hides blocks and their\nbuttons, no console errors.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01ELyKMaPt2nZHrJfnXyrP8h",
"is_bot": false,
"headline": "docs site: a copy button on every code block, and inline syntax highl…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-18T00:07:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9f0e68f4f9c202d5a206e352ca56eac7ce613cc0",
"body": "…rivileged or the guide is duplicated\n\nFinishes the doc restructure and gives its two rules teeth as data a check enforces.\n\n- Remove the per-language READMEs (flight_recorder/, csharp/); PyPI and NuGet already\n take the root README, so those files were pure duplication. Node's stays only because\n \n[…]\nruns its ledger the same way, off a\nsibling quern-registry, not in CI).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01ELyKMaPt2nZHrJfnXyrP8h",
"is_bot": false,
"headline": "docs: one home per job, and a ledger that goes red if a language is p…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T23:04:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f7dd94563fc52f8ee235c46659512da2b474dbd2",
"body": "…package README\n\nThe root README was pinned as the PyPI long-description (pyproject `readme`), so\nit doubled as a Python tutorial — a Python-specific page at the landing spot of a\nthree-runtime repo, and a duplicate of the docs site.\n\n- Root README -> neutral repo landing: pitch, the tape-is-a-stand\n[…]\ns\n editing four files. Also fixes js/README's stale MIT -> Apache-2.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01ELyKMaPt2nZHrJfnXyrP8h",
"is_bot": false,
"headline": "docs: split the root README from the Python package page; thin every …",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T22:48:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f0f8f44619098ef744e437333c40a7b3a39d78df",
"body": "…ges differ\n\nThe GitHub Pages page was bilingual (Python/Node). Add a real .NET tab — the\nswitcher, parallel snippets in every section (boundary, record, gate, sink,\nredact+forbid, replay, pinned suite, mutation, invariants, sem), and a .NET\ncolumn in the language-differences table. Trace is noted a\n[…]\natching\nthe repo) and \"written twice\" -> independently in each runtime.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01ELyKMaPt2nZHrJfnXyrP8h",
"is_bot": false,
"headline": "docs site: add the .NET tab, and a third column everywhere the langua…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T22:38:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "344ee2feafee3a2b975ef5d2b11d0ffd88e503b5",
"body": "… #34) (#35)\n\nrecord + replay + probe/mutation + invariants + sem, native to .NET, reading and\nwriting tape format v1 — the same tapes Python and Node do. Under csharp/:\n\n- Serial/Json: the value encoding (markers, redaction, the forbid tripwire).\n- Record: the boundary is the object the app holds (\n[…]\n invariant families\n(browser/agent-session extras, not the recorder).\n\n\nClaude-Session: https://claude.ai/code/session_01ELyKMaPt2nZHrJfnXyrP8h\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": ".NET recorder: a third implementation of the frozen tape spec (closes…",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-17T22:30:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "46720c41ed37c62abed9da0db16ac36ae88a2789",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01F6vXL15a9A3Q4ADbY3xKUm",
"is_bot": false,
"headline": "CI: reserve quern and epure names too, from the one owner-scoped policy",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T20:55:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f543f06f4154dff6fff42c2b62760c52afbb85ef",
"body": "…fuses a truly empty package\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01F6vXL15a9A3Q4ADbY3xKUm",
"is_bot": false,
"headline": "CI: let the placeholder package carry its (empty) assembly — NuGet re…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T20:53:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ce9bc382761a1f4d924884ca85322b7a1ec5ffb0",
"body": "…(OIDC, no stored key)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01F6vXL15a9A3Q4ADbY3xKUm",
"is_bot": false,
"headline": "CI: nuget-publish workflow — reserve the name via Trusted Publishing …",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T20:50:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dcde72cc3e04e311a61f1e6e2b557ba440ee2573",
"body": "README: name the tape, show a real Boundary, untangle the sem sentence",
"is_bot": false,
"headline": "Merge pull request #33 from xag/readme-real-boundary",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-17T17:09:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "247d513c3b7a5114f1ef1946ee3fbc9d55b1d06e",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01F6vXL15a9A3Q4ADbY3xKUm",
"is_bot": false,
"headline": "README: name the tape, show a real Boundary, untangle the sem sentence",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T17:09:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8ac81c8d0c85295a8d817f320b3e57e5a8923091",
"body": "README: install from source until the PyPI name is published",
"is_bot": false,
"headline": "Merge pull request #32 from xag/install-line-honest",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-17T15:52:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f32068a47365ac9fe2ae2f3b02a135188888967",
"body": "pip install flight-recorder 404s today — the name is unclaimed on PyPI and\nno publishing credential exists yet. The quickstart's first line must work\nfor a stranger on launch day, so it installs from the repo; the install\ntable says plainly that PyPI is pending. Quickstart re-executed end-to-end\nfrom this exact line: bit-for-bit MATCH, invariant held.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01F6vXL15a9A3Q4ADbY3xKUm",
"is_bot": false,
"headline": "README: install from source until the PyPI name is published",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T15:52:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "aa264dc734f58f1ce2bf422676c4269aa438df40",
"body": "Launch readiness: plain quickstart, the spec as a standard, license decision recorded",
"is_bot": false,
"headline": "Merge pull request #31 from xag/launch-readiness",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-17T13:06:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4291acc00f85905e58680c1dc61bf4c3b75f8c0c",
"body": "…ense decision recorded (#26)\n\nThe README now opens with what a stranger needs: a plain one-paragraph\ndescription and a four-step quickstart (declare a boundary, record,\nreplay, one invariant) whose every line was run end-to-end before being\nwritten down - no coined term before the first green repla\n[…]\ne only personal strings in history are the author's own commit\nidentity.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01F6vXL15a9A3Q4ADbY3xKUm",
"is_bot": false,
"headline": "Launch readiness: plain quickstart first, the spec as a standard, lic…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-17T13:05:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "98ce689fdabcfd750d1abea4e866fe1a246df55d",
"body": "JS runtime: semantic emission, replay skip, validator parity (#25)",
"is_bot": false,
"headline": "Merge pull request #30 from xag/js-sem-parity",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-16T18:47:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "309eec57c71bf7c1ad9ba7e4aefbbe6666a9479b",
"body": "Bring the Node runtime to parity with Python (#23, #24) on the frozen `sem`\nevent kind, so a tape's meaning does not depend on which runtime wrote it.\n\n- Emission: `note(name, data)` and `span(name, data, fn)` in record.js. `fn`\n runs sync or async, its result is returned, and a `begin`/`end` pair \n[…]\ncorded by the Node\n recorder) validates under both checkers, replays green in Node, and reads\n identically through Python `Recording.spans()`.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "JS runtime: semantic emission, replay skip, validator parity (#25)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-16T18:46:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1f710030b9881120bcf5bbc8ba675d01c667144c",
"body": "Semantic events: tapes that carry meaning, and meaning that is checkable (#23, #24)",
"is_bot": false,
"headline": "Merge pull request #29 from xag/sem-events",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-15T21:25:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41734e2e31a3426bb3822f88748d1ec58ac4e295",
"body": "The boilerplate line in the appendix still read '[yyyy] [name of copyright\nowner]' — the one line in the file that was supposed to be edited.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01SHaWV4eWZFJbXRyKFnV9nf",
"is_bot": false,
"headline": "Fill the Apache appendix placeholder: Copyright 2026 Xavier Grehant",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-14T22:45:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "110de36bbc7606c8214ea6612fcb89ef4309dff3",
"body": "Replay must resurrect tapes that carry sems, and the semantic layer extends the\nrecording's own question — \"same?\" — to meaning: did the code still claim the\nsame acts, in the same order?\n\nA recorded sem is never an answer. It is testimony, and replay serves evidence,\nso the Feed steps over recorded\n[…]\nplementation is written to\nread, so a disagreement has to show up there.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01SHaWV4eWZFJbXRyKFnV9nf",
"is_bot": false,
"headline": "Replay over semantic tapes, and a tape you can read top-down (#24)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-14T21:15:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "35e50f7f9a1cbde5e0ca79dcf8bd23dfc17d282e",
"body": "…t (#23)\n\nA tape records what the world answered. It says nothing about what the execution\nMEANT — and meaning is what a reader actually opens a tape for. So an app may\ndeclare, in its own free-text vocabulary, that a stretch of execution was a\ndomain-level act, and have the claim recorded in-stream\n[…]\n act whose evidence was never declared, and therefore never on the tape.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01SHaWV4eWZFJbXRyKFnV9nf",
"is_bot": false,
"headline": "Semantic events: a sem kind on the tape, and note()/span() to write i…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-14T21:08:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "056d9681b21ae970488746b192df43b507c426cf",
"body": "b6e3ab4 moved the repo to Apache-2.0 and put the copyright in NOTICE, but the\nplaces a CONSUMER actually reads the licence from were missed: pyproject's\n`license` field, js/package.json's, and js/LICENSE (still the MIT text). PyPI\nand npm would both have published \"MIT\" over an Apache-2.0 tree.\n\nTha\n[…]\nvel with\nthe distribution, and a NOTICE that stays home is not a NOTICE.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01SHaWV4eWZFJbXRyKFnV9nf",
"is_bot": false,
"headline": "Finish the relicense: the package metadata still said MIT",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-14T21:07:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b6e3ab4b14a79df64b1dfc5d820365143a95b76f",
"body": "The tape spec is meant to be implemented by others; Apache-2.0's explicit\npatent grant is what an implementer needs before betting on it, and its\ncontribution terms matter once outside contributors arrive. Sole copyright\nholder, so the change is clean: versions already published under MIT remain\nMIT\n[…]\n everything from here is Apache-2.0. Copyright notice moves to NOTICE.\n\n\nClaude-Session: https://claude.ai/code/session_01WN8VBmnsnJ64bbm4gpBwpL\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Relicense MIT -> Apache-2.0 (#27)",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-14T16:12:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "43bde4e59762ba06fa782bb42dcb3349ac0d8547",
"body": "The deck showed replay finding a bug (05) and the record→pin→fix→replay-diff\nworkflow (06), but never a case where the two halves of the tool disagree — and\nthat is where the ideas actually bite.\n\nA corpus and a reader that had never been checked against each other. Every tape\nsaid MATCH, because th\n[…]\n90x844: fits, no horizontal overflow,\nand the Korean stays on one line.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MZJhA5ZPwtQxYqYLPqtsBf",
"is_bot": false,
"headline": "Slides: a case study where both instruments earn their keep",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T15:28:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "125b6f4202b1fa64235f6430cca6b25c6b013392",
"body": "The test pinned Chromium's default button background to #f0f0f0. CI's Chromium\npaints #efefef, so main has been red since 903b78c — while the tape under test\nwas perfectly correct. The assertion pinned a browser build, not a claim.\n\nWhat the line is there to say is that a colour reached the tape whi\n[…]\nmeasures is\nright, teaches people to edit the test until it goes quiet.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DKowBAwQBQKLDKWbqckASJ",
"is_bot": false,
"headline": "render: assert the UA sheet painted the button, not which grey it chose",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T15:08:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9ced698265f04740b24ef5299da4d6312cb50515",
"body": "903b78c moved pyproject to 0.8.0 and left the lock at 0.7.0, so every `uv run`\nregenerated it and re-dirtied the tree. `uv lock --check` is clean again.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DKowBAwQBQKLDKWbqckASJ",
"is_bot": false,
"headline": "uv.lock: catch up with the 0.8.0 bump",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T14:49:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8fad3daf21224bb179b57098c6ad42d9c529155d",
"body": "`redact` is field-name driven, and that is the right constraint — it refuses to\nguess at the shape of an opaque payload, which is what forces a boundary to be\ndrawn where values still have names. Keep it.\n\nBut it is declarative and opt-in, so it protects exactly the fields you thought\nof, and its fa\n[…]\nvery boundary that exists today records exactly as before.\n\nCloses #17.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DKowBAwQBQKLDKWbqckASJ",
"is_bot": false,
"headline": "Redaction protects the fields you named. Now prove there are no others.",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T14:43:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "903b78c2509e114eca7faeedee5eafc60065deb0",
"body": "Every screenshot tool records pixels, and that one choice condemns it to being a\nREGRESSION oracle forever. A PNG can only ever answer \"same?\" — there is no claim\nyou can write over a bitmap that a human did not already have to make by looking.\nIt is also unstable, undiffable in any way that names a\n[…]\nat CI job also runs\nthe Node suite, which until now ran nowhere at all.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RHNenQPvNdY511huigWuGX",
"is_bot": false,
"headline": "The render boundary: the tape is the computed layout, not the screenshot",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T14:22:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8d7fde21bd8669336b241229bab5d42624a490eb",
"body": "`args` on an err event carries the exception's constructive values — what you\nwould pass to rebuild it. Python records `e.args`, the exception's own tuple,\nand that is what the revivers in `boundaryOf` are handed; the README documents\nexactly that:\n\n errorRevivers: { NotFound: ([msg]) => new NotF\n[…]\nhe new test uses a plain Error,\nwhich is what every real client throws.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018WzLC31Pp2w4g8X7SvATh5",
"is_bot": false,
"headline": "js: a revived error carries its message, not its stack",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T14:01:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "09126028cc49f6d99573dd9d64457b49a8f8831f",
"body": "Under pytest, assertions are rewritten and str(e) carries the claim's message AND\na dump of the failed expression — the same findings again, as a wrapped Python\nlist. The report IS the product here; it must not look different depending on who\nasked for it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RHNenQPvNdY511huigWuGX",
"is_bot": false,
"headline": "session: a finding reads the same from a test as from a terminal",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T13:54:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "17e7dc5e18519b58f8bf8987f4e9816fd6b1ed33",
"body": "The recorder judges the code: replay one call, assert over its internals. For an\nMCP server that leaves the question that actually decides whether the product is\ngood — the code is perfect, and the model drove it stupidly. That is a bug in the\nSURFACE (the tool names, their descriptions, the prose t\n[…]\nat guessed at that prose would be inventing\nknowledge it does not have.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RHNenQPvNdY511huigWuGX",
"is_bot": false,
"headline": "Trajectory invariants: claims about the calls the MODEL chose to make",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T13:51:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4dcc5014a90871d76867224032d30d66714de124",
"body": "The links were hidden below 640px \"on a phone\". But a desktop zoomed to 200% IS\n640 CSS px, so the only way out of the deck vanished at exactly the moment\nsomeone with low vision zoomed in to read it, and came back when they zoomed out\n(WCAG 1.4.4). Key the rule on the pointer instead: a phone is a \n[…]\npresent\non every slide but the cover, still hidden on a coarse pointer.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RHNenQPvNdY511huigWuGX",
"is_bot": false,
"headline": "slides: keep the deck links when the page is zoomed",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T13:51:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "414bb5abacaf81e4d4d6f45d981a7f13ac38e7ec",
"body": "to_jsonable recorded an unrepresentable value as repr(v), and the default repr of an\nobject carries its memory address: <Image object at 0x7f3c...>. That is a POINTER in\nthe tape. It differs on every run, so the effect or result it belongs to can never\nmatch on replay — and the divergence it produce\n[…]\nat raises no longer takes the recording down with it.\n\n120 tests green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KczFXgpLWmfBkYWkksk9Xw",
"is_bot": false,
"headline": "A tape must not contain pointers",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-12T00:32:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "23180953527459e80dace420181ca301635568ee",
"body": "The boundary is a declaration — Boundary(effects=…, chains=…, clock_modules=…)\n— so the recorder captures what it was told crosses, not everything that does.\n\"every answer\" promises a completeness the library does not offer, and a reader\nwho believes it would trust a replay that silently omits an undeclared input.\n\n\nClaude-Session: https://claude.ai/code/session_01DnjMbd9cmcUijw23Uce4fr\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "README: it records the answers, not every answer (#19)",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-11T21:46:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f8d2dadfd0a954c86b3c22dde463cab8090d8920",
"body": "* README: say what it is in plain words\n\nThe body explained the idea in its own vocabulary — \"nondeterminism\nboundary\", \"that line is the execution, compressed\", \"a lookup rather than\nan inference\" — which reads as slogans to anyone who does not already know\nwhat the library does, and tells them not\n[…]\nnd.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DnjMbd9cmcUijw23Uce4fr\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "README: say where the work goes (#18)",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-11T21:41:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9352acfa16b02da0b5a74da77c562ff35a3c0a17",
"body": "… (#16)\n\nThe page laid itself out 735px wide inside a 390px phone. The mobile rule\nset `grid-template-columns: 1fr`, and a bare 1fr re-enables a grid item's\nautomatic minimum size — which is <main>'s min-content width, which is the\nlongest unwrappable line of code on the page. The column was floored\n[…]\nutside its scroll container, the switch swapping all fifteen samples.\n\n\nClaude-Session: https://claude.ai/code/session_01DnjMbd9cmcUijw23Uce4fr\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: fix the mobile layout — overflow, header, language switch (#15)…",
"author_name": "xag",
"author_login": "xag",
"committed_at": "2026-07-11T21:16:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "21b6bbc20978c527345280c08781bae8ac5c7e75",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "docs(slides): drop the studio/date prefix from the cover byline",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T19:32:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c78524c6426e9bb9aa83b982237e7316b5b4f67f",
"body": "They were jammed into the cover's byline, which is the author's line, not a\nnav bar. Now a muted top-right pair on every slide — hidden on the cover,\nwhose full-width title-mark occupies that same line and which already carries\nthe URL in its byline.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "docs(slides): move the repo/docs links to discreet per-slide chrome",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T19:28:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d707e3a430c1546e1eef28ae6bd947e106f8c60c",
"body": "The deck named the repository twice — on the cover and on the closing slide — and\nlinked to it neither time. Anyone reading it on the web had the URL and nowhere to\nclick. Both mentions are now anchors, and both slides also link to the\ndocumentation, which the deck never pointed at at all.\n\nClicks i\n[…]\nuse a URL split\nacross a line break reads as a typo rather than a link.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "slides: link back to the repo and the docs",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T19:13:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "949e1f2c5ceaea1a2e3f58e3ac620e19ecc62488",
"body": "Same mistake, one layer down. The tape format has a section on the docs page and a\nlink to the frozen spec; a note about it in the README only gives it a second home\nto drift from. Removed, along with the duplicate spec link.\n\nThe README now has one pointer out — the documentation — and keeps only w\n[…]\nis is, how to install it,\nand where each implementation's source lives.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "README: the tape belongs to the docs",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T19:07:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "71e5c9c88313ec52c921ca6b5bd45386b8c85b26",
"body": "It was still trying to BE the documentation — the five-step approach, the\nconformance-checker paragraph, the tracing paragraph. Every one of those is on the\ndocs page, so the README was a half-copy of it: the version that drifts, because\nnobody remembers to update two.\n\nWhat a landing page owes a re\n[…]\nThe documentation link is a heading, not a footnote in a list of links.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "README: a landing page, not a second copy of the docs",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T18:06:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b42c94ed5e79301830db1eff0dc584fba890ff16",
"body": "A grep for phrases I could remember was not an audit — it can only find the\nnarrative I already thought of, which is precisely the narrative I am blind to.\nReading the files properly found what it could not.\n\nTHE LIBRARY KNEW A CONSUMER'S DOMAIN. Its own front-page example redacted\n`encSender`, wrap\n[…]\nr\nsomething they can act on.\n\nNo behaviour change. 116 Python, 77 Node.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "The library knew its clients. It does not any more.",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T17:27:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f0d07be32d67c9a7b17d0c08e0d1ac6016c63d8b",
"body": "Three comments in the library described the library's own past bugs — \"a sink that\nhangs USED TO hold the request open\", \"the callback form USED TO pass straight\nthrough\", \"replayCall USED TO clean up by calling uninstall\". Two more narrated the\nprocess of building it: \"learned the hard way\", \"the m\n[…]\nync one keeps its locals elsewhere. Same information, no autobiography.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "Strip the changelog out of the source comments",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T17:21:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "882c7a6902a8dcfdb703258f164d38a49ed6369c",
"body": "…ed it\n\nThe docs said \"Node has no equivalent of sys.settrace\" and left it at that. That\nis not true. Node has no such HOOK — but it has the V8 Inspector, which is where a\ndebugger gets exactly this information, and a limitation nobody tried to remove is\nnot a limitation, it is an excuse.\n\n const r\n[…]\nME, js/README, the docs\npage, the slides.\n\nSuites: 116 Python, 77 Node.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "js: variable-level tracing (0.10.0) — the claim was false, so I remov…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T17:18:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "55bdb5f3f7144cfcc7b694232a07530333bd8ea9",
"body": "Three things were actually broken:\n\n - an <h3> stuffed with emoji and bold links, pretending to be a nav bar. It is\n not a heading; it was bunting, and it rendered as a heading.\n - a table whose header row was empty, which GitHub renders as a blank grey band.\n It now has real headers: Langua\n[…]\nle with real headers, one code block, no emoji, no blockquote,\nno rule.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "README: fix what was broken, cut what was showing off",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T17:06:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "44dcf5bd924b8000d6167cf69dcee837aaaa0663",
"body": "The first cut was a leaflet: a two-line display hero, a sticky brand bar, an\ninternational-orange accent on every callout, dark-by-default panels. That is how\nyou sell something. Nobody arriving at a library's docs is being sold anything —\nthey came for the API, and every ornament is one more thing \n[…]\n\n\nRendered in light and dark and looked at, rather than reasoned about.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "docs: make it look like documentation, not a product page",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T16:58:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "202392b2c501c658d2bf7b6d96b85b189c3e1c47",
"body": "… a landing\n\nGitHub cannot do tabs. It strips <script>, ignores class and style, and a Markdown\ntable cannot hold a fenced code block — so a README can show one language or stack\nboth, and neither is what a two-language library needs. <details> collapsibles are\nthe closest thing available and they a\n[…]\n\n\nRendered in both languages and looked at, rather than reasoned about.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "docs: a real documentation site with a language switch; README cut to…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T15:55:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a8629360363f975286f0aa7798302b510ccba707",
"body": "The Node column ran away with the slide, because its cells were paragraphs while\nPython's were phrases. The fix is shorter cells, not a cleverer layout: every row\nis now one line in both columns, and the nuance that was bloating the sink cell\nmoved to the note where it belongs.\n\nMy first attempt mad\n[…]\n, not a paragraph.\n\nRendered and looked at, rather than reasoned about.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "slides: fix the two-runtimes table — balanced columns, labels intact",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T15:49:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e359048a413c825c694341fb39405a9ef2c6f3dc",
"body": "THE SINK WAS A DEFECT, TWICE OVER\n\nPublishing a tape is telemetry, and telemetry must never sit between a user and\ntheir response. Awaiting the publish put a storage round-trip in front of every\nrecorded call. And there was no timeout: a sink that THROWS was swallowed, but a\nsink that HANGS held the\n[…]\nmore: a lib knows nothing of its clients.\n\nSuites: 116 Python, 70 Node.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "Take the sink off the critical path; make the docs symmetric (0.9.0)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T15:39:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "550d384563182e375a4010788452d0ef02e49ec9",
"body": "The README read as though Python were the only implementation, and the slides\nclaimed four apps in one language. Both are now out of date by a whole runtime.\n\nREADME gains \"Two runtimes, one tape\": the install lines, the frozen format, and —\nthe part worth reading — WHAT IS GENUINELY DIFFERENT AND W\n[…]\nee. The toy exercises the library; only a real app exercises\nthe world.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "docs: document the Node port — README and slides",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T15:03:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f05d1c2d018d199f714947158914368002e015db",
"body": "….7.0, 0.8.0)\n\nBoth found by wiring more of a real app in. Both were destroying data quietly.\n\nTAPE NAMES COLLIDED (0.8.0)\n\n`flight-<timestamp-to-the-second>-<pid>` looks unique and is not. Serverless\ninstances are separate containers that reuse low pids — 4 is common — and start\nwithin the same sec\n[…]\nd see it, which is why the toy never\ndid.\n\nSuites: 116 Python, 67 Node.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "js: unique tape names, and replay stops switching off the recorder (0…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T14:58:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6164efded3123a9f29d314dfcd8438368b3236cc",
"body": "THE SINK (0.5.0)\n\nA serverless host has no filesystem worth the name: a tape written during an\ninvocation dies with it. install() now takes a sink — anything with\npublish(name, text) — and `directory: null` records to memory alone, so on Vercel\nthe sink IS the tape. It is handed the whole session ea\n[…]\nent for wiring the thing into a real app.\n\nSuites: 116 Python, 64 Node.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "js: off-box sink, and record events in ASK order (0.5.0, 0.6.0)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T14:20:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a35a6c00100cfc72b9d86b1069f14e13c8992ce2",
"body": "…0, 0.4.0)\n\nBoth of these were found by wiring a real app (reads). Neither was visible from\nthe toy.\n\nSCRUB — redaction by VALUE, not just by field name (0.3.0)\n\nField rules assume secrets live in named fields. reads showed three places they\ndo not: `sismember('allowlist', addr)` passes an address P\n[…]\n with Date.now() — which is most of them.\n\nSuites: 116 Python, 60 Node.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "js: scrub by value, and keep a door's internals behind the door (0.3.…",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T14:04:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2149a1008fda498125da497f8126f0ba110bd38a",
"body": "The README had a \"Known limits\" section. A library that exists to make apps\nbeautifully clean has no business shipping one, so the limits are gone rather than\nbetter documented.\n\nEVERY GLOBAL DOOR, NOT THE CONVENIENT ONES\n\n wall clock Date.now() AND new Date()\n monotonic clock performance.n\n[…]\n\n\nSuites: 116 Python, 57 Node. Published as @xag/flight-recorder@0.2.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "js: close every known limit (0.2.0)",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T13:49:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5be0f8b44be21bd07425997929c6830d04a223f9",
"body": "Packaging for the registry: README (the boundary/replay/mutation story, and the\nknown limits stated up front rather than discovered), LICENSE copied into the\npackage dir (npm only auto-includes it from the package root), repository\nmetadata pointing at the js/ subdirectory, and a `files` allowlist s\n[…]\nen lives for the length of one\ncommand, and it must never be committed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6xPAxSoPRAYZxUYcAiGoj",
"is_bot": false,
"headline": "js: publish @xag/flight-recorder@0.1.0 to npm",
"author_name": "Xavier Grehant",
"author_login": "xag",
"committed_at": "2026-07-11T13:35:54Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 1,
"commits_last_year": 126,
"latest_release_at": "2026-07-17T15:53:26Z",
"latest_release_tag": "v0.8.0",
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 3,
"days_since_latest_release": 7,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 71,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "xag-flight-recorder",
"exists": true,
"license": "Apache-2.0",
"keywords": [],
"ecosystem": "pypi",
"matches_repo": null,
"registry_url": "https://pypi.org/project/xag-flight-recorder/",
"is_deprecated": false,
"latest_version": "0.8.0",
"repository_url": null,
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 128,
"first_published_at": "2026-07-18T21:22:07.229666Z",
"latest_published_at": "2026-07-18T21:22:08.764629Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "github.com/xag/flight-recorder/go",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/xag/flight-recorder/go",
"is_deprecated": false,
"latest_version": "v0.8.0",
"repository_url": "https://github.com/xag/flight-recorder",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T21:49:49Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "io.github.xag:flight-recorder",
"exists": true,
"license": "Apache-2.0",
"keywords": [],
"ecosystem": "maven",
"matches_repo": true,
"registry_url": "https://central.sonatype.com/artifact/io.github.xag/flight-recorder",
"is_deprecated": false,
"latest_version": "0.1.0",
"repository_url": "https://github.com/xag/flight-recorder",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T23:31:24Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "@xag/flight-recorder",
"exists": true,
"license": "MIT",
"keywords": [
"record",
"replay",
"deterministic",
"testing",
"debugging",
"simulation",
"observability",
"nondeterminism",
"regression"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@xag/flight-recorder",
"is_deprecated": false,
"latest_version": "0.10.2",
"repository_url": "https://github.com/xag/flight-recorder",
"versions_count": 12,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2020,
"first_published_at": "2026-07-11T13:34:54.566000Z",
"latest_published_at": "2026-07-12T14:02:47.114000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 12
},
{
"name": "poietic/flight-recorder",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"testing",
"debugging",
"deterministic",
"record",
"regression",
"replay",
"simulation",
"observability",
"nondeterminism"
],
"ecosystem": "packagist",
"matches_repo": true,
"registry_url": "https://packagist.org/packages/poietic/flight-recorder",
"is_deprecated": false,
"latest_version": "v0.1.0",
"repository_url": "https://github.com/xag/flight-recorder-php",
"versions_count": 1,
"total_downloads": 0,
"dependents_count": 0,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 0,
"first_published_at": null,
"latest_published_at": "2026-07-18T23:21:44Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
}
]
},
"popularity": {
"forks": 0,
"stars": 1,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 7
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"samples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"csharp/src/FlightRecorder/FlightRecorder.csproj",
"csharp/tests/FlightRecorder.Tests/FlightRecorder.Tests.csproj",
"csharp/tools/GenFixtures/GenFixtures.csproj",
"go/go.mod",
"java/pom.xml"
],
"largest_source_bytes": 56636,
"source_files_sampled": 192,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go/go.mod",
"java/pom.xml",
"js/package.json",
"php/composer.json",
"pyproject.toml"
],
"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",
"maven",
"npm",
"packagist",
"pypi"
],
"dependencies": [],
"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": 18,
"open_issues": 7,
"closed_ratio": 0.741,
"closed_issues": 20,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "xag",
"commits": 126,
"avatar_url": "https://avatars.githubusercontent.com/u/8071468?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ledger-gate.yml",
"maven-release.yml",
"nuget-publish.yml",
"php-split.yml",
"test.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"uv.lock"
],
"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": "2 out of 2 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/28 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"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": 0,
"reason": "project is not 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": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 9,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"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": "761b40bf5f170cb3d2fb057aee810ec71e9a3d43",
"ran_at": "2026-07-25T03:08:53Z",
"aggregate_score": 4.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-21T14:39:33Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-18T23:07:03Z",
"ci_last_conclusion": "FAILURE",
"oldest_open_issues": [
{
"number": 20,
"created_at": "2026-07-12T08:42:13Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 21,
"created_at": "2026-07-12T14:40:32Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 28,
"created_at": "2026-07-14T19:49:06Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 38,
"created_at": "2026-07-18T00:16:56Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 39,
"created_at": "2026-07-18T00:16:58Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 40,
"created_at": "2026-07-18T00:16:59Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 41,
"created_at": "2026-07-18T00:20:42Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/xag/flight-recorder",
"host": "github.com",
"name": "flight-recorder",
"owner": "xag"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"security": 41,
"vitality": 67,
"community": 36,
"governance": 52,
"engineering": 71
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 67,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"commits_last_year": 126,
"human_commit_share": 1,
"days_since_last_push": 3,
"active_weeks_last_year": 3
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "3/52 weeks with commits",
"points": 2.1,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 3
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "126 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 126
}
}
],
"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": "good",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 84,
"inputs": {
"releases_count": 1,
"latest_release_tag": "v0.8.0",
"releases_from_tags": false,
"days_since_latest_release": 7,
"mean_days_between_releases": null
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "1 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 1
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 7 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 7
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "cadence unknown (single release)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence_unknown",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": "at_risk",
"name": "Community & Adoption",
"value": 36,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 1,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 1
}
}
],
"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": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"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": 18,
"status": "met",
"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
}
]
},
{
"key": "ecosystem_adoption",
"band": "at_risk",
"name": "Ecosystem adoption (downloads)",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"packages": [
"xag-flight-recorder",
"github.com/xag/flight-recorder/go",
"io.github.xag:flight-recorder",
"@xag/flight-recorder",
"poietic/flight-recorder"
],
"dependents": 0,
"ecosystems": "go, maven, npm, packagist, pypi",
"total_downloads": 0,
"monthly_downloads": 2148
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,148 downloads/month across go, maven, npm, packagist, pypi",
"points": 44.4,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2148,
"ecosystems": "go, maven, npm, packagist, pypi"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "0 packages depend on it",
"points": 0,
"status": "missed",
"details": [
{
"code": "registry_dependents",
"params": {
"count": 0
}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 52,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"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 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 73,
"inputs": {
"merged_prs": 18,
"open_issues": 7,
"closed_issues": 20,
"issue_closed_ratio": 0.741,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "74% of issues closed",
"points": 34.6,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 74
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "18/18 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 18,
"decided": 18
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"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": 43,
"inputs": {
"followers": 3,
"owner_type": "User",
"is_verified": null,
"owner_login": "xag",
"public_repos": 12,
"account_age_days": 4403
},
"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": "3 followers of xag",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 3,
"login": "xag"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "12 public repos, account ~12 yr old",
"points": 20.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 12
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"xag-flight-recorder",
"github.com/xag/flight-recorder/go",
"io.github.xag:flight-recorder",
"@xag/flight-recorder",
"poietic/flight-recorder"
],
"ecosystems": "go, maven, npm, packagist, pypi",
"any_deprecated": false,
"min_days_since_publish": 6
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "5 package(s) on go, maven, npm, packagist, pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 5,
"ecosystems": "go, maven, npm, packagist, pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 6 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 6
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "12 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 12
}
}
],
"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": 71,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": 41,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 41,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.1
},
"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": "2 out of 2 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/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"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 not fuzzed",
"points": 0,
"status": "missed",
"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 not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "at_risk",
"name": "AI Readiness",
"value": 48,
"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": 0.98,
"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": "98 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 98,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"uv.lock"
],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.9,
"toolchain_manifests": [
"csharp/src/FlightRecorder/FlightRecorder.csproj",
"csharp/tests/FlightRecorder.Tests/FlightRecorder.Tests.csproj",
"csharp/tools/GenFixtures/GenFixtures.csproj",
"go/go.mod",
"java/pom.xml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "csharp/src/FlightRecorder/FlightRecorder.csproj, csharp/tests/FlightRecorder.Tests/FlightRecorder.Tests.csproj, csharp/tools/GenFixtures/GenFixtures.csproj (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "csharp/src/FlightRecorder/FlightRecorder.csproj, csharp/tests/FlightRecorder.Tests/FlightRecorder.Tests.csproj, csharp/tools/GenFixtures/GenFixtures.csproj"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "90 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 90,
"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": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 56636,
"source_files_sampled": 192,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/192 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 192,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"samples"
],
"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": "samples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "samples"
}
}
],
"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": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-25T03:09:00.679352Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/x/xag/flight-recorder.svg",
"full_name": "xag/flight-recorder",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}