Payload
{
"action": "created",
"comment": {
"url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/comments/3359864342",
"pull_request_review_id": 4432713757,
"id": 3359864342,
"node_id": "PRRC_kwDOQc69G87IQ3YW",
"diff_hunk": "@@ -0,0 +1,311 @@\n+# `generate_report.py` — Design Doc\n+\n+**Status:** Draft, pending review\n+**Author:** Juan Pedro\n+**Goal:** Make eval output evaluable by a human in minutes, not hours.\n+\n+______________________________________________________________________\n+\n+## Problem\n+\n+Today, inspecting an eval run means:\n+\n+1. Eyeballing the terminal output of `calc_stats.py` (a fixed-width table).\n+1. Re-running `grade.py` and reading another terminal block.\n+1. Opening individual `case_*_result.json` files to see the prompt, the diff,\n+ the grading detail, the conversational reply.\n+1. Going to the `NIXMAC_LOGFILE` (`*.out`) to grep around for the chain of tool\n+ calls used in a given iteration.\n+\n+Every step is a context switch. There is no shareable artifact: a reviewer\n+who is not me cannot inspect the same run without rerunning everything.\n+\n+## What this tool does\n+\n+A single Python script, `apps/eval/generate_report.py`, that takes:\n+\n+- the results directory (default `data/results/`),\n+- optionally the eval log file (`NIXMAC_LOGFILE`, default auto-detected),\n+\n+and produces an HTML report under `data/report/` (configurable) that a human\n+can open locally to inspect the whole run.\n+\n+```\n+uv run python generate_report.py\n+uv run python generate_report.py -i data/results -o data/report\n+uv run python generate_report.py --log 2026-05-19-evals.out\n+uv run python generate_report.py --golden-only\n+```\n+\n+It does **not** re-run the eval and does **not** re-grade — it expects\n+`grade.py` to have run first (and warns if any case is missing `grade`).\n+\n+## User journey\n+\n+Two personas, one document.\n+\n+**Reviewer (PM, eng lead).** Opens `report/index.html`. Sees the headline\n+pass rate, the segmented breakdown, and a scannable table of all cases.\n+Clicks into the failed ones. Reads the prompt, sees the diff, reads\n+*why* the grader marked it failed, decides whether they agree.\n+\n+**Author of changes (model / prompt iteration).** Same entry point.\n+Filters to a single failure class or a single category. For one case,\n+expands the chain of tool calls to understand *what the model was trying\n+to do* before it went wrong.\n+\n+The report should be openable directly from disk (`file://`) — no server.\n+\n+## What the report looks like\n+\n+### Layout\n+\n+```\n+data/report/\n+├── index.html ← summary + case table, links to detail pages\n+├── cases/\n+│ ├── case_1.html\n+│ ├── case_3.html\n+│ └── ...\n+└── assets/\n+ ├── style.css\n+ └── report.js ← only for client-side filter/sort\n+```\n+\n+(Open question — see Q1 — whether multi-file or single-file is preferred.)\n+\n+### `index.html`\n+\n+**Section 1 — Headline.** One block, large:\n+\n+> **Pass rate: 23 / 28 (82%)** — golden set\n+> Model: `gpt-oss-120b` (vllm) · Summary: `gpt-4o` · 2026-05-19 · 28 cases\n+\n+If a previous report is supplied via `--compare path/to/prev`, the\n+delta vs. the previous run goes here too (`+2 cases`, `-1 case`).\n+\n+**Section 2 — Segmented summary.** Three cards side by side:\n+\n+- **Succeed** (N/M passed)\n+- **Fail gracefully** (N/M passed)\n+- **Refuse** (N/M passed)\n+\n+Each card shows pass rate, count, and the dominant failure class\n+for the failures in that bucket.\n+\n+**Section 3 — Aggregate stats.** The same numbers `calc_stats.py`\n+prints today, but rendered as a clean table with three columns:\n+Overall / Passing / Failing. Sourced by importing `calc_stats`\n+directly (no logic duplication).\n+\n+**Section 4 — Failure breakdown.** Bar chart or simple bar-row of\n+`failure_class` counts, with each bar linking to a filtered view of\n+the case table (e.g. clicking `reasoning_error` scrolls the table\n+and applies the filter).\n+\n+**Section 5 — Case table.** One row per case. Columns:\n+\n+| # | Status | Outcome | Category | Iters | Builds | Tokens | Duration | Failure class | Prompt (truncated) |\n+|---|--------|---------|----------|-------|--------|--------|----------|---------------|--------------------|\n+| 1 | ✓ | succeed | package | 5 | 1 | 41101 | 14s | — | Install ripgrep … |\n+\n+- Row links to `cases/case_N.html`.\n+- Header is sortable client-side. A tiny set of filter chips at the\n+ top: `All / Pass / Fail / succeed / fail_gracefully / refuse / golden-only / has-tool-trace`.\n+- Conversational cases get a 💬 glyph in the diff column.\n+\n+### `cases/case_N.html`\n+\n+A single page per case, top to bottom:\n+\n+1. **Header.** Case ID, status pill (PASS/FAIL), expected outcome,\n+ category/subcategory, priority. Links: ← previous / next →, back to index.\n+1. **Prompt.** Verbatim, in a quoted block. CSV `notes` column shown\n+ underneath if present.\n+1. **Verdict.** A table of grading checks (`completed_ok`, `has_diff`,\n+ `build_attempted`, …), each with a ✓/✗ and the grader's `detail`\n+ string. The failure class is highlighted if the case failed.\n+1. **Diff.** The unified diff from `result.gitStatus.diff`,\n+ syntax-highlighted (red/green per line, file headers bold). Empty\n+ diff renders as a placeholder. (Open question Q4 — diff library\n+ choice.)\n+1. **Conversational response.** Shown only if `result.conversationalResponse`\n+ is set, as a quoted block.\n+1. **Commit message / summary.** From `result.summary.commitMessage`\n+ / `result.summary.instructions` when present.\n+1. **Telemetry.** Compact table: iterations, build attempts, edits,\n+ tool-calls count, thinking entries, duration, tokens (in/out\n+ if available).\n+1. **Tool-call chain.** Collapsed by default. When expanded, shows the\n+ per-iteration trace parsed from the log (see \"Where the tool-call\n+ chain comes from\" below). If the log is unavailable, a friendly\n+ \"tool trace not captured for this run\" placeholder.\n+\n+Every section has an anchor link so a reviewer can deep-link to\n+e.g. `case_27.html#diff`.\n+\n+### Tool-call chain — what it looks like\n+\n+Per iteration:\n+\n+```\n+ITERATION 2 (active messages=4, build_attempts=0/5)\n+└── 🔧 list_files { pattern: \"**/*.nix\" }\n+ └── returned 365 bytes (15 files)\n+\n+ITERATION 3\n+└── 🔧 read_file { path: \"modules/darwin/packages.nix\" }\n+ └── returned 1111 bytes\n+\n+ITERATION 5\n+└── 🔧 edit_nix_file { action: add, path: environment.systemPackages,\n+ values: [\"ripgrep\",\"fd\"] }\n+ └── 📝 Semantic Edit applied\n+```\n+\n+Rendered as a vertical timeline. Tool name and args are the main signal;\n+the response size / summary is secondary. Long arg values are collapsible.\n+\n+## Where the tool-call chain comes from\n+\n+This is the most under-specified part of the existing pipeline and the\n+main reason for this doc.\n+\n+- The result JSON only stores `telemetry.toolCallsCount` — no actual\n+ trace.\n+- The full trace exists only in the `NIXMAC_LOGFILE` (`*.out`), as\n+ stderr-style tracing-subscriber lines.\n+- The logfile contains *all* cases concatenated in run order, delimited\n+ by the `EVOLUTION STARTING` / `EVOLUTION COMPLETE` banners and an\n+ `Evolution ID:` line. Mapping log section → case ID is not direct;\n+ it has to be done by ordering against the prompt (logged as\n+ `📝 Prompt: <text>`) and/or run order.\n+\n+The design assumes a best-effort log parser that:\n+\n+- Splits the log into per-evolution sections.\n+- Matches each section to a result JSON by prompt text (exact match\n+ on the first line) — falls back to \"section index N\" if no match.\n+- Extracts each `ITERATION N`, `🔧 Model requested …`, `→ <tool> | args:`,\n+ `Tool returned … bytes`, and the various per-tool result lines\n+ (`📝 Semantic Edit`, `🔍 Search Packages …`).\n+- Stores the parsed trace as JSON next to the case (`cases/case_N.trace.json`)\n+ so the HTML can be regenerated without re-parsing the log.\n+\n+If `--log` is omitted and no `*.out` is auto-detected, traces are simply\n+absent — the rest of the report still works.\n+\n+## Out of scope (v1)\n+\n+- Re-running the eval, or invoking `grade.py` automatically.\n+- Side-by-side diff of two runs (compare is text-only in v1).\n+- Anything LLM-as-judge (semantic grading is a separate workstream).\n+- Editing / annotating grades from the report (read-only).\n+- Hosting the report anywhere — purely local `file://`.\n+\n+## Implementation sketch (non-binding, here to make the doc honest)\n+\n+- Stdlib only where possible: `json`, `csv`, `html`, `pathlib`,\n+ `dataclasses`. Reuses `calc_stats.extract_metrics` and\n+ `grade.load_csv_lookup` / `grade.load_expectations`.\n+- Templating: Jinja2 if we're OK adding the dep; otherwise plain\n+ f-strings in a `templates.py` module. (Open question Q5.)\n+- Diff rendering: `difflib.HtmlDiff` is built-in but ugly; a small\n+ custom renderer that classes each line `add`/`del`/`hunk`/`ctx`\n+ is probably better. (Open question Q4.)\n+- Log parser: ~150 LOC, line-based state machine.\n+- No JS framework. A 50-line `report.js` for sort + filter on the\n+ case table. Page should be fully usable with JS disabled.\n+\n+______________________________________________________________________\n+\n+## Open questions / choices I'd like your input on\n+\n+**Q1. Single-file vs. multi-file report.**\n+Multi-file (proposed above) keeps each case page small and lets you\n+share a single deep link. Single-file is easier to email / archive,\n+but a 28-case run with full tool traces will be ~5–10 MB of HTML and\n+slow to load. Lean multi-file?\n+\n+ANSWER: multi-file\n+\n+**Q2. Tool-call chain — how hard do we try in v1?**\n+Three options, in increasing effort:\n+\n+1. **Skip it.** Ship without the tool-call timeline; add a \"trace\n+ not available — pass `--log`\" placeholder. Fastest, most honest.\n+1. **Best-effort log parse** (described above). Matches log sections\n+ to cases by prompt text. Works but is brittle when prompts repeat\n+ or get truncated in the log.\n+1. **Capture in the runtime.** Have `run_evals.py` (or nixmac itself)",
"path": "apps/eval/wip/generate_report-design.md",
"commit_id": "913b0c94c72e655237a22f344eb4030e3be13bb5",
"original_commit_id": "913b0c94c72e655237a22f344eb4030e3be13bb5",
"user": {
"login": "scottmcmaster",
"id": 3137688,
"node_id": "MDQ6VXNlcjMxMzc2ODg=",
"avatar_url": "https://avatars.githubusercontent.com/u/3137688?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/scottmcmaster",
"html_url": "https://github.com/scottmcmaster",
"followers_url": "https://api.github.com/users/scottmcmaster/followers",
"following_url": "https://api.github.com/users/scottmcmaster/following{/other_user}",
"gists_url": "https://api.github.com/users/scottmcmaster/gists{/gist_id}",
"starred_url": "https://api.github.com/users/scottmcmaster/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/scottmcmaster/subscriptions",
"organizations_url": "https://api.github.com/users/scottmcmaster/orgs",
"repos_url": "https://api.github.com/users/scottmcmaster/repos",
"events_url": "https://api.github.com/users/scottmcmaster/events{/privacy}",
"received_events_url": "https://api.github.com/users/scottmcmaster/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"body": "I believe this would be pretty hard to pipe through the application. I vote for the first option, to me it's fine if you want to look at tool-call traces -- not something you do every day -- it's ok to have to go through the logs (and possibly preferable given they contain other useful info interleaved).",
"created_at": "2026-06-05T01:50:44Z",
"updated_at": "2026-06-05T01:50:44Z",
"html_url": "https://github.com/darkmatter/nixmac-web/pull/266#discussion_r3359864342",
"pull_request_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266",
"_links": {
"self": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/comments/3359864342"
},
"html": {
"href": "https://github.com/darkmatter/nixmac-web/pull/266#discussion_r3359864342"
},
"pull_request": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266"
}
},
"reactions": {
"url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/comments/3359864342/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"start_line": null,
"original_start_line": null,
"start_side": null,
"line": 240,
"original_line": 240,
"side": "RIGHT",
"author_association": "CONTRIBUTOR",
"original_position": 240,
"position": 240,
"subject_type": "line"
},
"pull_request": {
"url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266",
"id": 3806174943,
"node_id": "PR_kwDOQc69G87i3Z7f",
"html_url": "https://github.com/darkmatter/nixmac-web/pull/266",
"diff_url": "https://github.com/darkmatter/nixmac-web/pull/266.diff",
"patch_url": "https://github.com/darkmatter/nixmac-web/pull/266.patch",
"issue_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/266",
"number": 266,
"state": "open",
"locked": false,
"title": "feature: eval report generation (first iteration)",
"user": {
"login": "arximboldi",
"id": 4521138,
"node_id": "MDQ6VXNlcjQ1MjExMzg=",
"avatar_url": "https://avatars.githubusercontent.com/u/4521138?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/arximboldi",
"html_url": "https://github.com/arximboldi",
"followers_url": "https://api.github.com/users/arximboldi/followers",
"following_url": "https://api.github.com/users/arximboldi/following{/other_user}",
"gists_url": "https://api.github.com/users/arximboldi/gists{/gist_id}",
"starred_url": "https://api.github.com/users/arximboldi/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/arximboldi/subscriptions",
"organizations_url": "https://api.github.com/users/arximboldi/orgs",
"repos_url": "https://api.github.com/users/arximboldi/repos",
"events_url": "https://api.github.com/users/arximboldi/events{/privacy}",
"received_events_url": "https://api.github.com/users/arximboldi/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"body": "Introduces a `apps/eval/generate_report.py` script that generates an HTML report for a given report. You need to call it after `run_evals.py`, `grade.py` and `calc_stats.py`.\r\n\r\nFuture features include:\r\n- Improve the ergonomics of the whole workflow (perhaps merge scripts into a single command).\r\n- Support passing the initial Nix template (currently it seems to use the config.\r\n- Running and comparing multiple evaluations with different settings (different commits of Nixmac, different Nix templates, different LLM backends, etc.)",
"created_at": "2026-06-04T21:42:30Z",
"updated_at": "2026-06-05T01:50:44Z",
"closed_at": null,
"merged_at": null,
"merge_commit_sha": "11b32c9a5eeb620ac88bf158e1b406aafc60ddbb",
"assignees": [
{
"login": "arximboldi",
"id": 4521138,
"node_id": "MDQ6VXNlcjQ1MjExMzg=",
"avatar_url": "https://avatars.githubusercontent.com/u/4521138?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/arximboldi",
"html_url": "https://github.com/arximboldi",
"followers_url": "https://api.github.com/users/arximboldi/followers",
"following_url": "https://api.github.com/users/arximboldi/following{/other_user}",
"gists_url": "https://api.github.com/users/arximboldi/gists{/gist_id}",
"starred_url": "https://api.github.com/users/arximboldi/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/arximboldi/subscriptions",
"organizations_url": "https://api.github.com/users/arximboldi/orgs",
"repos_url": "https://api.github.com/users/arximboldi/repos",
"events_url": "https://api.github.com/users/arximboldi/events{/privacy}",
"received_events_url": "https://api.github.com/users/arximboldi/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
}
],
"requested_reviewers": [
{
"login": "fkb032",
"id": 249513614,
"node_id": "U_kgDODt9Gjg",
"avatar_url": "https://avatars.githubusercontent.com/u/249513614?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/fkb032",
"html_url": "https://github.com/fkb032",
"followers_url": "https://api.github.com/users/fkb032/followers",
"following_url": "https://api.github.com/users/fkb032/following{/other_user}",
"gists_url": "https://api.github.com/users/fkb032/gists{/gist_id}",
"starred_url": "https://api.github.com/users/fkb032/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/fkb032/subscriptions",
"organizations_url": "https://api.github.com/users/fkb032/orgs",
"repos_url": "https://api.github.com/users/fkb032/repos",
"events_url": "https://api.github.com/users/fkb032/events{/privacy}",
"received_events_url": "https://api.github.com/users/fkb032/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
}
],
"requested_teams": [],
"labels": [],
"milestone": null,
"draft": false,
"commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266/commits",
"review_comments_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266/comments",
"review_comment_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/comments{/number}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/266/comments",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac-web/statuses/913b0c94c72e655237a22f344eb4030e3be13bb5",
"head": {
"label": "darkmatter:jp/eval-report",
"ref": "jp/eval-report",
"sha": "913b0c94c72e655237a22f344eb4030e3be13bb5",
"user": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"repo": {
"id": 1104067867,
"node_id": "R_kgDOQc69Gw",
"name": "nixmac-web",
"full_name": "darkmatter/nixmac-web",
"private": true,
"owner": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"html_url": "https://github.com/darkmatter/nixmac-web",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/darkmatter/nixmac-web",
"forks_url": "https://api.github.com/repos/darkmatter/nixmac-web/forks",
"keys_url": "https://api.github.com/repos/darkmatter/nixmac-web/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/darkmatter/nixmac-web/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/darkmatter/nixmac-web/teams",
"hooks_url": "https://api.github.com/repos/darkmatter/nixmac-web/hooks",
"issue_events_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/events{/number}",
"events_url": "https://api.github.com/repos/darkmatter/nixmac-web/events",
"assignees_url": "https://api.github.com/repos/darkmatter/nixmac-web/assignees{/user}",
"branches_url": "https://api.github.com/repos/darkmatter/nixmac-web/branches{/branch}",
"tags_url": "https://api.github.com/repos/darkmatter/nixmac-web/tags",
"blobs_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac-web/statuses/{sha}",
"languages_url": "https://api.github.com/repos/darkmatter/nixmac-web/languages",
"stargazers_url": "https://api.github.com/repos/darkmatter/nixmac-web/stargazers",
"contributors_url": "https://api.github.com/repos/darkmatter/nixmac-web/contributors",
"subscribers_url": "https://api.github.com/repos/darkmatter/nixmac-web/subscribers",
"subscription_url": "https://api.github.com/repos/darkmatter/nixmac-web/subscription",
"commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac-web/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/darkmatter/nixmac-web/contents/{+path}",
"compare_url": "https://api.github.com/repos/darkmatter/nixmac-web/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/darkmatter/nixmac-web/merges",
"archive_url": "https://api.github.com/repos/darkmatter/nixmac-web/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/darkmatter/nixmac-web/downloads",
"issues_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues{/number}",
"pulls_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls{/number}",
"milestones_url": "https://api.github.com/repos/darkmatter/nixmac-web/milestones{/number}",
"notifications_url": "https://api.github.com/repos/darkmatter/nixmac-web/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac-web/labels{/name}",
"releases_url": "https://api.github.com/repos/darkmatter/nixmac-web/releases{/id}",
"deployments_url": "https://api.github.com/repos/darkmatter/nixmac-web/deployments",
"created_at": "2025-11-25T17:53:44Z",
"updated_at": "2026-06-02T22:19:34Z",
"pushed_at": "2026-06-04T21:37:10Z",
"git_url": "git://github.com/darkmatter/nixmac-web.git",
"ssh_url": "git@github.com:darkmatter/nixmac-web.git",
"clone_url": "https://github.com/darkmatter/nixmac-web.git",
"svn_url": "https://github.com/darkmatter/nixmac-web",
"homepage": null,
"size": 72892,
"stargazers_count": 1,
"watchers_count": 1,
"language": "TypeScript",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 3,
"license": null,
"allow_forking": false,
"is_template": false,
"web_commit_signoff_required": false,
"has_pull_requests": true,
"pull_request_creation_policy": "all",
"topics": [],
"visibility": "internal",
"forks": 0,
"open_issues": 3,
"watchers": 1,
"default_branch": "main",
"allow_squash_merge": true,
"allow_merge_commit": true,
"allow_rebase_merge": true,
"allow_auto_merge": false,
"delete_branch_on_merge": false,
"allow_update_branch": false,
"use_squash_pr_title_as_default": false,
"squash_merge_commit_message": "COMMIT_MESSAGES",
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
"merge_commit_message": "PR_TITLE",
"merge_commit_title": "MERGE_MESSAGE"
}
},
"base": {
"label": "darkmatter:main",
"ref": "main",
"sha": "081ab8d87fdfc5e2c63780a77ec7a0b585eb880d",
"user": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"repo": {
"id": 1104067867,
"node_id": "R_kgDOQc69Gw",
"name": "nixmac-web",
"full_name": "darkmatter/nixmac-web",
"private": true,
"owner": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"html_url": "https://github.com/darkmatter/nixmac-web",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/darkmatter/nixmac-web",
"forks_url": "https://api.github.com/repos/darkmatter/nixmac-web/forks",
"keys_url": "https://api.github.com/repos/darkmatter/nixmac-web/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/darkmatter/nixmac-web/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/darkmatter/nixmac-web/teams",
"hooks_url": "https://api.github.com/repos/darkmatter/nixmac-web/hooks",
"issue_events_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/events{/number}",
"events_url": "https://api.github.com/repos/darkmatter/nixmac-web/events",
"assignees_url": "https://api.github.com/repos/darkmatter/nixmac-web/assignees{/user}",
"branches_url": "https://api.github.com/repos/darkmatter/nixmac-web/branches{/branch}",
"tags_url": "https://api.github.com/repos/darkmatter/nixmac-web/tags",
"blobs_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac-web/statuses/{sha}",
"languages_url": "https://api.github.com/repos/darkmatter/nixmac-web/languages",
"stargazers_url": "https://api.github.com/repos/darkmatter/nixmac-web/stargazers",
"contributors_url": "https://api.github.com/repos/darkmatter/nixmac-web/contributors",
"subscribers_url": "https://api.github.com/repos/darkmatter/nixmac-web/subscribers",
"subscription_url": "https://api.github.com/repos/darkmatter/nixmac-web/subscription",
"commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac-web/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/darkmatter/nixmac-web/contents/{+path}",
"compare_url": "https://api.github.com/repos/darkmatter/nixmac-web/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/darkmatter/nixmac-web/merges",
"archive_url": "https://api.github.com/repos/darkmatter/nixmac-web/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/darkmatter/nixmac-web/downloads",
"issues_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues{/number}",
"pulls_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls{/number}",
"milestones_url": "https://api.github.com/repos/darkmatter/nixmac-web/milestones{/number}",
"notifications_url": "https://api.github.com/repos/darkmatter/nixmac-web/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac-web/labels{/name}",
"releases_url": "https://api.github.com/repos/darkmatter/nixmac-web/releases{/id}",
"deployments_url": "https://api.github.com/repos/darkmatter/nixmac-web/deployments",
"created_at": "2025-11-25T17:53:44Z",
"updated_at": "2026-06-02T22:19:34Z",
"pushed_at": "2026-06-04T21:37:10Z",
"git_url": "git://github.com/darkmatter/nixmac-web.git",
"ssh_url": "git@github.com:darkmatter/nixmac-web.git",
"clone_url": "https://github.com/darkmatter/nixmac-web.git",
"svn_url": "https://github.com/darkmatter/nixmac-web",
"homepage": null,
"size": 72892,
"stargazers_count": 1,
"watchers_count": 1,
"language": "TypeScript",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 3,
"license": null,
"allow_forking": false,
"is_template": false,
"web_commit_signoff_required": false,
"has_pull_requests": true,
"pull_request_creation_policy": "all",
"topics": [],
"visibility": "internal",
"forks": 0,
"open_issues": 3,
"watchers": 1,
"default_branch": "main",
"allow_squash_merge": true,
"allow_merge_commit": true,
"allow_rebase_merge": true,
"allow_auto_merge": false,
"delete_branch_on_merge": false,
"allow_update_branch": false,
"use_squash_pr_title_as_default": false,
"squash_merge_commit_message": "COMMIT_MESSAGES",
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
"merge_commit_message": "PR_TITLE",
"merge_commit_title": "MERGE_MESSAGE"
}
},
"_links": {
"self": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266"
},
"html": {
"href": "https://github.com/darkmatter/nixmac-web/pull/266"
},
"issue": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/issues/266"
},
"comments": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/issues/266/comments"
},
"review_comments": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266/comments"
},
"review_comment": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/comments{/number}"
},
"commits": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/pulls/266/commits"
},
"statuses": {
"href": "https://api.github.com/repos/darkmatter/nixmac-web/statuses/913b0c94c72e655237a22f344eb4030e3be13bb5"
}
},
"author_association": "CONTRIBUTOR",
"auto_merge": null,
"assignee": {
"login": "arximboldi",
"id": 4521138,
"node_id": "MDQ6VXNlcjQ1MjExMzg=",
"avatar_url": "https://avatars.githubusercontent.com/u/4521138?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/arximboldi",
"html_url": "https://github.com/arximboldi",
"followers_url": "https://api.github.com/users/arximboldi/followers",
"following_url": "https://api.github.com/users/arximboldi/following{/other_user}",
"gists_url": "https://api.github.com/users/arximboldi/gists{/gist_id}",
"starred_url": "https://api.github.com/users/arximboldi/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/arximboldi/subscriptions",
"organizations_url": "https://api.github.com/users/arximboldi/orgs",
"repos_url": "https://api.github.com/users/arximboldi/repos",
"events_url": "https://api.github.com/users/arximboldi/events{/privacy}",
"received_events_url": "https://api.github.com/users/arximboldi/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"active_lock_reason": null
},
"repository": {
"id": 1104067867,
"node_id": "R_kgDOQc69Gw",
"name": "nixmac-web",
"full_name": "darkmatter/nixmac-web",
"private": true,
"owner": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"html_url": "https://github.com/darkmatter/nixmac-web",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/darkmatter/nixmac-web",
"forks_url": "https://api.github.com/repos/darkmatter/nixmac-web/forks",
"keys_url": "https://api.github.com/repos/darkmatter/nixmac-web/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/darkmatter/nixmac-web/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/darkmatter/nixmac-web/teams",
"hooks_url": "https://api.github.com/repos/darkmatter/nixmac-web/hooks",
"issue_events_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/events{/number}",
"events_url": "https://api.github.com/repos/darkmatter/nixmac-web/events",
"assignees_url": "https://api.github.com/repos/darkmatter/nixmac-web/assignees{/user}",
"branches_url": "https://api.github.com/repos/darkmatter/nixmac-web/branches{/branch}",
"tags_url": "https://api.github.com/repos/darkmatter/nixmac-web/tags",
"blobs_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac-web/statuses/{sha}",
"languages_url": "https://api.github.com/repos/darkmatter/nixmac-web/languages",
"stargazers_url": "https://api.github.com/repos/darkmatter/nixmac-web/stargazers",
"contributors_url": "https://api.github.com/repos/darkmatter/nixmac-web/contributors",
"subscribers_url": "https://api.github.com/repos/darkmatter/nixmac-web/subscribers",
"subscription_url": "https://api.github.com/repos/darkmatter/nixmac-web/subscription",
"commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/darkmatter/nixmac-web/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac-web/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/darkmatter/nixmac-web/contents/{+path}",
"compare_url": "https://api.github.com/repos/darkmatter/nixmac-web/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/darkmatter/nixmac-web/merges",
"archive_url": "https://api.github.com/repos/darkmatter/nixmac-web/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/darkmatter/nixmac-web/downloads",
"issues_url": "https://api.github.com/repos/darkmatter/nixmac-web/issues{/number}",
"pulls_url": "https://api.github.com/repos/darkmatter/nixmac-web/pulls{/number}",
"milestones_url": "https://api.github.com/repos/darkmatter/nixmac-web/milestones{/number}",
"notifications_url": "https://api.github.com/repos/darkmatter/nixmac-web/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac-web/labels{/name}",
"releases_url": "https://api.github.com/repos/darkmatter/nixmac-web/releases{/id}",
"deployments_url": "https://api.github.com/repos/darkmatter/nixmac-web/deployments",
"created_at": "2025-11-25T17:53:44Z",
"updated_at": "2026-06-02T22:19:34Z",
"pushed_at": "2026-06-04T21:37:10Z",
"git_url": "git://github.com/darkmatter/nixmac-web.git",
"ssh_url": "git@github.com:darkmatter/nixmac-web.git",
"clone_url": "https://github.com/darkmatter/nixmac-web.git",
"svn_url": "https://github.com/darkmatter/nixmac-web",
"homepage": null,
"size": 72892,
"stargazers_count": 1,
"watchers_count": 1,
"language": "TypeScript",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 3,
"license": null,
"allow_forking": false,
"is_template": false,
"web_commit_signoff_required": false,
"has_pull_requests": true,
"pull_request_creation_policy": "all",
"topics": [],
"visibility": "internal",
"forks": 0,
"open_issues": 3,
"watchers": 1,
"default_branch": "main",
"custom_properties": {}
},
"organization": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"url": "https://api.github.com/orgs/darkmatter",
"repos_url": "https://api.github.com/orgs/darkmatter/repos",
"events_url": "https://api.github.com/orgs/darkmatter/events",
"hooks_url": "https://api.github.com/orgs/darkmatter/hooks",
"issues_url": "https://api.github.com/orgs/darkmatter/issues",
"members_url": "https://api.github.com/orgs/darkmatter/members{/member}",
"public_members_url": "https://api.github.com/orgs/darkmatter/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"description": ""
},
"enterprise": {
"id": 469843,
"slug": "darkmatter",
"name": "darkmatter",
"node_id": "E_kgDOAAcrUw",
"avatar_url": "https://avatars.githubusercontent.com/b/469843?v=4",
"description": "",
"website_url": "darkmatter.io",
"html_url": "https://github.com/enterprises/darkmatter",
"created_at": "2025-09-07T16:01:00Z",
"updated_at": "2026-05-09T15:34:55Z"
},
"sender": {
"login": "scottmcmaster",
"id": 3137688,
"node_id": "MDQ6VXNlcjMxMzc2ODg=",
"avatar_url": "https://avatars.githubusercontent.com/u/3137688?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/scottmcmaster",
"html_url": "https://github.com/scottmcmaster",
"followers_url": "https://api.github.com/users/scottmcmaster/followers",
"following_url": "https://api.github.com/users/scottmcmaster/following{/other_user}",
"gists_url": "https://api.github.com/users/scottmcmaster/gists{/gist_id}",
"starred_url": "https://api.github.com/users/scottmcmaster/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/scottmcmaster/subscriptions",
"organizations_url": "https://api.github.com/users/scottmcmaster/orgs",
"repos_url": "https://api.github.com/users/scottmcmaster/repos",
"events_url": "https://api.github.com/users/scottmcmaster/events{/privacy}",
"received_events_url": "https://api.github.com/users/scottmcmaster/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"installation": {
"id": 131074261,
"node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTMxMDc0MjYx"
}
}