Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"cli",
"filesystem",
"fuse",
"golang",
"issue-tracking",
"linear",
"linear-app",
"project-management"
],
"is_fork": false,
"size_kb": 2596,
"has_wiki": false,
"homepage": null,
"languages": {
"Go": 2263457,
"Shell": 30792,
"Makefile": 4033
},
"pushed_at": "2026-07-20T15:35:26Z",
"created_at": "2025-12-11T19:37:32Z",
"owner_type": "User",
"updated_at": "2026-07-20T15:37:00Z",
"description": "Interact with linear as a series of text files in your filesystem",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "John Allen",
"type": "User",
"login": "jra3",
"company": "Antimetal",
"location": "New York, NY",
"followers": 19,
"avatar_url": "https://avatars.githubusercontent.com/u/419698?v=4",
"created_at": "2010-09-28T19:45:37Z",
"is_verified": null,
"public_repos": 62,
"account_age_days": 5777
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-07-18T12:27:53Z"
}
],
"recent_commits": [
{
"oid": "7f3a8da96d15e96a398ede434350f95f65b8f196",
"body": "atrest.Chmod stays best-effort, but a genuine tighten failure previously\nleft its only signal buried in journald — an artifact could silently\nkeep a loose mode with nothing observable. Chmod now records\nlinearfs.atrest.chmod_failures{artifact} alongside the log line;\nmissing artifacts still record n\n[…]\nlso fixes pre-existing telemetry.md drift: the\nlinearfs/cdn meter (PR #348) was missing from the scope list and\ninventory entirely.\n\nCloses #352\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(observability): count atrest chmod self-heal failures (#352) (#361)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T15:35:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7c6576e3cc652e6f905dc6c8d0ec21106c33bf3f",
"body": "…ts (#358)\n\n* refactor(config): remove the dead allow_other mount option\n\nMountConfig.AllowOther was never wired to fuse.MountOptions — the mount\nhas always been owner-only, and `allow_other: true` in config.yaml was a\nsilent no-op that lied to the user. Remove the knob rather than wire it:\nwiring w\n[…]\nRE's api section updated to state the now-two-sided\nenforcement.\n\nCloses #353\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "security follow-ups: drop dead allow_other, refuse API-client redirec…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T15:35:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e5609582ea4d5f37c2b01488f90cc66bb6e67700",
"body": "Releases were checksummed but carried no cryptographic provenance:\nchecksums.txt is generated by the same job that builds the binaries and\nis itself unsigned, so an actor controlling the release pipeline could\nrewrite binary and checksum together. Add actions/attest-build-provenance\n(SHA-pinned, per\n[…]\nither. THREAT-MODEL TB4 gains the enforced provenance\nposture; SECURITY.md gains the operator-facing \"Verifying a release\"\nsection.\n\nCloses #354\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(release): SLSA build provenance for release artifacts (#357)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T15:35:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "18233600c8fc524ac210e22fbde83493ab82a53a",
"body": "… (#356)\n\nPin the CI/release supply chain (Remediation Unit 4, #347):\n\n- SHA-pin actions/checkout (v4.3.1), actions/setup-go (v5.6.0), and\n goreleaser/goreleaser-action (v6.4.0) to full 40-char commit SHAs with\n trailing version comments across release.yml, test.yml, integration.yml.\n Dependabot \n[…]\nse.yml keeps\n its existing 'contents: write' for the goreleaser job.\n\nSLSA provenance / cosign signing intentionally excluded (#354, roadmap).\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(security): SHA-pin actions, pin govulncheck, least-privilege perms…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T11:36:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62a0555f005f629619439436528db6f2abc884e7",
"body": "…al (#351)\n\nRemediation Unit 3 from the #319 security audit (grilling-locked).\n\n- #338: config.Load hard-refuses a config.yaml that is the api_key source and\n is group/other-accessible (mode & 0o077 != 0), naming the fix (chmod 600).\n The LINEAR_API_KEY env path is the escape hatch and is unaffect\n[…]\nunaffected.\n\nDocs: THREAT-MODEL TB3 records the enforced posture; ARCHITECTURE notes the\nconfig refusal and the internal/db at-rest chmod seam.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(security): tighten at-rest modes, refuse loose key file, self-he…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T02:04:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "169281f3a30defee967f4baa3c47ae0dccde1dae",
"body": "…e (#349)\n\n* fix(fs): route every name/target builder through one safeName chokepoint\n\nIntroduce a single exported safeName(raw, id) chokepoint in internal/fs that\nevery name/target builder routes its output through. It replaces /, \\, NUL, and\nC0 control chars with '-', trims trailing spaces/dots, f\n[…]\nes\n (verified: 13 legitimate intermediate `name := ent.Name` assignments).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fs safety chokepoint: route every name/target builder through safeNam…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T01:37:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dfcbdc4d345ba58a0ac95260e55811ac75c46ac8",
"body": "* harden(cdn): refuse redirects + cap GET body at 100 MiB\n\nRemediation Unit 1 from the #319 security audit. All three findings live in\nCDNClient.do():\n\n- Redirect policy (#336 SSRF, #337 key-downgrade): CheckRedirect now refuses\n every redirect. Probing real cached uploads.linear.app attachment URL\n[…]\nd, all 10 subcases fail in 0.005s (was ~4.5m);\nrestored, green under -race.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "harden(cdn): refuse redirects + cap GET body at 100 MiB (#348)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-20T00:35:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "281e7b37fe16d5084395da93969398625c6d1717",
"body": "…line (#329)\n\nFirst deliverable of the security-audit wayfinder map (#319). Establishes the\nsecurity reference every review pass keys off:\n\n- docs/THREAT-MODEL.md — four in-scope personas (hostile workspace member,\n compromised CDN, local user, supply chain), the four trust boundaries where\n untru\n[…]\nAT-MODEL.md in the same change, like ARCHITECTURE.md.\n- .gitignore — allowlist docs/THREAT-MODEL.md (docs/* is ignore-by-default).\n\nCloses #320.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(security): add threat model, wire SECURITY.md + CLAUDE.md discip…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-19T22:35:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9b886efe67c93de42b082fba2170b1d9e488a491",
"body": "A prebuilt-binary AUR package so a fresh Arch box installs with `yay -S\nlinearfs-bin` instead of building from source. Downloads the vX.Y.Z release\ntarball for the host arch (x86_64/aarch64), verifies its sha256 against the\nrelease checksums, and installs /usr/bin/linearfs, the systemd user unit\n(Ex\n[…]\n the publish and per-release version-bump checklist. Build artifacts\n(src/, pkg/, *.pkg.tar.*, downloaded tarball) are gitignored.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "build(aur): add linearfs-bin AUR package (#318)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-19T02:11:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "035a8b7ce94e8c900c0a5c60fbc8d85e2c479f6b",
"body": "…arsers (#317)\n\nThird fuzz batch: the write-only _create command parsers — the bytes a user\nwrites into relations/_create, links/_create, and attachments/_create through\nthe mount (untrusted input → a Linear mutation), the command-syntax counterpart\nto the marshal markdown parsers.\n\nExtraction (beha\n[…]\n-empty identifier.\n\n~30s/target locally (~1.1M execs each), no crashers, no findings. Seeds run in\nthe normal `go test -race` job.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): extract parseLinkInput, then fuzz the _create command p…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T19:56:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2eaa574853b68692b93ad9b02e1a2e388d99e58f",
"body": "…#316)\n\nSecond fuzz batch (after the marshal parse/render seam), extending fuzzing to\nthe other pure input-shaping surfaces. Test-only; no production code changed.\n\ninternal/fs/listing_fuzz_test.go (5 targets over the real derivations):\n- FuzzNamedListing — labels/documents/milestones through the re\n[…]\nizeFilename's contract) so a future round —\nor the fuzzer — does not re-litigate it. Also un-ignore docs/adr/ so ADRs are\ntracked.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: fuzz the listing filename round-trips and SQLite time parsing (…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T19:36:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "efd24fdd1ac95dd90e0819000a8b47ce5119ecc4",
"body": "Closes the standing \"instruments emit but nothing reads them\" gap: a single\ncommand that answers \"is it healthy?\" without journalctl + jq.\n\n`linearfs status` reports:\n- mount liveness — auto-detected from /proc/self/mounts (fuse.linearfs), so it\n finds the real mountpoint however the daemon was sta\n[…]\nail-read of\nthe last line, byte/number/duration humanizers, /proc mount-field unescaping)\nare unit-tested with no mount or daemon.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cmd): add `linearfs status` health snapshot (#315)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T14:53:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "766aeee5006fd9bd2e626048a96f293d1be99e8d",
"body": "The fixture-mode integration suite passed one fresh-process run but failed\nunder `go test -count=N` (N>1): several tests mutated SHARED fixtures (TST-1,\nthe TST team, catalog labels) without restoring them, so in-process reruns —\nand, order-dependently, later reader tests — saw the debris. That bloc\n[…]\n\nreal waits; 3 fresh-process runs green (the CI condition is unchanged).\n\nSpec: docs/plans/2026-07-18-integration-count-safety.md.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(integration): make the offline suite -count-safe (#314)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T14:38:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cd5082136a2a8c37a1864bdbbb26b3c823afd85a",
"body": "Adds two native Go fuzz targets over internal/marshal — the load-bearing\nboundary that turns untrusted file bytes a user writes into the mount into\nLinear mutations, and which had no fuzz coverage.\n\n- FuzzParse asserts Parse never panics and that Parse->Render->Parse is a\n byte-stable fixpoint, sco\n[…]\nender emits\na nested map or a raw float (numeric fields are small ints coerced before\nwrite), so neither shape occurs in practice.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(marshal): fuzz the frontmatter parse/render seam (#313)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T12:48:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bf9e3bb67fc414715951eef4fa4fc14984b3c579",
"body": "…ing (#312)\n\nWave 2 of the maturity push: make the project installable without building\nfrom source.\n\n- .goreleaser.yaml cross-compiles linux+darwin / amd64+arm64 as pure Go\n (go-fuse needs no cgo), stamps version/commit/date, ships tar.gz archives\n with README/LICENSE/INSTALL/KNOWN_ISSUES/contrib\n[…]\nrm —\n the bug-report template asks contributors for this.\n\nCutting the first release (tag v0.1.0) is a separate, deliberate step.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "build: add release pipeline (goreleaser) and reproducible build stamp…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T12:25:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8e5b6b64ac02368e578c24fa9ae772eede5c56ea",
"body": "Position the project for outside contributors: CONTRIBUTING (dev setup,\ntesting philosophy, the CONTEXT.md/ARCHITECTURE.md \"docs are part of the\ndiff\" discipline), SECURITY (private disclosure + API-key/cache.db/umask\nguidance), CODE_OF_CONDUCT (Contributor Covenant 2.1), issue/PR templates,\nand a D\n[…]\nur\" line -> the real two-axis, header-governed\nrate model).\n\nRemove a stray root build artifact and gitignore /linearfs and dist/.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add contributor-OSS scaffolding (#308)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T12:18:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7ac567ad50fbdea3622400d30e64e47cc4ac298d",
"body": "The confirmed-reflection contract (#276) closed the persist-wedge path, but a\npost-persist tail step could still hang the FUSE handler forever: server.Inode\nNotify / EntryNotify do not honor a context and can wedge on an internal go-fuse\nlock or a backed-up kernel-notify queue. A create's write-back\n[…]\nr intent + lowered timeout = deterministic); full fs suite green\nunder -race. ARCHITECTURE.md + telemetry.md updated.\n\nCloses #277\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(fs): bound kernel-notify tail steps against a wedge (#277) (#307)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T02:43:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cca4772bd86d848444a9d47aa8578308e416ed35",
"body": "…tmatter (#227) (#306)\n\nIssue frontmatter fields were defined by three parallel hand-maintained walks —\nIssueToMarkdown (render), MarkdownToIssueUpdate (diff), MarkdownToIssueCreate\n(create) — each hand-coding the same 8 scalar fields (title, status, assignee,\ndue, parent, project, milestone, cycle)\n[…]\n table's key mapping and removal semantics as a change-detector.\nARCHITECTURE.md's marshal section records the table.\n\nCloses #227\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(marshal): declarative issueScalarFields table for issue fron…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T01:39:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "adfe8f06e28830ab6d5afa7fa9955fc8571e122c",
"body": "…int (#197) (#305)\n\nIn fixture mode (no LINEARFS_LIVE_API), any write path exercised WITHOUT\nenableMockMutations — the deliberate loud-failure tests (TestT4_ValidSpecFails\nAtAPILoudly) and incidental post-teardown/validation writes — reached the real\napi.linear.app with the dummy key and 401'd. That\n[…]\nation required\" lines (down from the\nreported noise), 11 offline-marker hits where un-mocked writes fire, 0 failures.\n\nCloses #197\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(integration): point fixture-mode client at a local offline endpo…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T01:21:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7514a953f8abb63e02c527047075411bf1ce0b7f",
"body": "…uge (#256) (#304)\n\nField report (#247 verification): linearfs.process.uptime_seconds read 300.001s\n(~one export interval) at ~93min real uptime, and only 2 `metrics:` dumps\nappeared in the journal over 93 minutes.\n\nInvestigation: the uptime gauge is CORRECT. It captures `start` once at\nregistration\n[…]\nand thus every 5-min metrics summary) are never dropped.\ntelemetry.md records the journald caveat and the mitigation.\n\nCloses #256\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(telemetry): stop journald dropping metrics dumps; guard uptime ga…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T01:07:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "65e0c990cfb76637c4f8cff9e7149fa2802249b7",
"body": "…ate limit (#257) (#303)\n\nObserved live on the first #247 deploy: drainPendingDetailSync hit the client's\nLOCAL budget-deferral error and classified it as a server rate limit, pausing\ndetail sync for a full hour (\"backoff=1h0m5s\") for a condition that clears on\nthe admission ladder's own minute-scal\n[…]\nestIsDeferred, and ErrBudget is now correctly excluded too. ARCHITECTURE.md's\nerror-predicate note records the split.\n\nCloses #257\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(api): treat a local budget deferral as skip-cycle, not a server r…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T00:54:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0c5d24681f628e005b1d256fb83be0ed96961da1",
"body": "execMutation decoded payload[entityField] into the entity AFTER the success\ncheck, so a mutation reporting success:true with a null/absent entity field\ndecoded into a silent zero-value T. An absent field already errored\n(\"unexpected end of JSON input\"), but an explicit null did not:\njson.Unmarshal([\n[…]\ns cover null, absent, valid, and success:false;\nARCHITECTURE.md's mutation-envelope note now records the shared rule.\n\nCloses #273\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(api): reject a null entity on a success:true mutation (#273) (#302)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-18T00:38:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "999214a64f2922030b4209e57ee83846da8fcb79",
"body": "The offline integration suite flaked ~10% under load: a DIFFERENT unrelated\ntest failed each run, either an EIO on a `_create`/edit close or a read, or a\n\"created/renamed X not in listing\" readdir race. Pre-existing (present on base\n`c0244b6`), so PR #295 merged with the check red.\n\nRoot cause (the \n[…]\nsly failed within a few runs at count=30); full integration suite,\ndb/fs unit suites, vet, and staticcheck all clean.\n\nCloses #296\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): detach SQLite ops from FUSE-request cancellation (#296) (#301)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T21:42:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e60de10962cbd55f0148d777238e542dcee115ca",
"body": "commitRename was the only member of the reflection-contract commit-tail\nfamily (commitCreate/commitWriteBack/commitDelete) that emitted no\nrecordFuseOp telemetry, so entity renames were invisible in\nmetrics.jsonl — a query for rename latency/error rate read as \"no\nrenames happen\" rather than \"rename\n[…]\nsFuseOp asserts the\nrename op is recorded on both a success (ok) and a classified-failure\n(eio) path via the shared manual reader.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(fs): instrument commitRename with a \"rename\" fuse op (#294) (#300)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T21:04:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b3c77b0f899866b09e9ada202aeb367d8a924711",
"body": "…t (#291) (#299)\n\nTwo halves of commitRename's contract were unproven, so a regression would\nkeep the suite green:\n\n1. Normalization: the persist stub only counted calls, never recording the\n entity it received, so nothing asserted persist gets the mutate-RETURNED\n (server-normalized) value rath\n[…]\n Add rows feeding\n typed errors through both find and mutate: rate-limit -> EAGAIN,\n FieldError -> EINVAL, notFound -> ENOENT.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(fs): guard commitRename normalization + classified-errno contrac…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T20:57:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fff426e4297bdb1f995994ed8143cf057f732202",
"body": "…e (#293) (#298)\n\nLabelsNode.Rename and DocsNode.Rename each hand-rolled a find closure\nre-implementing fetch -> listing(items).find(name) -> (nil,nil)-on-miss —\nthe exact filename↔name round-trip collectionDir already owns for Lookup\nand Unlink. The pattern lived in ~5 near-identical spots; a chang\n[…]\nk through them, so the resolve round-trip lives in one tested place.\nTestCollectionDirResolve pins hit / clean-miss / fetch-error.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): route rename find through a shared collectionDir.resolv…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T20:09:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "633da83c04ed074fa5643d2df666bffd657486db",
"body": "…ey UUID (#292) (#297)\n\ncommitWriteBack rendered the #278 persist-wedge .error via\nunconfirmedEditMsg(spec.errKey, err), so \"Operation:\" showed the entity\nUUID (or a collection namespace) instead of a human-readable verb+target.\nAn agent reading .error after a wedged issue/project/comment/doc/label/\n[…]\nbel and asserts the .error carries \"Operation: save issue\nENG-1\" and never the raw UUID, guarding the contract against regression.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): give edit persist-wedge .error a real op label, not the errK…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T20:08:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "06effdd1b914ea0c43eea9c75c1d13b9966b55e3",
"body": "LabelsNode.Rename and DocsNode.Rename hand-rolled the same ~70-line tail\n(guards, .md/dashes parse, find, API rename, persist gate, invalidate the\n.md/.meta pair) — the one write path where the confirmed-reflection contract\nwas applied by copy-paste instead of through a shared tail.\n\nExtract commitR\n[…]\nerification stays a layer above the commit-tail primitives\n(recorded in CONTEXT.md); ARCHITECTURE.md now lists four sibling tails.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): extract commitRename tail; dedup Labels/Docs Rename (#295)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T19:38:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c0244b6ae3fe57a7ec08f2f4c0bed87a6ed23fcd",
"body": "The liveReader seam was built to unlock two tests; the first commit wrote\nonly the links phantom/verify-error coverage. Fill the other half: the\npost-mutation re-check branch that adopts the authoritative live entity as\nan idempotent success when the mutation itself fails (committed-but-response-\nlo\n[…]\n the re-check fallback makes the mutate return the error, so each\ntest genuinely pins its branch. Test-only; no production change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(fs): cover both liveReader mutate-failure re-check branches",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T16:43:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d4ee41632bfb275035bbfc1d6c6890b1e48d3beb",
"body": "…branches\n\nThe links create tail's phantom check (#288) and the attachment create\nre-check read the authoritative live list straight off the concrete\nlfs.client *api.Client, which a fixture-mode test can't inject — so the\nphantom fall-through (a never-pruned cache row Linear no longer has) was\nuntes\n[…]\nverage, so an erroringLiveReader fake pins it explicitly.\n\nUpdates docs/ARCHITECTURE.md's API-seam bullet to enumerate liveReader.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(fs): add injectable liveReader seam; unit-test all #288 phantom …",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T16:28:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b67a4ac8ae2b6862770b8b1a0e8640911ef31c96",
"body": "… tests\n\nFollow-through on the 2026-07-17 Fable bug-hunt (#283-#290): un-patched\nsiblings of the #276 confirmed-reflection and #282 dead-handler fixes, plus\nthe CRUD persistence test backlog. Each fix was built test-first (red proving\nthe old behavior, green after).\n\nConfirmed-reflection (Family A) \n[…]\ndelity\ngaps, now fixed: docState (document parent association), UpdateIssue field\noverlay, and UpdateLabel overlay from the store.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): close 7 reflection/dead-handler bugs + full CRUD persistence…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T16:04:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c79dd45b50d8ab347de3407cc5b164aaa0c0429a",
"body": "`rm` on relations/*.rel, links/*.link, and external attachments/*.link\nsilently no-oped: unlink returned 0, wrote no .error, and the row\nsurvived the next readdir. go-fuse dispatches Unlink to the parent\ndirectory's ops, not the child file — so the Unlink methods on\nRelationFileNode / ExternalLinkNo\n[…]\n{Relation,ProjectLink,Attachment}CreateAndDelete in\nwrite_offline_test.go, each verified to fail on the pre-fix code.\n\nCloses #282\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): route info-listing deletes through the directory node (#282)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-17T04:35:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "71ae2222179991369f289cb750c58025d24d4aba",
"body": "test(fs): close write-path edit-persistence gaps in fixture mode",
"is_bot": false,
"headline": "Merge pull request #281 from jra3/john/write-path-edit-tests",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T20:19:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65161d9cf38bc5264cdc92e14f2631837cc994a1",
"body": "TestOffline_MilestoneEditPreservesOtherFields left the shared mount polluted:\nits cleanup re-seeded the store row but did not refresh the live milestone\nnode, whose adopted buffer still held the edited targetDate. The later\nTestFixtureMilestoneFile then read the stale 2025-12-01 and failed. Restore\n\n[…]\n (as the project/initiative tests do),\nwhich clears the node buffer and re-persists — mirroring the projectlabels\ncleanup pattern.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(fs): restore milestone edit through the mount, not a store reseed",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T19:16:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "378a8c2a7967fed352d954dcb84fbb5bbee8ac3c",
"body": "TestClaudeToolEditPersists{Project,Initiative}Description require\nLINEARFS_WRITE_TESTS against the live API, so the default fixture-mode CI\nnever exercised the project/initiative edit-commit tail. Add fixture-mode\ncounterparts (TestOffline_{Project,Initiative}EditPersistsDescription) that\nedit the b\n[…]\nback with the untouched name intact. A sensitivity check (mock disabled ->\ncommit returns EIO) confirms they exercise persistence.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(fs): cover project/initiative edit persistence in fixture mode",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T19:11:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5fac2830d1e915c1ece1965eeae43cb8227eaffc",
"body": "The existing TestWriteContractAtomicRename* tests assert only that an atomic\nsave-via-rename never corrupts the target, and run without the mock mutator\n(so the persisting write fails). Whether a save actually LANDS through the\nrename tail (renameSave) was unchecked — the exact neighborhood of the\ns\n[…]\nsitivity check (mock disabled -> rename returns EIO) confirms the test\nexercises persistence, not just the no-corruption contract.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(fs): verify atomic-save-rename edit persistence in fixture mode",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T19:09:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9332db25dcb4af491725c01bc18c40c568954920",
"body": "MilestoneFileNode.Flush had zero tests (unit or integration): editing a\nmilestone's name/targetDate/sortOrder through the mount was exercised only\nby the create/read/delete lifecycle, never the edit-commit round trip.\n\nAdd TestOffline_MilestoneEditPreservesOtherFields, which edits one field\n(targetD\n[…]\nerlays the input onto the stored milestone (mirroring the project/\ninitiative currentXLocked merge) instead of minting a bare one.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(fs): cover milestone edit persistence in fixture mode",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T19:07:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d583c939522e625715a8259ed839924272359221",
"body": "…tale\n\nfix(fs): fail loud on a spent scratch node serving the canonical file",
"is_bot": false,
"headline": "Merge pull request #280 from jra3/john/atomic-rename-spent-scratch-es…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T18:45:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d4c4af333b4294266774f1a11f10d96c8c3ac7a",
"body": "…-sites\n\nfix(fs): confirmed-reflection contract for the remaining swallow sites (#278)",
"is_bot": false,
"headline": "Merge pull request #279 from jra3/john/confirmed-reflection-remaining…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T18:44:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a93286b7c514f8b7be7202439f6a3a4f26da59cb",
"body": "After an atomic-save rename onto issue.md/project.md/initiative.md, go-fuse\nMvChilds the spent scratchFileNode over the canonical name. renameSave calls\nInvalidateRenamed to force a re-Lookup to the real node, but kernel-notify is\nasync: a write to the canonical file that wins the race against the p\n[…]\neject). The previously-flaky integration pair is now\ndeterministic (20/20).\n\nIndependent of #278 (reproduces on main); own branch.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): fail loud on a spent scratch node serving the canonical file",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T18:17:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9cde870c19cd9069313c8ffe1cecb953ca6a62aa",
"body": "…s (#278)\n\nThe #276 create tail and the reconcile-link fix (b642867) proved that \"a write\nLinear accepted must not fail on a stale local cache — the sync worker\nreconciles\" turns into a silent stale when the daemon is wedged. This applies\nthe same \"confirmed reflection or say why in .error\" contract\n[…]\ner-surface defense in\ndepth that surface a wedge loudly at the write, where #277 heals the process in\nthe background.\n\nCloses #278\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): confirmed-reflection contract for the remaining swallow site…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T17:39:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b64286721ae0d09a79199ff94cc68515e2245f43",
"body": "…#276)\n\npersistInitiativeProjectLink swallowed a failed junction-row write, on the\nbelief every other write path shares: \"a write Linear accepted must not fail\non a stale local cache — the sync worker reconciles.\" That belief has no\nfooting here. A project<->initiative link/unlink bumps NEITHER side\n[…]\ns (edit tail,\nhand-rolled renames, delete forget) all still have a working next-sync or\nretry fallback and are tracked separately.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): fail loud on a dropped initiative<->project junction write (…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T15:51:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a0c963b4d1e13db43fd5f5433b81a0a96523b067",
"body": "commitCreate treated the SQLite write-back as best-effort: on a persist\nfailure it logged a warning and still returned errno 0. When the local\nreflection wedged (a stuck/locked write held by the paused sync worker;\nthe 30s createTimeout fires and sqlite3_interrupt returns an error), a\ncreate that Li\n[…]\nsuccess.\n\nResidual (persist succeeds but a later kernel-notify wedges) needs a\nbackground watchdog/self-heal — filed as follow-up.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(fs): gate create success on confirmed local reflection (#276)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-16T15:04:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a04beccd49d5275598dc3a2e2c106f3a58c5a424",
"body": "refactor: architecture rounds 24-25 (listingDir, circuitBreaker, entityCell)",
"is_bot": false,
"headline": "Merge pull request #274 from jra3/refactor/architecture-round24-25",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-13T02:49:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "98045fb4004803d062f1086f2668f898b221c3db",
"body": "The entity()/setEntity()/refreshFrom() lock dance was hand-copied across 11\nentity-carrying directory nodes, so the 'every entity read/write goes under the\nlock' discipline was enforced only by copy-paste. Embed a generic entityCell[E]\nwith its own mutex: entity()/setEntity() promote onto the node (\n[…]\ncarries the CONTEXT.md doc sections for both this and listingDir, and the\nattrNode comment fix (stateMu now guards only the attr).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): collapse the entity-swap triplet into entityCell[E]",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-13T02:38:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aefdb7ab9ab2cc9d66a3c7009ab9bc06e03ff4cb",
"body": "Gather the client's circuit breaker (two scattered atomics + three inline\nbranches in query(), with no test) into a state machine behind\nallow()/recordFailure()/recordSuccess() -- the isolated sibling of rateBudget.\nThe clock is injected at construction (matching newRateBudget(time.Now)), so the\n30s\n[…]\ntargeted onto the new breaker so the wiring coverage\n(real refused connection trips it, error surfaces through GetTeams) survives.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(api): extract circuitBreaker into a clock-injected module",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-13T02:38:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e89f9e27a940394c7ba46b5b9ac0cb80b621f93e",
"body": "Collapse the identical Readdir+Lookup skeleton hand-copied across the three\nread-only info-listing directories (attachments/, relations/, links/) into one\ndeep module. Each listing already exposes entries()+find(name), so listingDir\ndelegates to it untouched behind the infoListing[E] seam, needing o\n[…]\nilter -> find -> EIO/ENOENT/build) are unit-tested\nwith no mount, mirroring collectiondir_test. Pure refactor, no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): add listingDir[E], the read-only twin of collectionDir",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-13T02:38:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4c8bd8f2f77bebb5000acc76d38f358d884b70c2",
"body": "… buildFile\n\nTwo round-23 follow-ups, completing collectionDir's ownership of the collection\nitem-file surface.\n\n1. Create ride-along. collectionDir.create owns the shared Create shell (.md\n guard → overwrite-existing branch → newCreateFile → the FUSE quad); comments,\n docs, and labels delegate,\n[…]\nheck clean; /code-review verified (attr equivalence, clamp active,\ncomments overwrite inert, onFlush types, NewInode equivalence).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): fold Create into collectionDir; unify labels/milestones…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T19:46:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b60523339e4388e869e2f76d74078dd6ceafddf7",
"body": "Every editable file node (issue/comment/label/document/milestone/project/\ninitiative) drove its FUSE Flush through the same invariant shell around its\nper-entity front half: lock, skip a clean/empty buffer, 30s timeout, run the\nfront half, then on success run commitWriteBack, adopt the fresh value,\n\n[…]\n changes).\n\nCONTEXT.md documents the module. Full unit + integration suites green;\nstaticcheck clean; two-pass /code-review clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): collapse the 7 Flush shells into editFlush[T]",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T19:36:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ea08327c5be16303d8c5effcaa4a6a46bdd9eb3b",
"body": "…ir[T]\n\nThe four dynamic collection nodes (comments/docs/labels/milestones) each\nhand-copied the same Readdir + Lookup + .meta-shadow + Unlink head above the\nlisting/renderFile/commitDelete tails — the trio short-circuit, the .meta shadow\nbranch, the find-or-ENOENT symmetry, the on-error degradation\n[…]\nhead across the four nodes. CONTEXT.md documents the\nmodule; full unit + integration suites green; high-effort /code-review clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(fs): collapse the collection item-file head into collectionD…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T15:48:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bfce4fab837a3be8956ab6ad5b5910b017237137",
"body": "The TB flowchart rendered as a hairball — dagre tangled the edges and there\nwas no visual grouping, so the lanes the prose describes were invisible.\n\nRedraw as flowchart LR with color-coded lane subgraphs (green serving /\ninternal/fs, blue persistence / repo·reconcile·SQLite, amber ingest /\nworker·a\n[…]\ng the\nread entry wrap across the top. Label keeps its internal/fs membership explicit.\nValidated by rendering through mermaid-cli.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: redraw the system diagram as color-coded left→right lanes",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:42:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b387b14f656eb7d3bc6c2b81b392c5b0c1cfcfa1",
"body": "…ope (#263)\n\nPR #219's read-fetch envelope gave every decoded response a null-terminal-is-\nerror guarantee, but three paths still bypassed it. Two of them decoded their\nfirst page outside the shared walkPath descent, where the old silent-zero-value\nfailure mode still lived:\n\n- GetTeamMetadata / GetW\n[…]\nin (the combined-query companion to drain) plus tests\nasserting a null team / null connection now errors. Updates ARCHITECTURE.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(api): route combined-query & batch fetches through the read envel…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:34:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f06ce0d0fd889957530d5f5ff1811402bbf09bec",
"body": "feat: add FUSE-op OTEL instruments to the serving layer (#264)",
"is_bot": false,
"headline": "Merge pull request #272 from jra3/feat/fs-otel-metrics",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:25:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "990c455fd0d222865a188e671de015eaa1de26ae",
"body": "feat: unify CDN HTTP access behind one instrumented api.CDNClient (#262)",
"is_bot": false,
"headline": "Merge pull request #271 from jra3/feat/cdn-seam",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:24:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61701096668cfb92fc81f624535291d2334e4007",
"body": "feat: sync team documents into SQLite (close last live-API read surface, #261)",
"is_bot": false,
"headline": "Merge pull request #269 from jra3/feat/team-docs-sync",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:23:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb4ea17d0f6cee3d0915a1613adc1e5762ba27a9",
"body": "docs: add ARCHITECTURE.md maintenance rule to CLAUDE.md (#265)",
"is_bot": false,
"headline": "Merge pull request #270 from jra3/docs/architecture-sync-rule",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:23:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc1d40ca347afc9c7f9f4a5d0f1a19ddb6e21c27",
"body": "api, sync, repo, and reconcile all recorded OTEL instruments, but internal/fs —\nthe layer users actually feel — recorded none, wiring only the per-request debug\nlog. This adds a serving-layer meter (linearfs/fuse):\n\n- linearfs.fuse.ops {op, outcome} + linearfs.fuse.duration {op} at the three\n commi\n[…]\ner exit fires; the two error-classify sites switched from := (which\nshadowed the named errno) to explicit assignment.\n\nCloses #264\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add FUSE-op OTEL instruments to the serving layer (internal/fs)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T03:09:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a2dd48140fd9fdce5244ab08719b7b12d2286224",
"body": "Two components made raw HTTP calls to uploads.linear.app with their own\nhttp.Clients, invisible to telemetry and with no timeout policy (both ran on\nhttp.DefaultClient, so a stalled CDN could hang a FUSE read or a sync HEAD\nforever): internal/fs's embeddedFileCache (authenticated GETs for embedded-f\n[…]\n.\n\"Who talks to the network\" is now exactly two clients in package api. Docs and\nthe system diagram updated to match.\n\nCloses #262\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: unify CDN HTTP access behind one instrumented api.CDNClient",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T02:51:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8628705605dd2482a8a9aeee054a2d85bc9b57cd",
"body": "docs/ARCHITECTURE.md is now a verified orientation map (562a62e), but it will\nrot the same way it did before unless keeping it current is part of the change\nworkflow. Mirror the existing generateReadme rule: when a change reshapes a\npackage-level seam, contract, data flow, or invariant, update ARCHI\n[…]\nrefer contracts over counts (counts drift fastest); note there\nis no automated guard, so the discipline is the guard.\n\nCloses #265\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add ARCHITECTURE.md maintenance rule to CLAUDE.md",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T02:37:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2257d5ad84d460e65c01e228585977a0d834acea",
"body": "… surface\n\nteams/{KEY}/docs/ was the one FUSE read that violated rule 1 (\"reads never\ntouch the Linear API\"): it served from a blocking, interactive-tier\nclient.GetTeamDocuments, so it failed offline and under rate-limit. The API\nclient stub returned an empty list, claiming Linear had no team-level \n[…]\nxtureAPITeamDocument + fixture seed + integration read test; rewrote\n the API client test to the mock-server pattern\n\nCloses #261\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: sync team documents into SQLite, closing the last live-API read…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-12T02:17:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "04a842c90c7f09345d8ebb4fe56c9346a720af24",
"body": "Fix the three verification-sweep bugs (#258, #259, #260)",
"is_bot": false,
"headline": "Merge pull request #266 from jra3/fix/verification-sweep-bugs",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-11T16:27:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "937569c8852856a5003d8ffd54c42e9a9d4f1d04",
"body": "The persistent --config/-c flag was defined but never read; mount\nalways loaded the XDG default. Now an explicit --config path loads via\nconfig.LoadFrom, which fails loudly on an unreadable file (the user\nnamed that exact file — silently mounting with defaults is worse than\nno flag). The default path keeps its missing-is-fine contract, and\nLINEAR_API_KEY still overrides both.\n\nFixes #260\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: wire the --config flag through to config loading",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-11T15:52:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0faebc088bce5659abb0e9f06e473b6129a7425a",
"body": "… path\n\nlinearfs.go hardcoded ~/Library/Caches/linearfs/files on every OS.\nos.UserCacheDir() resolves to exactly that path on macOS (existing\ncaches carry over) and to XDG ~/.cache/linearfs/files on Linux.\n\nFixes #259\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: embedded-file cache under os.UserCacheDir(), not hardcoded macOS…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-11T15:49:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b4546b206d765496778f23b558eaa359e384629a",
"body": "SQLite orders timestamp TEXT lexicographically and the driver binds a\ntime.Time with its zone offset, so a local-zone time.Now() stamp\nmisorders against UTC cutoff strings — reconcile's cutoff-before-fetch\nprune pattern silently deletes fresh rows east of UTC.\n\nFixed sites: fs/attachments.go and fs/\n[…]\nat both stamps\nSyncedAt/DetailSyncedAt and calls bare time.Now(), catching the\nnow := time.Now() indirection a line-grep would miss.\n\nFixes #258\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: stamp SyncedAt via db.Now() everywhere; add AST discipline test",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-11T15:47:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "562a62e27e5d7e290dab4cb16bd7ffd953cdeb53",
"body": "…+ session record\n\n262 claims verified; 34 corrections applied and ~20 confirmed omissions\nwoven in. Biggest fixes: Store.WithTx was deleted (real model is DSN\npragmas WAL+busy_timeout + single upserts); fs write tails do NOT go\nthrough internal/reconcile (that edge belongs to repo's SWR persist);\nn\n[…]\nr, db.Now()\nwrite-side invariant, intent-named kernel invalidation, dirty-buffer-\nwins, placeholder round-trip, cold-start probe, team rotation.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: correct ARCHITECTURE.md per 77-agent verification against code …",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-11T15:28:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1b795122a466ad94a6ec3249bf7a753d08b7c8bc",
"body": "… current code\n\nThe doc was gitignored (docs/*) and had drifted badly: pre-diet sync\nworker, deleted Repository interface/mock, fictional 1500/hr token\nbucket, '_create reads return empty' (it's EACCES), no reconcile or\ntelemetry sections. Rewritten with every claim verified against the\ncode; whitelisted in .gitignore alongside plans/ and telemetry.md.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add system mermaid diagram and refresh ARCHITECTURE.md prose to…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-11T15:07:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ab4fbef40073a568d18559c920536a307ea1fd57",
"body": "fix: detail batch of 15 exceeds Linear's 10k per-query complexity cap",
"is_bot": false,
"headline": "Merge pull request #255 from jra3/fix/detail-batch-complexity",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T22:08:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4fd0ecedc3b5c2921c9e5a523b1b8d125be2550",
"body": "Observed live immediately after the #238 diet deploy unblocked detail\nsyncing: every batched details fetch was rejected with \"Query too complex.\nComplexity: 12,897. Maximum allowed: 10000\" — the per-issue details\nselection has grown to ~860 points (relations, inverse relations, embedded\nfiles) since\n[…]\n15 failed\nidentically, freezing pending_detail_sync at ~154 forever.\n\ndetailsBatchSize 15 → 10 (~8.6k per batch, headroom for selection growth).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: detail batch of 15 exceeds Linear's 10k per-query complexity cap",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T22:02:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e1c9fba8ada9e2a5d82975dc25316f9ae5229efd",
"body": "…er-length (#5, #6)\n\nKNOWN_ISSUES #5: the project.md/initiative.md body mapped to Linear's short\n`description` field (≤255 chars), so any real multi-paragraph write-up was\nrejected with a bare EINVAL. Map the body to Linear's uncapped `content`\nfield instead; the short `description` becomes read-onl\n[…]\nmeta carries description; IsFieldTooLong\n(7 cases); classifyMutationErr -> EMSGSIZE; the README guard pins both. Full\nsuite green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(projects,initiatives): map body to content field; EMSGSIZE for ov…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T21:44:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0c5512caaa36ded125d33aea4b35623a22e8c28d",
"body": "feat: initiatives change-detection probe on lean cycles (#244)",
"is_bot": false,
"headline": "Merge pull request #254 from jra3/feat/244-initiatives-probe",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T20:12:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2c8e7cb7da560dfc59366a93bf74b89c80551c8",
"body": "Union resolution: both #253 (main) and this branch invented the\nprobe_outcomes instrument independently — canonicalized on main's typed\nrecordProbeOutcome(kind, probeOutcome) API, added probeKindInitiatives,\nadapted this branch's call sites; worker_test.go rebuilt as main's file\nplus this branch's g\n[…]\ngned the two appended test suites into interleaved hunks;\ntelemetry.md probe row merged to cover both kinds; CONTEXT.md keeps both\nnew sections.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Merge origin/main into feat/244-initiatives-probe",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:35:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "56a59888fa888bf5108e17a54c976f3b09d5cc7f",
"body": "feat: team-projects change-detection probe on lean cycles (#243)",
"is_bot": false,
"headline": "Merge pull request #253 from jra3/feat/243-projects-probe",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:27:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6b605be5b4877677a5a12181d7bcb5b906ee773",
"body": "…+ reconcile-deletions metric, mock fields, CONTEXT.md sections)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Merge origin/main into feat/243-projects-probe (union: probe metrics …",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:21:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4f578c4a6d4bbbacba97a19cdb63a4d358e17e7e",
"body": "feat: hourly scheduled issue-ID reconcile sweep (#245)",
"is_bot": false,
"headline": "Merge pull request #252 from jra3/feat/245-issue-id-reconcile",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:17:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "219b09ef81ba805991017ea5872391f7880e8b69",
"body": "Diet slice 2 (#238): lean cycles replace nothing-fetched with a cheap\nper-team projects probe — one newest-first page (orderBy: updatedAt,\nfirst: 5, ~1K complexity) compared against a persisted per-team\nwatermark, vs the ~9.4K/page full drain that was 53% of steady-state\nspend. Full cycles are untou\n[…]\nged project\n upserted + watermark ms round-trip fidelity, probe error continues the\n cycle, deleted project survives lean cycles)\n\nCloses #243\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: team-projects change-detection probe on lean cycles (#243)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:12:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "442ba4452a9334a01e860449e5c2ba2506e60d51",
"body": "Diet slice 3 of #238. Lean cycles now run a scalars-only newest-first\ninitiatives probe (first: 5, orderBy: updatedAt, InitiativeFields, no\nnested projects connection — a few hundred complexity vs the workspace\nquery's ~7.2K) and escalate to the existing full syncWorkspace only when\nthe newest updat\n[…]\nock server; behavior tested at the\nworker's API-client seam (unchanged / changed / probe-error /\nmissing-watermark scenarios on the fake clock).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: initiatives change-detection probe on lean cycles (#244)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:12:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "685ff499031c58221ca0cc823abb62352385a889",
"body": "Issues are the one entity class whose sync is always incremental (never a\ncomplete drain), so a deleted issue that nothing reads lingered forever —\ndeletions were caught only reactively (read 404 → orphan delete → the repo's\ncooldown-gated reconcile pass). This adds slice 4 of the #238 sync-cycle\ndi\n[…]\nrker + repo over the same store). Repo seam — partial-drain\nper-team all-or-nothing + completeness, pending-guard mutual exclusion.\n\nCloses #245\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: hourly scheduled issue-ID reconcile sweep (#245)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T19:11:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7609d5e52e4a6973ddc634c1636d830f0af4c361",
"body": "Add a links/ directory to projects and initiatives for Linear's\n\"Links / Resources\", backed by the EntityExternalLink entity — a distinct\nentity from issue Attachment (which is issue-only; AttachmentCreateInput\nrequires issueId). Same write contract as issue attachments: write\n\"URL [label]\" to _crea\n[…]\ntiatives\n\nDeliberately scoped out: sync-worker prefetch (links populate lazily on read\nvia SWR, matching project/initiative docs).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: expose links/ surface on projects and initiatives (#249) (#251)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T18:54:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ee72d7e19f625cd48c326dd2a56aef4318d21f29",
"body": "feat: validation-failure refresh-and-retry for catalog resolution (#246)",
"is_bot": false,
"headline": "Merge pull request #250 from jra3/feat/246-validation-refresh-retry",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T17:18:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24886439be53b763f6f691d6f360f4dd6906b393",
"body": "feat: two-speed sync cycle — lean by default, full every FullSyncInterval (#242)",
"is_bot": false,
"headline": "Merge pull request #248 from jra3/feat/242-lean-full-cycles",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T17:17:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc447b2587ce35928b705a0f899dcc117a94231b",
"body": "When a frontmatter write fails LOCAL name→ID resolution against a cached\ncatalog (state, label, project, milestone, cycle, user, initiative), the\nresolver now triggers ONE targeted refresh of that catalog, retries the\nresolution ONCE, and only then surfaces the existing validation error to\n.error/EI\n[…]\n no-refresh.\n- Docs: generated README self-healing note (+ readme conformance pin),\n CONTEXT.md \"Catalog refresh-and-retry\" entry.\n\nCloses #246\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: validation-failure refresh-and-retry for catalog resolution (#246)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T17:08:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c73e66653ef2b9653da5237e8f4cccfb07afbd82",
"body": "…ly returns do not)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: clarify full-cycle stamp semantics (partial failures stamp; ear…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T16:33:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b6b14eec64c5de3bc0298d3242a2c37c8ea574e8",
"body": "…rval (#242)\n\nSlice 1 of the sync-cycle diet (#238). The worker's cycle gains a\nlean/full taxonomy:\n\n- Full cycle = the complete pre-diet behavior verbatim: syncWorkspace\n (users + initiatives + project-label catalog) and per-team\n syncTeamMetadata, with all prune licenses, plus the incremental\n \n[…]\np case asserts the stamp was withheld.\nsync_schedule joins the fixture-parity exclusion list (sync-worker\nbookkeeping, no mount-visible render).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: two-speed sync cycle — lean by default, full every FullSyncInte…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T16:30:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ffe75b7161f085c5c9503fcd6cb8264cccda5850",
"body": "refactor: extract UserFields/CycleFields/InitiativeFields query fragments (#232)",
"is_bot": false,
"headline": "Merge pull request #241 from jra3/refactor/232-query-fragments",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T12:37:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2854e30072d3031543a64a52265214f62dff2560",
"body": "fix: paginate hardening — cursor-cycle stall guard, early vars check, composite budget preflight (#232)",
"is_bot": false,
"headline": "Merge pull request #237 from jra3/fix/232-paginate-hardening",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T12:31:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f2d81848dce7b4414cd8c01fbde39bba6c8cc11c",
"body": "…ents (#232)\n\nFinding 6 of the recovered PR #164 review: the field lists these queries\nselect were hand-duplicated — users five times (team members + drain page,\nworkspace users + drain page, viewer), cycles twice (combined metadata\nquery + drain page), and the ~20-line initiative selection three ti\n[…]\n\ndiffer (workspace nests at 50, the single-initiative drain runs at 250).\nNo field-set changes — every query selects exactly what it did before.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: extract UserFields/CycleFields/InitiativeFields query fragm…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T12:31:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7766d9f458814d8cbbc09cf492586cbf7cfe03b5",
"body": "fix: syncWorkspace error aggregation + GetInitiative projects drain (#226)",
"is_bot": false,
"headline": "Merge pull request #236 from jra3/fix/226-workspace-sync-errors",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T12:25:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9c78dc45b71879c4f0361dcc737e8e7097e9b21",
"body": "… composite budget preflight (#232)\n\nThree verified-open findings from the PR #164 review round (issue #232):\n\n- drainFrom's stall guard only caught an immediately-repeated cursor; an\n alternating cycle (A→B→A→…) advanced `after` every iteration and ran\n toward maxDrainPages — up to 10000 paid req\n[…]\n fixes ErrBudget's doc comment, which promised a reconcile errors.Is\nconsumer that never existed (reconcile preflights with LowBudget directly).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: paginate hardening — cursor-cycle stall guard, early vars check,…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T12:24:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "12a232dca6dfbbe6b148055f8615a4642b7dcd8a",
"body": "…#226)\n\nTwo halves of #226:\n\n1. syncWorkspace declared `var errs []error` and gated its return on it,\n but every failure path logged and continued without appending — a pass\n whose every upsert failed returned nil, so the caller recorded success\n over total data loss. The user/initiative conve\n[…]\now selects\n pageInfo and GetInitiative drains the remainder, same contract as\n GetWorkspace: complete Projects.Nodes, nil Projects.PageInfo.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: syncWorkspace error aggregation + GetInitiative projects drain (…",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T12:17:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "351b049c272ad54e400553b050686c8a4f1e8776",
"body": "refactor: relationListing — direction-aware listing for relations/",
"is_bot": false,
"headline": "Merge pull request #225 from jra3/refactor/relation-listing",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T04:00:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68040f19bf797fcc183e4d4f25d9834f2b236244",
"body": "relations/ was the last collection not on a listing module. The\n{type}-{ID}.rel name derivation and the outgoing/inverse direction split\nwere restated at four sites (Readdir's two loops, Lookup's two loops,\ncreateRelation's entryName/.last derivation), the content render\nhand-Sprintf'd unescaped YAM\n[…]\nifier skip, first-match/\nemit-once, the fetch-error seam against a real store, content render\nincl. valid-YAML colon title, and the parse table.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: relationListing — direction-aware listing for relations/",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T03:53:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bb1241e4fde6346ed845044e8908083263c7d17f",
"body": "refactor: worker clock seam — inject now/timer/ticker",
"is_bot": false,
"headline": "Merge pull request #224 from jra3/refactor/worker-clock-seam",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T03:32:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "302db230bf6684ceb9d8e511d02f2fb1d2b240d0",
"body": "The sync worker called time.Now/Since/Until/NewTimer/NewTicker directly\nat ~9 sites, making its timing logic slow-testable (six time.Sleep sites\nand a deadline-poll loop in worker_test.go). rateBudget already had the\ncure — an injected now func() time.Time driven by a fake clock in tests.\nThis gives\n[…]\ntick\non the fake ticker fires exactly one sync cycle.\n\nCONTEXT.md gains \"Worker clock seam\" recording the fields and the\nno-bare-time grep rule.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: worker clock seam — inject now/timer/ticker",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T03:26:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "60e6ba9be33ce6125829bb207c87b138496cf538",
"body": "refactor: complete the parse side of the marshal seam",
"is_bot": false,
"headline": "Merge pull request #223 from jra3/refactor/marshal-parse-side",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T02:53:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e671368a2795335831bd32f86542ca5b8127c56",
"body": "refactor: mount-lifetime context owns every spawned goroutine",
"is_bot": false,
"headline": "Merge pull request #222 from jra3/refactor/mount-lifetime-ctx",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T02:48:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d89ddafeeb0a4ffd5b0d6ce347dc03a5e0291f1e",
"body": "All 7 entities rendered through internal/marshal, but only 4 parsed\nthere. This moves the last three fs-resident parsers onto the seam, so\nmarkdown -> entity now has one owner in both directions:\n\n- marshal.MarkdownToStatusUpdate replaces parseUpdateContent (the hand\n line-scanner shared by project\n[…]\nt asserts the quoted\nrender); render -> MarkdownTo*Edit identity pins for\nproject/initiative. CONTEXT.md gains the \"Entity parse\" sibling entry.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: complete the parse side of the marshal seam",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T02:47:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "99f47959ccbb37eb71873c06d8a57882a3de7d48",
"body": "EnableSQLiteCache's viewer-refresh goroutine ran on the caller's\ncontext.Background() (runMount), so its <-ctx.Done() branch could never\nfire — its 60s backoff ladder could outlive store.Close() and retry\nagainst a closed store.\n\nLinearFS now owns an internal lifecycle context (lifeCtx/lifeCancel,\nm\n[…]\nSpawned pins the ordering\ncontract without sleeps; TestSpawnAfterCloseDeclines pins the decline\nhalf. CONTEXT.md gains a \"Mount lifetime\" entry.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: mount-lifetime context owns every spawned goroutine",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T02:37:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6d5e685ac19eecc6fd6c6ebe9b5996ba38fa347e",
"body": "chore: prune three tiers of dead methods (−3,102 lines)",
"is_bot": false,
"headline": "Merge pull request #221 from jra3/chore/dead-code-prune",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T00:49:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c8afcc89702edc1e240ae8c211e57827e38fe2e",
"body": "WithTx had zero production callers — the durability story is\nbusy_timeout + single upserts, transactions were never adopted. Its\ntest (TestWithTransaction) goes with it. The sqlc-generated\nQueries.WithTx in db.go stays (generated code).\n\nDB() also has zero production callers but is load-bearing for \n[…]\nn fixture loaders, and the junction-table\nobservation helpers the tier-2 prune introduced), so it stays with a\ncomment saying it is a test seam.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: delete Store.WithTx; mark Store.DB() as a test seam",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T00:39:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9930103950e8662f2a5a244da7e559a4642cdd32",
"body": "The receiver-net audit ((q|qtx|Queries()).M( across internal+cmd,\nnon-test, excluding queries.sql.go) found 47 production-dead generated\nquery methods. After the repo-method prune, a re-run found 11 more\nwhose last callers were the deleted repo methods: GetAttachment,\nGetComment, GetCycleByName, Get\n[…]\nthe\nfs filtered-issues test dropped a pure debug block.\n\nAlso updates the round-19 note that said ListTeamIssuesByPriority was\nawaiting removal.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: prune 58 dead sqlc queries (47 audited + 11 tier-1 cascade)",
"author_name": "John Allen",
"author_login": "jra3",
"committed_at": "2026-07-10T00:38:41Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 1,
"commits_last_year": 437,
"latest_release_at": "2026-07-18T12:27:53Z",
"latest_release_tag": "v0.1.0",
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 17,
"days_since_latest_release": 5,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 100,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/jra3/linear-fuse",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/jra3/linear-fuse",
"is_deprecated": false,
"latest_version": "v0.1.0",
"repository_url": "https://github.com/jra3/linear-fuse",
"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-18T12:25:53Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 16
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 110276,
"source_files_sampled": 258,
"oversized_source_files": 4,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 18479
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/hanwen/go-fuse/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.9.0"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "go.opentelemetry.io/otel",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/metric",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/sdk/metric",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "golang.org/x/time",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.14.0"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
},
{
"name": "modernc.org/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.41.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 2,
"merged_prs": 113,
"open_issues": 14,
"closed_ratio": 0.943,
"closed_issues": 231,
"closed_unmerged_prs": 5
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "jra3",
"commits": 334,
"avatar_url": "https://avatars.githubusercontent.com/u/419698?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"integration.yml",
"release.yml",
"test.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 9,
"reason": "27 out of 28 merged PRs checked by a CI test -- score normalized to 9",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"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": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"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": 10,
"reason": "all dependencies are pinned",
"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": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "7f3a8da96d15e96a398ede434350f95f65b8f196",
"ran_at": "2026-07-24T07:24:47Z",
"aggregate_score": 6.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-20T15:40:57Z",
"oldest_open_prs": [
{
"number": 311,
"created_at": "2026-07-18T12:20:01Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 350,
"created_at": "2026-07-20T01:39:46Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-20T15:35:25Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 27,
"created_at": "2025-12-19T13:22:05Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 230,
"created_at": "2026-07-10T12:00:42Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 231,
"created_at": "2026-07-10T12:00:43Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 234,
"created_at": "2026-07-10T12:01:15Z",
"last_comment_at": "2026-07-10T23:48:42Z",
"last_comment_author": "jra3"
},
{
"number": 235,
"created_at": "2026-07-10T12:01:35Z",
"last_comment_at": "2026-07-10T12:37:47Z",
"last_comment_author": "jra3"
},
{
"number": 240,
"created_at": "2026-07-10T12:25:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 275,
"created_at": "2026-07-13T04:41:46Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 333,
"created_at": "2026-07-19T04:02:53Z",
"last_comment_at": "2026-07-19T05:48:33Z",
"last_comment_author": "jra3"
},
{
"number": 359,
"created_at": "2026-07-20T15:12:46Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 360,
"created_at": "2026-07-20T15:12:52Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 362,
"created_at": "2026-07-20T15:32:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 363,
"created_at": "2026-07-20T15:32:34Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 364,
"created_at": "2026-07-20T15:59:40Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 365,
"created_at": "2026-07-23T19:36:26Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/jra3/linear-fuse",
"host": "github.com",
"name": "linear-fuse",
"owner": "jra3"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"security": 62,
"vitality": 76,
"community": 43,
"governance": 55,
"engineering": 70
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 76,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"commits_last_year": 437,
"human_commit_share": 1,
"days_since_last_push": 3,
"active_weeks_last_year": 17
},
"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": "17/52 weeks with commits",
"points": 11.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 17
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "437 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 437
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"releases_count": 1,
"latest_release_tag": "v0.1.0",
"releases_from_tags": false,
"days_since_latest_release": 5,
"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 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 5
}
}
],
"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": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 3,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 3 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 3
}
}
],
"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": 43,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"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": 13.5,
"status": "met",
"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": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 55,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"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 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 81,
"inputs": {
"merged_prs": 113,
"open_issues": 14,
"closed_issues": 231,
"issue_closed_ratio": 0.943,
"closed_unmerged_prs": 5
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "94% of issues closed",
"points": 44.1,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 94
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "113/118 decided PRs merged",
"points": 36.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 113,
"decided": 118
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 56,
"inputs": {
"followers": 19,
"owner_type": "User",
"is_verified": null,
"owner_login": "jra3",
"public_repos": 62,
"account_age_days": 5777
},
"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": "19 followers of jra3",
"points": 9.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 19,
"login": "jra3"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "62 public repos, account ~15 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 62
}
},
{
"code": "account_age_years",
"params": {
"years": 15
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "good",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"packages": [
"github.com/jra3/linear-fuse"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "1 published versions",
"points": 4,
"status": "partial",
"details": [
{
"code": "published_versions",
"params": {
"count": 1
}
}
],
"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": 70,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 66,
"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": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"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": "27 out of 28 merged PRs checked by a CI test -- score normalized to 9",
"points": 18,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"cli",
"filesystem",
"fuse",
"golang",
"issue-tracking",
"linear",
"linear-app",
"project-management"
],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "8 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 8
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 62,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 18,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 0,
"scorecard_aggregate": 6.2
},
"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": "27 out of 28 merged PRs checked by a CI test -- score normalized to 9",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"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": "all dependencies are pinned",
"points": 5,
"status": "met",
"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": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "excellent",
"name": "AI Readiness",
"value": 88,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 18479
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 86,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.77,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "77 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 77,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "dependency automation configured, none observed in the sampled commits",
"points": 5,
"status": "partial",
"details": [
{
"code": "dependency_bot_config_only",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "all dependencies are pinned",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 110276,
"source_files_sampled": 258,
"oversized_source_files": 4
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "4/258 source files over 60KB",
"points": 54.1,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 258,
"oversized": 4
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-24T07:25:02.492883Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jra3/linear-fuse.svg",
"full_name": "jra3/linear-fuse",
"license_state": "standard",
"license_spdx": "MIT"
}