JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"developer-tools",
"git",
"live-reload",
"markdown",
"mermaid",
"viewer"
],
"is_fork": false,
"size_kb": 2293,
"has_wiki": true,
"homepage": "https://vantageapp.dev",
"languages": {
"Go": 566945,
"CSS": 44271,
"HTML": 356,
"Just": 4219,
"Shell": 5983,
"Procfile": 276,
"JavaScript": 1329,
"TypeScript": 745452
},
"pushed_at": "2026-07-25T19:46:18Z",
"created_at": "2026-02-26T20:50:23Z",
"owner_type": "Organization",
"updated_at": "2026-07-25T19:44:05Z",
"description": "A beautiful local Markdown viewer with live reload and Git awareness",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript",
"Go"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "mschulkind-oss",
"company": null,
"location": null,
"followers": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/272380739?v=4",
"created_at": "2026-03-31T01:03:44Z",
"is_verified": null,
"public_repos": 9,
"account_age_days": 119
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.5.3",
"kind": "patch",
"published_at": "2026-07-20T02:46:18Z"
},
{
"tag": "v0.5.2",
"kind": "patch",
"published_at": "2026-07-19T22:33:13Z"
},
{
"tag": "v0.5.1",
"kind": "patch",
"published_at": "2026-05-31T02:10:44Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-05-30T18:19:55Z"
},
{
"tag": "v0.4.2",
"kind": "patch",
"published_at": "2026-04-23T11:43:26Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2026-04-23T04:07:35Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-04-23T02:12:34Z"
},
{
"tag": "v0.3.8",
"kind": "patch",
"published_at": "2026-04-09T03:45:55Z"
},
{
"tag": "v0.3.4",
"kind": "patch",
"published_at": "2026-04-08T03:45:54Z"
},
{
"tag": "v0.3.3",
"kind": "patch",
"published_at": "2026-04-08T03:21:29Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-04-06T21:41:33Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-04-06T21:15:12Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-03-26T02:59:17Z"
},
{
"tag": "v0.0.2",
"kind": "patch",
"published_at": "2026-03-25T05:01:57Z"
},
{
"tag": "v0.0.1",
"kind": "patch",
"published_at": "2026-02-27T19:27:25Z"
}
],
"recent_commits": [
{
"oid": "747f4706415171efd8b7972289da44db90fb5434",
"body": "check-ci runs on every commit via the pre-commit hook, but a hook cannot see the\ntwo things that actually go wrong at the end of a task: work left uncommitted,\nand a gate verified against the mid-task working tree rather than the committed\nstate. `just done` asserts a clean tree, then re-runs check-ci, and prints the\nHEAD it validated.\n\nDocumented in AGENTS.md next to the quality gate, along with the --max-warnings 0\nchange so the strictness is discoverable rather than surprising.",
"is_bot": false,
"headline": "chore: add a `just done` end-of-task gate",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-25T19:13:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "caba056ca2b902f908fe3ead562c693d6aed366e",
"body": "`eslint .` exits 0 on warnings, so check-ci reported them and passed anyway —\nthree stale `eslint-disable-line react-hooks/set-state-in-effect` comments had\nbeen riding along in the gate's output for a while as a result.\n\nThe rule is still enabled as an error in eslint-plugin-react-hooks 7.0.1; it\ns\n[…]\n so the suppressions are dead.\nRemoved them (keeping the explanatory comment in useRelativeTime as prose) and\nadded --max-warnings 0 so the next dead directive fails the gate instead of\ndecorating it.",
"is_bot": false,
"headline": "fix(frontend): fail lint on warnings and drop three dead suppressions",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-25T19:13:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b3bdfa85520bd82228c9edd39ffad888e0c39d7c",
"body": "…orking indicator\n\nThe warning claimed \"the agent responded using the retired changelog protocol —\nnothing was recorded\", but all it knew was that a saved document contained a\n\"<!-- changelog -->\" marker. That fact reads identically whether the response\nvanished or landed through the inbox seconds l\n[…]\nnd never mutates the review; new frontend tests cover the derivation, the\nother-document and nothing-pending cases, and the clear-on-delivery path.\nDesign doc §10.1 records the removal and the lesson.",
"is_bot": false,
"headline": "refactor(review)!: replace the stale-protocol warning with an agent-w…",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-25T17:59:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "256ad9962b4df1166f828f220f9e64d330003e9d",
"body": "The one-shot delivery command wrote straight to the committed name\n(cat > x.jsonl). That is not atomic: the shell creates the file empty\n(open+truncate) and the watcher's CREATE event fires before the write lands,\nso an eager consume claimed the empty file, read zero lines, and deleted it —\ndropping\n[…]\nace window, presuming it mid-write; the write/close\nevent re-fires and the next pass sees the content. A stale empty file (older\nthan the window) still drains as a no-op, so nothing is parked forever.",
"is_bot": false,
"headline": "fix(review): close the inbox write/consume race for direct .jsonl writes",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-24T15:06:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5a098886615083c5f06fea1382ba3e14daf7d3c3",
"body": "The watcher-started line reported only root and watched_dirs, so a repo\nwhose review inbox is watched-but-empty and one that consumes no inbox at all\nlooked identical in the journal. That blind spot made a delivery written into\nan unwatched directory impossible to diagnose from logs. Spell out\ninbox_enabled (a nil store disables consumption), inbox_dir (the absolute path\nan agent must write into for this repo), and inbox_exists at startup.",
"is_bot": false,
"headline": "feat(live): log the inbox situation at watcher startup",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-24T13:46:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "27459749394a48bfb8caad83e4612fcf490008fc",
"body": "A delivery whose path/repo had no review file hit the data == nil branch in\nApplyResponses and vanished without a trace: every entry dropped, the inbox\nfile deleted, no review_changed pushed. The agent believed it answered the\ncomments. Warn on that path, and log every consumed file's outcome (docs,\nentries applied, whether deleted) so a consumed-but-applied-nothing file is\nvisible rather than silent.",
"is_bot": false,
"headline": "fix(review): log inbox consumption outcomes instead of dropping silently",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-24T02:36:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "681c9ac422630f49058ddadc082d3809c0c1a115",
"body": "navigator.clipboard is undefined in a non-secure context, so every copy\nbutton silently did nothing when Vantage was reached over plain HTTP\nunder a non-localhost name — no error, no \"Copied!\".\n\nAdd a shared clipboard helper that falls back to a contentEditable +\nexecCommand(\"copy\") path (iOS-safe, \n[…]\notal failure, shows a toast pointing at the SSH-tunnel\n/ HTTPS workarounds instead of failing silently. Route every copy site\n(review comments, file path, raw content, style-guide snippet) through\nit.",
"is_bot": false,
"headline": "feat(frontend): copy over plain HTTP with a fallback and failure warning",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-24T01:47:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "caa2e2302af43840197d73bcbb6dd4c8b98212cd",
"body": "Vantage could bind to a non-localhost address, but the live-reload\nWebSocket hardcoded a loopback-only origin allowlist, so a browser\nreaching the server under a machine's DNS name (e.g. over a tunnel) was\nrejected with 403 and live reload silently failed.\n\nAdd an `allowed_origins` config key (TOML \n[…]\nD_ORIGINS\nenv, --allowed-origins flag) listing extra hostnames permitted to open\nthe WebSocket. Loopback names remain always-allowed. The Manager now\nconsults these instead of a package-level literal.",
"is_bot": false,
"headline": "feat(live): allow configured non-localhost WebSocket origins",
"author_name": "Matthew Schulkind",
"author_login": null,
"committed_at": "2026-07-24T01:42:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "581993ea12aeca10aabf815dc4ba79d4ce439c42",
"body": "The two-step write-.writing-then-rename prose was more than the allowlist\nnow requires, and it tripped agents up: one read it as needing a rename the\nWrite tool could not perform. Since the consumer takes any completed .jsonl,\na single atomic write is enough.\n\nThe payload now hands over a ready-to-r\n[…]\nand one write means\nVantage never sees a partial file. A parenthetical keeps the mv-a-temp\nfallback for shells without $RANDOM and still warns against line-by-line\nappends. Userguide updated to match.",
"is_bot": false,
"headline": "feat(review): hand agents a one-shot inbox delivery command",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-21T02:01:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "663a5131bc8595e6160baab66e59a25580313e8d",
"body": "…cratch\n\nThe consumer skipped only *.writing and *.oversize and claimed everything\nelse. The inbox is a live directory other tools also write into: an agent\nwhose file-writer commits atomically creates <name>.jsonl.tmp.XXXX, a name\nthe denylist did not recognize, so the consumer claimed and deleted \n[…]\nhe\n.jsonl name directly and skip the .writing step.\n\nRegression test reproduces the exact temp name that broke it. Docs record\nthe denylist-to-allowlist correction (§12.1) and the direct-write option.",
"is_bot": false,
"headline": "fix(review): allowlist committed inbox files instead of denylisting s…",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-21T01:45:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e6ed729ca091979ea573100a0c4ef4c94ca40408",
"body": "Record the completion-signal race in the review-state architecture doc\n(new §12) and update the user guide: the agent commits a delivery by\nrenaming a *.writing scratch file, the *.partial leftover is gone, and the\nretired chat-reply fallback no longer appears.",
"is_bot": false,
"headline": "docs(review): document the write-then-rename inbox commit protocol",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-20T22:29:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f113ed8eaa01d4a37cb71b5583cb79019bce059",
"body": "The clipboard payload told agents to append lines to a shared per-document\n.jsonl file. That is the write side of the race the consumer just stopped\nguessing about: a shared append-only file gives the consumer no way to know\nthe agent is done, and an open append descriptor outlives the consumer's\nde\n[…]\ne name.\n\nAlso drop the 'If you cannot write files' chat-reply fallback: the paste\ndoor it pointed at was removed when the inbox became the only delivery\nchannel, so the instruction pointed at nothing.",
"is_bot": false,
"headline": "feat(review): teach agents to commit inbox deliveries by rename",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-20T22:28:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0443c408043863d09919be792aba2f5f0158fd7e",
"body": "The consumer decided a delivery was complete by asking whether the file\nended in a newline (hasCompleteLine / readCompleteLines' tail split). But\na trailing newline means a *line* finished, not that the *agent* did, so\nconsumption racing an in-progress write lost data two ways: an open\nO_APPEND desc\n[…]\n guessing layer — hasCompleteLine, the tail split, the .partial file and\npreservePartialLine — while the .consuming claim/apply/delete crash-safety,\nnonce dedup, and oversize quarantine are untouched.",
"is_bot": false,
"headline": "fix(review): commit inbox deliveries by rename, not by trailing newline",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-20T22:27:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cd84f867d5f6ca1fb753d4245c7ce3f063a7f0a7",
"body": "Adds §11 to the review-state design doc: the three bugs that surfaced\nafter the rework shipped were one failure mode, and it is §1's sibling.\n§1 was \"the same fact is derived in two places\"; this is \"two different\nfacts are presented in one place\". Both produce reasoning that seems to\nwork until the\n[…]\nart.\n\nUpdates the inbox guide's duplicate-delivery section, which described\nthe behavior as a known rough edge with a sketch of the fix. The fix is\nin, so it now documents the two-layer dedup instead.",
"is_bot": false,
"headline": "docs(review): record the follow-up diagnosis",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-20T02:10:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6106eae94356474facfef858dd1bb0ac6b3f01d2",
"body": "Three user-visible bugs turned out to be one bug wearing three hats: two\ndifferent facts were sharing a single presentation slot, and a flag was\nbeing stored as a conversation turn.\n\nDismissing wrote a turn. The \"Dismiss\" button on an answered comment\ncalled resolveComment, which POSTed to /accept a\n[…]\nar, and the panel UI. The inbox is the only delivery door. Paste\nwas kept for tool-less chat models, but every agent writes files, and a\nsecond door meant a second dedup story for no realized benefit.",
"is_bot": false,
"headline": "fix(review): separate turn state, anchor state, and dismissal",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-20T02:10:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2aea7b274107e1b8728882fd38da6b5bd7efbb4c",
"body": "Two review comments on the page. It never said where a recorded response\nactually lands — now a section covers the one-JSON-file-per-document store,\nits atomicity, that state is machine-local by design, and the single-repo\npath-collision worth knowing about. And the chat-paste fallback is cut: the\ncase it describes (an agent that cannot write a file) does not arise in\npractice, so advertising it was noise.",
"is_bot": false,
"headline": "docs(userguide): say where review state is kept; drop the paste fallback",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-20T01:32:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebb63132de6acf9796bcf2200fe7d90553478fe8",
"body": "The directory appears in a user's repo the first time an agent answers a\nreview comment, and nothing in the product explained it or told them to\ngitignore it — Vantage creates neither the directory nor an ignore entry, so\nit just shows up untracked in git status.\n\nCovers the delivery line format and\n[…]\nvery leftover file they might find and whether it is\nsafe to remove, why the directory is invisible inside Vantage but not to git,\nand the duplicate-answer rough edge with what it would take to close.",
"is_bot": false,
"headline": "docs(userguide): document the .vantage/ delivery inbox",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-20T00:58:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8792cdce93de31b4c0854f17085e638cebab18ec",
"body": "Every one was confirmed by execution — the verifiers wrote throwaway tests\nrather than arguing — out of 22 claims; the other 8 were refuted, several as\ndeliberate documented trade-offs.\n\nThe two that mattered structurally. Inbox consumption preserved an\nunterminated tail unconditionally, including o\n[…]\nsecond stamps; the paste grammar accepts the ids and bullet markers the\ninbox grammar does; and the follow-up note stops telling agents to read a\nfollow-up that an edit-requeued comment does not have.",
"is_bot": false,
"headline": "fix(review): close 14 defects found by attacking the shipped rework",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T19:57:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "34ce03910a6eb5dae5e69aac65ccd04836484ce1",
"body": "…at shipping taught\n\nStatus moves from proposal to implemented with the four commit shas. Section\n10 now records the one thing the plan missed — severing the response-from-\ndocument coupling also severs the only path by which an agent's answer reached\nthe browser, which is why review_changed is load\n[…]\ning\n— and the two defects the adversarial pass found in the landed result, each\nwith the lesson it carries: no error is not it worked, and a warning that\ncries wolf on documentation gets trained away.",
"is_bot": false,
"headline": "docs(design): mark the review-state rework implemented, and record wh…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T19:22:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7e1c0bd615f0339d7141ac4b1d8b42f69b79f064",
"body": "…ponse\n\nBoth defects are the failure this rework exists to eliminate, wearing new\nclothes — found by attacking the landed implementation.\n\nThe paste box reported success whenever the request did not throw. Bullets\nnaming comments the open document does not have — a block pasted into the\nwrong panel,\n[…]\nthe document\nactually being under review, since only a reviewed document can be receiving\na delivery.\n\nAlso corrects the internal/live package comment, which still described\napplying changelog blocks.",
"is_bot": false,
"headline": "fix(review): stop the two ways the new flow could still swallow a res…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T19:17:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b732ff6a4f19a38d4bb869a8ce33428b80ae5e14",
"body": "…hinery\n\nThe document stops being a message channel. ApplyChangelog, the\nAppliedChangelog marker with its block-count-plus-digest format, the\nround-scoped dedup window, the legacy-upgrade pass, and the prev-content cache\nare gone — with the consumable inbox and command endpoints in place, there is\nn\n[…]\nNet: the inference machinery the design doc §5 inventoried is deleted, and\nthe tests that existed to pin it (about 1,400 lines) go with it, replaced by\ntests of behavior the product actually promises.",
"is_bot": false,
"headline": "feat(review)!: retire the changelog protocol and its compensation mac…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T17:59:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b417e787ac54744d50cf10d2f9f8eaf144800e2c",
"body": "…ructions\n\nFrontend half of the rework. Store actions keep their optimistic local\nmutations but each now fires its specific command endpoint instead of PUTing\nthe whole review; a shared runCommand helper adopts the server's echo only\nwhen nothing newer — a write, a reload, or a file switch — landed \n[…]\nrough the same\nguarded adoption and surfacing errors inline.\n\nsaveReview and the snapshots plumbing are now uncalled; they leave in the\nretirement commit along with the server-side changelog protocol.",
"is_bot": false,
"headline": "feat(review): frontend speaks commands; paste box; inbox payload inst…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T17:37:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "59c95eaa1d9d62bf14fdf54ae6c04a4c4c3eec54",
"body": "…e inbox\n\nBackend half of the rework in docs/design/review-state-architecture.md §6-§8.\nThe server becomes the single owner of review state: eight path-scoped command\nendpoints (create/edit/resolve/reply/accept/reopen-reply/bulk-dismiss/delete)\nmutate under the per-file lock and return the persisted\n[…]\nin-memory\nprev-content cache dependency for new responses.\n\n.vantage is always-ignored for listings and serving; the changelog protocol\nand PUT remain alive until the frontend switches (next commits).",
"is_bot": false,
"headline": "feat(review): command endpoints, review_changed push, and the respons…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T17:36:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "450fd55e767203b40db9d7de799b1073783d00f0",
"body": "Round 1 of review (conducted through the review feature itself) resolved the\nopen questions: no agent-facing API or CLI, ever — agents transfer by\ncopy/paste and file writes, so delivery is the consumable inbox file (primary)\nplus the paste box, which turns the §6.2 reversal into a reaffirmation of \n[…]\ne Go-port priority question is withdrawn as stale — the port completed long\nago. Durability and universality cost bullets rewritten accordingly: both are\nnow largely preserved rather than traded away.",
"is_bot": false,
"headline": "docs(design): apply review decisions to the rework proposal",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:57:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5338a188226f91ccbcc407025f5469589f939366",
"body": null,
"is_bot": false,
"headline": "docs(design): make the nine-commit reference stable as history grows",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:44:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "becda8acf2863b98e884674125328d9f0fe639d5",
"body": null,
"is_bot": false,
"headline": "docs(design): soften recommendation wording",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:44:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e32bc7fe006ca77d92fe14a31a0d63037fa14e3c",
"body": null,
"is_bot": false,
"headline": "docs: index the review-state architecture doc",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:43:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "421df97246fa48aca1742ab41bc943192050372e",
"body": null,
"is_bot": false,
"headline": "docs(design): note which review-mode audit gaps have since closed",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:41:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bfd7189c4d93c053d081c62104e48a6958cc945",
"body": "review-mode.md open question 4 chose changelog-block-only — no REST endpoint,\never — before the parser existed and the dedup tax was visible. The\narchitecture doc now engages that recorded decision instead of silently\nreversing it, and review-mode.md gains a postscript pointing forward.",
"is_bot": false,
"headline": "docs(design): link the review-state proposal to the decision it reverses",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:41:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "264bf4d44048e7a0b674a7ba1f44480b625e1723",
"body": "Adopt the direction but do not build now: the current stack is correct and\nmutation-tested, so the migration trigger is the next time review work touches\nthe dedup or merge paths — execute the sketch then instead of extending the\ninference machinery. Lists the open decisions (which agent door ships \n[…]\nent, whether history must travel with the repo, priority\nagainst the Go port). Also drops an unsupportable claim about bug age and\nfixes the CLI example to show the multi-repo flag its prose promised.",
"is_bot": false,
"headline": "docs(design): add recommendation and open questions to review-state doc",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:39:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bfbdf7874ccce0a1eeabfb7704b5c876c6275a81",
"body": "…ed rework\n\nThe review feature's hard bugs all trace to two placements: the document\ndoubling as a never-consumed message channel (forcing content-based identity\ninference — fingerprints, dedup windows, round scoping), and full-state PUTs\nfrom two writers (forcing locks, merges, echoes, and sequence\n[…]\nd proposes command endpoints, event-style response\ndelivery with nonces, a review_changed push, and moment-of-truth before/after\ncapture. Fact-checked adversarially against the code before committing.",
"is_bot": false,
"headline": "docs(design): diagnose review-state placement and propose command-bas…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T16:18:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "73778279eebd1858a5f08ebfc671c5192cc1d016",
"body": "Vantage distinguishes a new answer from one it has already recorded by how the\nchangelog changed, so an entry that changes nothing is indistinguishable from\nthe entry already on file and is ignored — the agent believes it replied and the\nreviewer is told nothing. That case is not decidable from the \n[…]\ncked by handing six agents the real payload and a document already carrying a\nprevious round's block: all six appended a fresh block, left the earlier one\nbyte-identical, and wrote a distinct summary.",
"is_bot": false,
"headline": "docs(review): tell the agent not to write a no-op changelog entry",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T15:05:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "760c38a30e48e6de09323e5903baf4878be0ecfc",
"body": "Three defects the adversarial pass found in the previous two commits.\n\nAn in-place edit to the LIVE changelog block replayed the bullets it had\nalready applied. Appending a block and editing one are different acts: an append\nraises the block count and everything under the new marker is this round's \n[…]\n stale one looked destructive when clicking\nit would only re-arm. Arming now resets any other armed button, and a detached\nbutton's expiry timer no longer retires the arm its rebuilt replacement owns.",
"is_bot": false,
"headline": "fix(review): close the last three replay and confirm gaps",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T14:56:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "acbcc7581bb821b51760f63c9689323f51729132",
"body": "…e honest\n\nsaveReview discarded the PUT response, so a client whose copy predated an agent\nreaction the server merged back never learned of it — its own staleness guard\ndiscards the reload that would have taught it, leaving the two disagreeing until\na manual refresh. It now adopts what the server pe\n[…]\n extend the\nconfirm indefinitely; and expiry is checked when the click arrives rather than\ntrusted to the timer, so a starved timer cannot leave a button that reads \"x\"\nand still deletes on one click.",
"is_bot": false,
"headline": "fix(review): adopt what the server persisted, and keep an armed delet…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T14:47:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "506ef9dfb4e4ac48ef2523aa2eab590b6391af4f",
"body": "… lock table\n\nThe changelog block lives in the document, so it is re-parsed on every later\nsave. What was last consumed is now recorded in the review — a block count plus\na digest of the last block's bullets, the only bullets the parser reads.\n\nBoth halves are load-bearing. A digest alone drops a se\n[…]\nnd was keyed by client-supplied input.\nAnd PUT returns the persisted review instead of an acknowledgement, so a client\nwhose copy predated a merged-back agent reaction learns of it from its own write.",
"is_bot": false,
"headline": "fix(review): record which changelog block was consumed, and bound the…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T14:47:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "df756f400cd6ff469212e6929fc73c957cc0ea16",
"body": "… answer as answered\n\nDeleting a comment took one unconfirmed click on both surfaces and discarded the\nagent's replies along with it, with no undo anywhere in the app. Delete is now\ntwo-click on both, matching the panel's other destructive actions. The confirm\nignores a second click that lands withi\n[…]\nmade before the reviewer\naccepted an answer re-queued the comment when it was later reopened, because the\nedit was compared against the agent's timestamp rather than the acceptance that\nsuperseded it.",
"is_bot": false,
"headline": "feat(review): confirm before deleting a comment, and treat a declined…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T03:44:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "30ebe5c3a5daa67f33fb5f6505d9e4faf76f02b5",
"body": "…ent replies\n\nTwo writers share each review file — the watcher appends agent reactions with a\nread-modify-write, and a browser PUTs the entire review on every edit — with\nnothing serializing them. Either could land inside the other and win.\n\nWrites are now serialized per review file, held across the\n[…]\nso a\nre-parse is distinguishable from a genuinely new answer. It is persisted, so a\nrestart cannot lose it, and carried across a client PUT, which does not know the\nfield and would otherwise blank it.",
"is_bot": false,
"headline": "fix(review): serialize review writes and stop a client PUT erasing ag…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T03:43:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8dc9f009f41da82e0aa731e46a7103059be1ebb6",
"body": "…he sidebar\n\nNeither review surface was sufficient on its own. The sidebar could not show a\nthread — it rendered only the latest agent reaction, so the reviewer's own reply\nvanished the moment they submitted it and every earlier round was invisible. The\ninline surface could not copy a comment, could\n[…]\nw made the next single click destructive; an edit box\noutlived a deleted comment and resurrected its draft if the comment returned;\nand a rejected clipboard write failed silently on every Copy button.",
"is_bot": false,
"headline": "feat(review): reach every comment action from both the document and t…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T02:54:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "294669cff4c5a7548ca09dbced3fc3a9c9729362",
"body": "Replying to a comment did not relight the Copy button. ViewerPage carried its\nown copy of the \"still owed to the agent\" rule that tested \"no agent/addressed\nreaction anywhere\" instead of \"the last reaction is not agent/addressed\", so a\nreply — which appends a reviewer turn after the agent's — left t\n[…]\nwhere a websocket-triggered reload reverted a reply the reviewer had\njust made, and comment creation throwing in a non-secure context — the plain\nHTTP LAN setup — where crypto.randomUUID is undefined.",
"is_bot": false,
"headline": "fix(review): derive comment state from one canonical predicate set",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T02:53:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b38f585ff076575587db9ab7a987d4c082f06e9e",
"body": "ApplyChangelog deduped an agent response by (comment_id, summary) across a\ncomment's entire history. A second-round response that reused its earlier\nsummary was therefore treated as a replay and silently dropped, deadlocking\nthe thread: the reviewer kept seeing an unanswered follow-up while the agen\n[…]\n re-queues the\ncomment\" rule survives the round trip, and promotes the unresolvable-short-id\nlog from Debug to Warn — that path drops an agent response, and at Debug\nnobody could tell it had happened.",
"is_bot": false,
"headline": "fix(review): scope changelog dedup to the current round",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-19T02:53:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9bbce41a7aaa58d568cb087c2b18c10f73e309e8",
"body": null,
"is_bot": false,
"headline": "docs: add AGENTS.md and CLAUDE.md project guide",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T02:28:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a8673633ff88537ceaac718dc636caeb5b4d7b8d",
"body": "…(#61)",
"is_bot": false,
"headline": "build(deps): bump react-router-dom from 7.13.1 to 7.18.1 in frontend …",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T02:05:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f30b2d0b97a4b16540438888b717c8eb92fc2dcb",
"body": "…ript 7)\n\n@vitejs/plugin-react 6 needs peer vite@^8 (we're on vite@^7); typescript 7\nbreaks tsup's bundled rollup-plugin-dts. Revisit when the blockers clear.",
"is_bot": false,
"headline": "ci(dependabot): ignore blocked majors (@vitejs/plugin-react 6, typesc…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T01:52:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb7d1383429292220028938314cc15c10a7584e6",
"body": null,
"is_bot": false,
"headline": "chore: rename .mise.toml to mise.toml",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T00:42:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e42acd141b487171c40121a5d610ab8102c70068",
"body": null,
"is_bot": false,
"headline": "build(deps): bump actions/setup-node from 6 to 7 (#50)",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T00:25:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fce9b6afa9c6dbd30186c507365d545d2fea74b7",
"body": null,
"is_bot": false,
"headline": "build(deps): bump katex from 0.17.0 to 0.18.0 in vantage-md (#54)",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T00:23:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dff7bd5d59f7f4d1ea4ece7ba8f720a6d8dcf918",
"body": "mermaid 11.14.0->11.16.0 (#60), @types/hast 3.0.4->3.0.5 (#59), and\nsmol-toml 1.6.1->1.7.0 (#57). In-range Dependabot bumps.",
"is_bot": false,
"headline": "build(deps): bump vantage-md deps (mermaid, @types/hast, smol-toml)",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T00:22:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8fd3c190627a3ddbcc1a9f30a810c30681c9670b",
"body": "…e, vitest)\n\ndate-fns 4.1.0->4.4.0 (#56), tailwindcss 4.1.18->4.3.3 (#55),\ntailwind-merge 3.4.0->3.6.0 (#52), and vitest + @vitest/coverage-v8\n4.1.2->4.1.10 (#51). In-range Dependabot bumps.",
"is_bot": false,
"headline": "build(deps): bump frontend deps (date-fns, tailwindcss, tailwind-merg…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T00:20:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2c8e6a372df049bd7ce5c50daed2520713fb93c",
"body": "Every git invocation set an explicit working directory but inherited the\nambient environment. When the process runs inside a git hook — e.g. the\npre-commit gate running the test suite — git exports GIT_DIR and\nGIT_INDEX_FILE, which override cmd.Dir and point commands at the outer\nrepo, so the suite \n[…]\nes removed, and route both production call sites\n(GitService.run, FileSystemService check-ignore) and every per-package\ntest git helper through it, so git resolves the repo from the working\ndirectory.",
"is_bot": false,
"headline": "fix(git): shell out to git with repo-location env vars scrubbed",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-18T00:13:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5a6c74a769dbd5b83bee875a588dd9b9d2019907",
"body": null,
"is_bot": false,
"headline": "chore: canonical Apache-2.0 LICENSE",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-17T23:57:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "98437cffebc853b6eed159a4bf087d5aebc32baf",
"body": "analyzeDoc (docTips.ts) scanned each rendered document and appended\n\"gentle tips\" cards at the END of the view — advising how to fix up\nformatting (add code-fence language tags, break up long paragraphs, add\nheadings/links). These notes target the agent that authored the doc, but\nthe agent never see\n[…]\nd-of-document tips render block\n\nKept: the Agent Style Guide modal (StyleGuideModal) and its settings-menu\nentry — that is the reachable, copy-into-your-prompt counterpart the agent\nactually consumes.",
"is_bot": false,
"headline": "feat: remove the formatting fix-up doc tips feature",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-14T16:27:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3dda3c6ac1e9b14aa7cace5825bfea5aa066d881",
"body": "…andler\n\nThe What's New removal (5c12867) deleted the index.html config-injection\nand now serves the embedded bundle as-is, but spaHandler's doc comment\nstill described a \"config-injected index.html\". Update the comment to\nmatch — the SPA fallback serves the bundle's index.html verbatim.",
"is_bot": false,
"headline": "docs(server): drop stale \"config-injected index.html\" wording in spaH…",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-14T16:24:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ac1b1a5fc794802a2c1a2c8e4be0e9e3a53ec7c",
"body": "The red/faint changed-block highlight (left-bar + \"addressed\"/revision\nbadges over blocks that differed from a prior snapshot) was removed in\n1af72ce because reliable block-level change-detection was never\nachievable — it depended on block index alignment that breaks on any\ninsert/delete/reorder/heading-rename. Annotate the design section as\nABANDONED/INFEASIBLE, explain why, and keep the historical description so\nfuture readers do not try to resurrect it.",
"is_bot": false,
"headline": "docs(review-mode): mark changed-block highlight as abandoned/infeasible",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-14T16:16:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf82473e24623aecd95582f726b493d8398e6b0b",
"body": "The results-change effect called setSelectedIndex(0) synchronously inside\nuseEffect, tripping react-hooks/set-state-in-effect (and forcing a prior\ncommit to bypass the hook). Replace it with the React-recommended\n'adjust state during render' pattern: track the previous results and reset\nthe selected index when they change. Also drops the dead isMountedRef guard\n(it was never set to false).",
"is_bot": false,
"headline": "fix(frontend): reset FilePicker selection during render, not in effect",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-14T16:15:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1af72cefc8b6d1d5b3b014d6f5e185c57c4b4949",
"body": "Removes the red change-detection highlight that appeared when hovering\ncomments in the overview strip. The feature never worked reliably and\nwas useless.\n\nDeleted:\n- ReviewStripe: changeMarkers state, measureChangeMarkers, the\n hoveredCommentId store wiring, and the red change-marker overlay\n- useR\n[…]\nreation (TS) and\n BlockHashesAtCreation (Go), plus associated CSS and tests\n\nShared helpers (hashBlockText/blockVisibleText/HashBlockText) are kept\nsince the comment-anchoring system still uses them.",
"is_bot": false,
"headline": "feat: remove the changed-doc-highlight feature",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-14T13:54:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5c128672fd282ef71148e2c9a4086c29820538cc",
"body": "Drop the changelog popup and all its supporting machinery:\n\nFrontend\n- delete WhatsNewModal, useWhatsNew hook, and the changelog Vite plugin\n + virtual:changelog type decls\n- remove plugin from vite/vitest configs\n- drop the Settings menu entry, prop, and ViewerPage wiring\n\nBackend\n- remove Disable\n[…]\nML key\n- __VANTAGE_CONFIG__ only ever carried disableWhatsNew, so drop the\n index.html config-injection entirely; serve the bundle as-is\n\nDocs/tests updated; historical CHANGELOG entries left intact.",
"is_bot": false,
"headline": "feat: remove the \"What's New\" feature entirely",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-07-14T13:46:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8f9af9a824d73d75930fdf3c9fabdff832bdcd05",
"body": "…d (#38)\n\nBumps [katex](https://github.com/KaTeX/KaTeX) from 0.16.45 to 0.17.0.\n- [Release notes](https://github.com/KaTeX/KaTeX/releases)\n- [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/KaTeX/KaTeX/compare/v0.16.45...v0.17.0)\n\n---\nupdated-dependen\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump katex from 0.16.45 to 0.17.0 in /packages/vantage-m…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T16:25:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "98aa5950044812fa50e62527d32325802c754cbc",
"body": "Bumps [yaml](https://github.com/eemeli/yaml) from 2.8.3 to 2.9.0.\n- [Release notes](https://github.com/eemeli/yaml/releases)\n- [Commits](https://github.com/eemeli/yaml/compare/v2.8.3...v2.9.0)\n\n---\nupdated-dependencies:\n- dependency-name: yaml\n dependency-version: 2.9.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump yaml from 2.8.3 to 2.9.0 in /packages/vantage-md (#40)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T16:25:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f9a248f436eb1e7f83272835db650ae98b8be7f",
"body": "…(#41)\n\nBumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) and [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react). These dependencies needed to be updated together.\n\nUpdates `react` from 19.2.4 to 19.2.7\n- [Release notes](https://github.co\n[…]\nrect:development\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps-dev): bump react and @types/react in /packages/vantage-md …",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T16:25:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aba1d1982870b1d9c45121723d3967594b8dcef9",
"body": "Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 19.2.4 to 19.2.7.\n- [Release notes](https://github.com/facebook/react/releases)\n- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/facebook/react/commits/v19.2.7/pa\n[…]\nrect:development\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps-dev): bump react-dom in /packages/vantage-md (#42)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T16:25:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "464defb13698e200e8164b89e7d2a441eef1570f",
"body": "Bumps [axios](https://github.com/axios/axios) from 1.13.2 to 1.18.1.\n- [Release notes](https://github.com/axios/axios/releases)\n- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)\n- [Commits](https://github.com/axios/axios/compare/v1.13.2...v1.18.1)\n\n---\nupdated-dependencies:\n- depe\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump axios from 1.13.2 to 1.18.1 in /frontend (#44)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T16:25:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "929cdc0c9f8ecae9feef662fb84c5904dc4723da",
"body": "Supersedes dependabot PR #39, which failed CI: TypeScript 6 turns the\ndeprecated 'baseUrl' option into a hard error (TS5101), and tsup's dts build\n(rollup-plugin-dts) injects a synthetic baseUrl, breaking 'npx tsup'.\n\nAdd the TS-endorsed bridge \"ignoreDeprecations\": \"6.0\" to the package\ntsconfig. Verified: npx tsup (incl. dts), tsc --noEmit, and the full\n'just build' (frontend bundle + Go embed) all succeed.",
"is_bot": false,
"headline": "build(deps-dev): bump vantage-md typescript to 6.0.3",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-11T15:59:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8ed6d826d778f20b907db5c2e291306bcec25f6",
"body": "Coordinated major bump that supersedes the individual dependabot PRs #43\n(eslint 10), #31 (@eslint/js 10) and #15 (eslint-plugin-react-refresh 0.5),\nwhich each failed 'npm ci' in isolation on an ERESOLVE peer conflict.\n\n- eslint 9 -> 10, @eslint/js 9 -> 10\n- eslint-plugin-react-hooks 7.0.1 -> 7.1.1 \n[…]\nflags the guarded setState in FilePicker, so the\n eslint-disable directive was unused -> removed\n\nVerified: npm install (no ERESOLVE), lint, format:check, tsc --noEmit, and\n280 vitest tests all pass.",
"is_bot": false,
"headline": "build(deps-dev): upgrade frontend eslint stack to v10",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-07-11T15:59:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5d8270fc34c147c070bf2e2a7d934f9bd370a799",
"body": "…d (#33)\n\nBumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.4.27 to 10.5.0.\n- [Release notes](https://github.com/postcss/autoprefixer/releases)\n- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/autoprefixer/compar\n[…]\nrect:development\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps-dev): bump autoprefixer from 10.4.27 to 10.5.0 in /fronten…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T15:34:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "53d084cb2280152e6b7baedfdb3cb072c2ae8f7e",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump actions/checkout from 6 to 7 (#46)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T15:34:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ea11a3f5e372b33ec37932a86d5f63ca374a4fcf",
"body": "Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.20.0 to 0.22.0.\n- [Commits](https://github.com/golang/sync/compare/v0.20.0...v0.22.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sync\n dependency-version: 0.22.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump golang.org/x/sync from 0.20.0 to 0.22.0 (#49)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T15:34:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d81b462900709a6572e7406529669e882feb7b20",
"body": "Bumps [github.com/go-chi/chi/v5](https://github.com/go-chi/chi) from 5.3.0 to 5.3.1.\n- [Release notes](https://github.com/go-chi/chi/releases)\n- [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/go-chi/chi/compare/v5.3.0...v5.3.1)\n\n---\nupdated-depende\n[…]\nirect:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump github.com/go-chi/chi/v5 from 5.3.0 to 5.3.1 (#48)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T15:34:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "15935f762c509fd477628a68b15300fe0d28e595",
"body": "Bumps [github.com/coder/websocket](https://github.com/coder/websocket) from 1.8.14 to 1.8.15.\n- [Release notes](https://github.com/coder/websocket/releases)\n- [Commits](https://github.com/coder/websocket/compare/v1.8.14...v1.8.15)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/coder/websoc\n[…]\nirect:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump github.com/coder/websocket from 1.8.14 to 1.8.15 (#47)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T15:34:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4f2ccf446495e23d2d5f390461e8330e372526a",
"body": "The 2026-04 package extraction wired the frontend to vantage-md's compiled\ndist/, which was built once by 'just setup' and then went stale — editing\npackage source had no effect until tsup was re-run by hand. That also left\norphaned duplicate copies of the components in frontend/src.\n\nResolve vantag\n[…]\nib/{mermaidCache,mermaidLoader}.ts.\n\nVerified: frontend build, 'just build' (Go embed), full test suite, and\ntsc --force all pass with dist/ removed; npm pack still produces a valid\ntarball with dist.",
"is_bot": false,
"headline": "refactor: consume vantage-md from source in-repo; drop dev build step",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-06-13T12:36:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7a98e97e37b8073610a60307f31095d909684733",
"body": "…ents\n\nMermaid diagram modal:\n- Expand the maximized diagram to a near-full-screen modal (96vw x 94vh)\n instead of a small centered card, so large diagrams are legible.\n- Add a zoom/pan viewport: wheel + buttons zoom (cursor-anchored), drag\n pans, double-click or reset button restores fit, with a \n[…]\n\n- Add the vantage-md package's built output to Tailwind's @source so\n classes used only inside the package survive purge.\n\nTests: store helper + copy, and ReviewPanel Copy-button rendering/behavior.",
"is_bot": false,
"headline": "feat: full-screen zoomable mermaid modal; copy replied-to review comm…",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-06-13T03:01:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9f87276960112c0774633af54206e2b22a3667e9",
"body": "The effect bailed early when scrollContainerRef.current was null behind\nthe loading gate, and never re-ran because ref mutations don't trigger\neffects. Fix: observe document.body so the MutationObserver is always\nattached regardless of container mount state.\n\nAlso fix getElementById prefix mismatch in ViewerPage and\nMarkdownViewer — rendered ids are prefixed with \"user-content-\" by\nrehype-slug/sanitize, so fall back to the prefixed id when the raw\none isn't found.",
"is_bot": false,
"headline": "fix: #L anchors scroll on initial load (observe document.body)",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-06-03T16:35:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dba38ab41a2dbdf536dfdf5c4292349eb5a22c04",
"body": "The rendered markdown places all utterances in a single block with\ndata-source-line=\"9\". Individual lines have <a id=\"user-content-L{n}\">\nanchors inside. Fall back to querying these when no block-level\ndata-source-line matches the target.",
"is_bot": false,
"headline": "fix: #L anchors scroll to inline user-content-L{n} elements",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-06-03T02:57:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d6f98a9c3363894a6bc7e81cc19affd4bf85af55",
"body": "The useLineAnchor hook fired before markdown content rendered, finding\nno data-source-line elements. Now falls back to a MutationObserver that\napplies the scroll+highlight as soon as the content appears in the DOM.",
"is_bot": false,
"headline": "fix: #L anchor links now work on initial page load",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-06-03T02:47:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "96216b0b43397e9b9b8aa3c92763ed470ac0fa64",
"body": "…show-hidden default\n\nReview mode: add progressive dismiss button (outdated first, then all with\nconfirmation) to both the page header and the review panel footer. Uses\nmin-width to prevent reflow when the label changes state.\n\nProject picker: fix \"recent\" sort to use the most recently changed markd\n[…]\n's latest git commit, which\ncould be a non-markdown file.\n\nShow hidden: default to off for new installs (localStorage absent) while\npreserving the setting for existing users who already toggled it on.",
"is_bot": false,
"headline": "feat: add dismiss buttons to review mode header; fix recent sort and …",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-05-31T19:36:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c40d106f62c2731e9960c2c3ce67caee410803de",
"body": "Switching the embed sentinel to .gitkeep removed the committed index.html the\nSPA-injection and static-builder tests relied on, so they failed on a clean\ncheckout (CI) while passing locally off stale web/dist. They now skip when no\nfrontend is embedded (web.IndexHTML errors), and CI runs 'just build' before\n'just check-ci' so the frontend is bundled and the tests run for real.",
"is_bot": false,
"headline": "fix(ci): guard embed-dependent tests; build before check-ci",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T02:17:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b715bf5f8001c7d489a786cd14a2b42eb9d44e2",
"body": "…d nudge\n\nThe large chunks (mermaid, cytoscape, katex, markdown) are lazy-loaded separate\nchunks and the app is served locally, so the 500 kB warning is just noise.",
"is_bot": false,
"headline": "chore(frontend): raise Vite chunkSizeWarningLimit to silence the buil…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T02:09:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5efe9bea4c31a47379219e85a9ffe4043cd5a40",
"body": "go install refuses to overwrite a non-Go file at the GOBIN target (e.g. a prior\nuv/Homebrew install or a symlink), failing with 'already exists and is not an\nobject file'. Deploy now builds once, removes any existing file/symlink at the\ntarget, and installs the fresh binary, then restarts the service.",
"is_bot": false,
"headline": "fix: make 'just deploy' replace a stale installed binary",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T02:08:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7b240f49607fc340f56f3fd4379fb577c8f592a",
"body": "Split formatting out of the gate: 'just format' (gofmt + prettier, no tests) is\nthe run-before-commit step; 'just check' depends on it then lints/types/tests;\nthe pre-commit hook and CI run 'just check-ci', which errors on unformatted or\nlint-dirty code and never rewrites files — so reformatted files can't show up\nunstaged after a commit.",
"is_bot": false,
"headline": "build: add 'just format' (no tests); keep check-ci read-only",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T01:12:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c3732e7a4510abeb6f526e63f96e33439d82bdd",
"body": "Public surface is now dev / build / deploy / check / check-ci / setup; the\nlanguage-split sub-recipes (format-*, lint-*, test-*, dev-go/js, build-frontend,\ninstall, restart-service, status, logs, run, done, build-docs) are inlined into\ncheck/check-ci or folded into build/deploy, with bundle + hook setup as private\nhelpers. Updated ci.yml (just check-ci + just build) and the docs to match.",
"is_bot": false,
"headline": "chore: pare the Justfile down to the core recipes",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T00:46:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "45ccd0d39786e77630d13c55bca5e5d67ff32ee3",
"body": "…clean\n\n- Restore install (bundle-frontend + go install with version stamp), deploy\n (install + restart-service), restart-service, status, logs — the Go equivalents\n of the old uv-tool + systemctl recipes dropped in the Justfile rewrite.\n- Switch the //go:embed sentinel from a committed web/dist/index.html (which the\n frontend build overwrote, dirtying the tree on every build/deploy) to a\n web/dist/.gitkeep the build never touches. bundle-frontend now preserves it.",
"is_bot": false,
"headline": "build: restore deploy/install/service recipes; make the bundle build-…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T00:39:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b84aff281b82e3e1bd88e2c73ccbbcb2a3a23257",
"body": "The Go Justfile rewrite dropped the 'npm run format:check' step the original\nlint-ci ran, so prettier drift in the frontend stopped failing the gate — which\nlet an unformatted HistoryPage.tsx get committed and reformatted on the next\nprettier run. Re-add it as lint-ci-js (read-only check, mirroring lint-ci-go's\ngofmt check); CI runs 'just lint-ci' so it is covered there too.",
"is_bot": false,
"headline": "fix(ci): restore the frontend prettier check in lint-ci",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T00:33:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f185bad162d220ff469864464d43830dea90bac7",
"body": null,
"is_bot": false,
"headline": "style: format HistoryPage.tsx with prettier",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-31T00:33:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82b4754e620cee90ce9287e7614f8c395bc1f0de",
"body": "The frontend imports the local vantage-md package; tsc fails with TS2307 unless\nits dist is built first. ci.yml already did this; publish.yml and build-site.sh\ndid not, so the release frontend build failed. Add the build step to both.",
"is_bot": false,
"headline": "ci: build vantage-md before the frontend in release and site builds",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:27:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac2dbd11561813c7033ba0afa94bd235bf672ab8",
"body": "macOS t.TempDir/$TMPDIR live under /var -> /private/var, and 'git rev-parse\n--show-toplevel' reports the physical path. Without resolving symlinks on the\nrepo path, every file looked outside the work tree and history/status/diff came\nback empty (every git test failed on the macOS CI runner). EvalSymlinks the root\nin NewService; add a symlink regression test that reproduces it on any platform.",
"is_bot": false,
"headline": "fix: canonicalize symlinked repo paths so git works on macOS",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:26:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "36a755066c8645e016845bac779a9080352a5c84",
"body": "…ebrew tap)\n\n- publish.yml now triggers on 'release: published' + workflow_dispatch (recovery),\n matching yolo-jail. A matrix build cross-compiles vantage (linux/darwin,\n amd64/arm64) with the embedded frontend and attaches archives to the release;\n the brew job regenerates Formula/vantage.rb and\n[…]\n Go analog\n of yolo's homebrew-pypi-poet step).\n- publish-npm.yml publishes the independent vantage-md library on vantage-md@* tags.\n- Drop GoReleaser (.goreleaser.yaml) and the tag-push release.yml.",
"is_bot": false,
"headline": "ci: match the yolo-jail release flow (Release event -> binaries + Hom…",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:16:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c3414c959d9b3ed537e8c8b71c21633c5691f2e",
"body": null,
"is_bot": false,
"headline": "docs: regenerate the screenshot from the Go app",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0aa7e8908a76b29d0d8a48a23c4627eea56e9296",
"body": "- .goreleaser.yaml + release.yml: cross-compile the vantage binary (linux/darwin,\n amd64/arm64) with the embedded frontend, attach archives to the GitHub release,\n update the Homebrew tap; keep the independent vantage-md npm publish\n- publish.yml: recovery/backfill re-release path\n- scripts/build-\n[…]\n-docs: build the doc site with the Go binary\n- rewire the playwright e2e webServer to the Go binary; restore its fixture under\n frontend/e2e/fixtures; scrub stray Python references from code comments",
"is_bot": false,
"headline": "ci: replace Python packaging with GoReleaser binary + Homebrew release",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6464ea482dd5a3c501a5fc635b6cda202feecea8",
"body": "Describe Vantage as a single Go binary with an embedded frontend: go install /\nHomebrew / from-source install, the cmd + internal package layout, the Go dev\nworkflow, and the REST API without jj. No Python or migration references remain.",
"is_bot": false,
"headline": "docs: rewrite README, CHANGELOG, user guide, and design docs for Go",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f1f104a4c820d8e9e7e49713ba986387992ab5c",
"body": "Best-effort launch of the default browser at the served URL once the listener is\nup; skipped in daemon mode and suppressible with --no-open.",
"is_bot": false,
"headline": "feat(cli): open the browser on serve, with --no-open to suppress",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4e3120bdaebd61011d82112d20f1e8cae2709af",
"body": "The Go implementation under cmd/ and internal/ fully replaces the previous\nbackend. Removes src/, tests/, pyproject.toml, uv.lock, ruff.toml, the Python\nentrypoints and packaging config, and prunes Python entries from .gitignore.",
"is_bot": false,
"headline": "chore: remove the Python backend, tests, and packaging",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f0e202a899a554fa5bf4c961ba9efc3c3211ddd",
"body": "The status-capturing wrapper hid the underlying http.Hijacker, so coder/websocket\nreturned 501 on the /api/ws handshake (caught by the browser e2e). Skip /api/ws in\nthe middleware and expose Unwrap() so http.ResponseController can reach the\nHijacker/Flusher. Regression tests added.",
"is_bot": false,
"headline": "fix: keep websocket upgrades working under the perf middleware",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "119bccb78a81c3607b8842c98a336f86ee63c8e0",
"body": "- internal/static: self-contained site builder reusing the api response builders\n (no live/static drift), output scheme mirrored from the frontend's staticMode\n- internal/server: chi router wiring all routes (legacy + /r/{repo}), resolve\n middleware, perf middleware, /api/ws, SPA serving, repo-activity cache, and\n per-repo watcher lifecycle; multi-repo fan-out overrides for daemon mode\n- cmd/vantage: serve, daemon, init-config, install-service, build, perf-report",
"is_bot": false,
"headline": "feat: add static builder, server integrator, and CLI commands",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9968b11abd771a8a4845be7b5c0644bec0ab6668",
"body": "Delete useJJStore + its test, drop the jj types, and rewrite HistoryPage to a\ngit-only view (no tab bar, evolog, snapshot timeline, or jj diff modal). The\ngit history view and diff modal are retained.",
"is_bot": false,
"headline": "refactor: remove jj support from the frontend",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aaa11e4f53041a210142e54d4cadfebd19099e9d",
"body": "- internal/api: stdlib net/http handlers for all REST endpoints, pure shared\n response builders (used by handlers and the static builder to prevent drift),\n request-context RepoServices boundary + route table for the server to mount,\n contract behaviors (repos sentinel, git-errors-degrade, dual-m\n[…]\nger (per-conn writer, slow-client eviction),\n /api/ws handler (origin gate, hello, client_log), fsnotify watcher with\n debounce/coalesce, cache invalidation, changelog apply, files_changed broadcast",
"is_bot": false,
"headline": "feat: add HTTP api handlers and live websocket/watcher packages",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7f89908f3439ce784bf694b2e91f37214865565e",
"body": "- internal/git: GitService shelling out to the git binary (exact argv, NUL-field\n parsing, separate history/recents log formats, empty-tree root-commit diffs,\n working-diff sentinels, errgroup recents, TTL caches); diff parser to\n model.DiffHunk; integration tests over throwaway repos\n- internal/\n[…]\nlisting,\n symlink tri-state, has_markdown cache, UTF-8/binary content, include-git tree\n status with contains_changes rollup\n\ngit stays decoupled from config via an Options struct (no import cycle).",
"is_bot": false,
"headline": "feat: add git and fs data-layer packages",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "05636d9157d89aa8de4cae74d42f9f830379b64d",
"body": "- internal/model: wire DTOs with exact JSON tags; RFC3339 dates, float64 review\n timestamps, *int line numbers, explicit-null/[]/{} policy per the contract\n- internal/config: unified Config + RepoConfig, env + TOML loading, Validate,\n exclude_dirs absent-vs-present semantics, literal REVIEW_DIR\n- \n[…]\nache\n- internal/review: JSON store + changelog reaction parser reusing reviewanchor\n\nmodel lives at internal/model (not internal/api) to keep it a leaf and avoid an\nimport cycle with the API handlers.",
"is_bot": false,
"headline": "feat: add model, config, perf, ignore, and review packages",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74e55dee4008ccc775d98bb279bcc12c9bca39bd",
"body": "- Go module + mise (go, staticcheck) + Justfile gate (gofmt/vet/staticcheck/test) + CI + dependabot\n- internal/buildinfo: version/commit/build-version with build-info fallback\n- internal/reviewanchor: UTF-16 FNV-1a Markdown block hashing, golden vectors pinned to the frontend\n- cmd/vantage: cobra command tree with serve-by-default argv routing\n- web: //go:embed of the frontend bundle (committed placeholder)",
"is_bot": false,
"headline": "feat: establish Go toolchain, quality gate, and core packages",
"author_name": "Matthew Schulkind",
"author_login": "mschulkind",
"committed_at": "2026-05-30T18:06:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f70c1f81c5827fef38eb05c1024713dc75e123b",
"body": "…le hover\n\n- Inline comments now render reactions as a GitHub PR-style thread\n (Agent/You badges stacked vertically) with a Reply button that opens\n an inline textarea (Cmd+Enter to send).\n- Stripe minimap shows red change-position markers on hover, mirroring\n the document-level changed-block hig\n[…]\nripe markers (not inline\n comment blocks) — more intentional, less confusing.\n- Fixed stale hoveredCommentId when dismissing/deleting a comment\n (the DOM element vanishes so mouseleave never fired).",
"is_bot": false,
"headline": "feat(review): threaded inline replies, stripe change markers, fix sta…",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-05-29T01:24:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aeffc4c66bda0ab5b6426a7562f726a6f53c7dd1",
"body": "…solve to Dismiss\n\n- Snapshot all block hashes at comment creation time so we can detect\n which paragraphs changed between comment-write and now.\n- On hover of any inline comment (or its stripe marker), highlight all\n document blocks whose hash diverges from the creation snapshot.\n- Add Reply butt\n[…]\neply for resolved comments.\n- Rename the reviewer's \"Resolve\" button to \"Dismiss\" — the agent\n resolves, the reviewer dismisses.\n- Include agent responses and reviewer follow-ups in clipboard output.",
"is_bot": false,
"headline": "feat(review): hover-highlight changed blocks, reply/reopen, rename Re…",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-05-26T17:12:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "178fda30e9296b941e5f1c701a83c8cbe21466a6",
"body": "The word-level diff of raw markdown source was unreadable and\ndominated the reaction UI. Agent reactions now show only the\nbadge + summary text. Server-side before/after capture remains\nfor potential future use.",
"is_bot": false,
"headline": "refactor(review): remove before/after diff display from reactions",
"author_name": "Matthew Schulkind",
"author_login": "hs-matt",
"committed_at": "2026-05-26T17:00:31Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 15,
"commits_last_year": 244,
"latest_release_at": "2026-07-20T02:46:18Z",
"latest_release_tag": "v0.5.3",
"releases_from_tags": false,
"days_since_last_push": 2,
"active_weeks_last_year": 19,
"days_since_latest_release": 8,
"mean_days_between_releases": 11.4
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 87,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/mschulkind-oss/vantage",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/mschulkind-oss/vantage",
"is_deprecated": false,
"latest_version": "v0.5.3",
"repository_url": "https://github.com/mschulkind-oss/vantage",
"versions_count": 19,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-20T02:10:41Z",
"latest_version_yanked": null,
"days_since_latest_publish": 8
}
]
},
"popularity": {
"forks": 2,
"stars": 10,
"watchers": 1,
"fork_history": {
"days": [
{
"date": "2026-03-10",
"count": 1
},
{
"date": "2026-03-26",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": null,
"open_issues_and_prs": 8
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Justfile",
"mise.toml"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"frontend/tsconfig.json",
"packages/vantage-md/tsconfig.json"
],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 71423,
"source_files_sampled": 178,
"oversized_source_files": 1,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 3426
},
"dependencies": {
"manifests": [
"frontend/package.json",
"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",
"npm"
],
"dependencies": [
{
"name": "@tailwindcss/typography",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.19"
},
{
"name": "axios",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^1.18.1"
},
{
"name": "clsx",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^2.1.1"
},
{
"name": "date-fns",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^4.4.0"
},
{
"name": "diff",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^8.0.3"
},
{
"name": "gray-matter",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^4.0.3"
},
{
"name": "katex",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^0.16.33"
},
{
"name": "lucide-react",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^1.8.0"
},
{
"name": "marked",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^18.0.4"
},
{
"name": "mermaid",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^11.12.2"
},
{
"name": "react",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^19.2.0"
},
{
"name": "react-dom",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^19.2.0"
},
{
"name": "react-markdown",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^10.1.0"
},
{
"name": "react-router-dom",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^7.18.1"
},
{
"name": "rehype-highlight",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.2"
},
{
"name": "rehype-katex",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.1"
},
{
"name": "rehype-raw",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.0"
},
{
"name": "rehype-sanitize",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.0"
},
{
"name": "rehype-slug",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.0"
},
{
"name": "remark-gfm",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^4.0.1"
},
{
"name": "remark-math",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.0"
},
{
"name": "smol-toml",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^1.6.1"
},
{
"name": "tailwind-merge",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^3.6.0"
},
{
"name": "vantage-md",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "file:../packages/vantage-md"
},
{
"name": "yaml",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.2"
},
{
"name": "zustand",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.9"
},
{
"name": "github.com/BurntSushi/toml",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/caarlos0/env/v11",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v11.4.1"
},
{
"name": "github.com/coder/websocket",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.8.15"
},
{
"name": "github.com/fsnotify/fsnotify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.1"
},
{
"name": "github.com/go-chi/chi/v5",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v5.3.1"
},
{
"name": "github.com/sabhiram/go-gitignore",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20210923224102-525f6e181f06"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "golang.org/x/sync",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.22.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": 8,
"merged_prs": 27,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 2,
"closed_unmerged_prs": 34
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "mschulkind",
"commits": 168,
"avatar_url": "https://avatars.githubusercontent.com/u/523089?v=4"
},
{
"type": "User",
"login": "hs-matt",
"commits": 38,
"avatar_url": "https://avatars.githubusercontent.com/u/47221110?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.816
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"publish-npm.yml",
"publish.yml"
],
"has_docs_dir": true,
"linter_configs": [
"eslint.config.js"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum",
"package-lock.json"
],
"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": null,
"reason": "no pull request found",
"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": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 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": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 6,
"reason": "dependency not pinned by hash detected -- score normalized to 6",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"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": 0,
"reason": "48 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "747f4706415171efd8b7972289da44db90fb5434",
"ran_at": "2026-07-28T06:09:07Z",
"aggregate_score": 4.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-25T19:46:19Z",
"oldest_open_prs": [
{
"number": 62,
"created_at": "2026-07-18T02:03:30Z",
"last_comment_at": "2026-07-18T02:03:37Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 63,
"created_at": "2026-07-18T02:03:37Z",
"last_comment_at": "2026-07-18T02:03:50Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 66,
"created_at": "2026-07-24T22:43:35Z",
"last_comment_at": "2026-07-24T22:43:41Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 67,
"created_at": "2026-07-24T22:43:45Z",
"last_comment_at": "2026-07-24T22:43:51Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 68,
"created_at": "2026-07-24T22:43:56Z",
"last_comment_at": "2026-07-24T22:44:03Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 69,
"created_at": "2026-07-24T22:44:04Z",
"last_comment_at": "2026-07-24T22:44:14Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 70,
"created_at": "2026-07-24T22:44:10Z",
"last_comment_at": "2026-07-24T22:44:21Z",
"last_comment_author": "cloudflare-workers-and-pages"
},
{
"number": 71,
"created_at": "2026-07-24T22:45:15Z",
"last_comment_at": "2026-07-24T22:45:22Z",
"last_comment_author": "cloudflare-workers-and-pages"
}
],
"last_merged_pr_at": "2026-07-11T16:25:30Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/mschulkind-oss/vantage",
"host": "github.com",
"name": "vantage",
"owner": "mschulkind-oss"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"security": 44,
"vitality": 82,
"community": 51,
"governance": 51,
"engineering": 88
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 82,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 77,
"inputs": {
"commits_last_year": 244,
"human_commit_share": 0.9,
"days_since_last_push": 2,
"active_weeks_last_year": 19
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "19/52 weeks with commits",
"points": 13.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 19
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "244 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 244
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 15,
"latest_release_tag": "v0.5.3",
"releases_from_tags": false,
"days_since_latest_release": 8,
"mean_days_between_releases": 11.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "15 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 15
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 8 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 8
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~11.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 11.4
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 51,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"forks": 2,
"stars": 10,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "10 stars",
"points": 15.5,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 10
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"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 (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 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": 51,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.816
},
"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 82% of commits",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 82
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"merged_prs": 27,
"open_issues": 0,
"closed_issues": 2,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 34
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "27/61 decided PRs merged",
"points": 16.9,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 27,
"decided": 61
}
}
],
"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": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 42,
"inputs": {
"followers": 3,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "mschulkind-oss",
"public_repos": 9,
"account_age_days": 119
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "3 followers of mschulkind-oss",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 3,
"login": "mschulkind-oss"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "9 public repos, account ~0 yr old",
"points": 7.9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 9
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/mschulkind-oss/vantage"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 8
},
"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 8 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 8
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "19 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 19
}
}
],
"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": "excellent",
"name": "Engineering Quality",
"value": 88,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 80,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "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": "eslint.config.js",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.js"
}
}
],
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"topics": [
"developer-tools",
"git",
"live-reload",
"markdown",
"mermaid",
"viewer"
],
"has_wiki": true,
"homepage": "https://vantageapp.dev",
"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": "https://vantageapp.dev",
"points": 15,
"status": "met",
"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": "6 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 6
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 44,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 44,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 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 not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 6",
"points": 3,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"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": "48 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "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": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 3426
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, 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": "90 of 90 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 90,
"sampled": 90
}
}
],
"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",
"package-lock.json"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Justfile",
"mise.toml"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"frontend/tsconfig.json",
"packages/vantage-md/tsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0.1
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Justfile, mise.toml",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Justfile, mise.toml"
}
}
],
"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": "eslint.config.js",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.js"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "frontend/tsconfig.json, packages/vantage-md/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "frontend/tsconfig.json, packages/vantage-md/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "10 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 10,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 6",
"points": 6,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 71423,
"source_files_sampled": 178,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/178 source files over 60KB",
"points": 54.7,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 178,
"oversized": 1
}
}
],
"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": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T06:09:14.095882Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mschulkind-oss/vantage.svg",
"full_name": "mschulkind-oss/vantage",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}