land #43+#44 + f0rge state

77663d7gl0w

all commits

Message

land #43+#44 + f0rge state

Diff

.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/comments/c5da17f8-8937-46ae-99c5-892a594be9fb.md+6 −0
diff --git a/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/comments/c5da17f8-8937-46ae-99c5-892a594be9fb.md b/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/comments/c5da17f8-8937-46ae-99c5-892a594be9fb.mdnew file mode 100644index 0000000..d11e346--- /dev/null+++ b/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/comments/c5da17f8-8937-46ae-99c5-892a594be9fb.md@@ -0,0 +1,6 @@1+---2+id: c5da17f8-8937-46ae-99c5-892a594be9fb3+author: null4+created: 2026-09-10T08:34:46.200724933Z5+---6+Merged PR 3c5c330e (m6/code-bits, joint #44): CI badge green/red on code head, details gap removed. CI pass. Rubric verified.
.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/issue.md+2 −2
diff --git a/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/issue.md b/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/issue.mdindex b424121..ce3b397 100644--- a/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/issue.md+++ b/.forge/issues/377674c6-d0b5-4f90-9e8f-adb35834dd90/issue.md@@ -1,13 +1,13 @@11 ---22 id: 377674c6-d0b5-4f90-9e8f-adb35834dd9033 title: Code page CI badge green/red4-state: open4+state: closed55 labels:66 - area:render77 assignees: []88 milestone: m6-polish99 created: 2026-09-10T08:26:26.648150484Z10-updated: null10+updated: 2026-09-10T08:34:46.204109671Z1111 ---1212 Context: Owner QA — code page CI state is text-only; want GitHub-style green/red.1313 Tasks:
.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/comments/71e2dce3-16db-4805-8717-1b1814064f33.md+6 −0
diff --git a/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/comments/71e2dce3-16db-4805-8717-1b1814064f33.md b/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/comments/71e2dce3-16db-4805-8717-1b1814064f33.mdnew file mode 100644index 0000000..221e4cd--- /dev/null+++ b/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/comments/71e2dce3-16db-4805-8717-1b1814064f33.md@@ -0,0 +1,6 @@1+---2+id: 71e2dce3-16db-4805-8717-1b1814064f333+author: null4+created: 2026-09-10T08:34:46.209570926Z5+---6+Covered by same PR 3c5c330e. Gap gone. Closed.
.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/issue.md+2 −2
diff --git a/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/issue.md b/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/issue.mdindex 70308c8..0346c79 100644--- a/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/issue.md+++ b/.forge/issues/86ce2532-0b0a-4f1e-bca9-5cce9c414beb/issue.md@@ -1,13 +1,13 @@11 ---22 id: 86ce2532-0b0a-4f1e-bca9-5cce9c414beb33 title: 'Clone details: remove blank line under summary'4-state: open4+state: closed55 labels:66 - area:render77 assignees: []88 milestone: m6-polish99 created: 2026-09-10T08:26:26.651305481Z10-updated: null10+updated: 2026-09-10T08:34:46.212768215Z1111 ---1212 Context: Owner QA — collapsed clone <details> shows a blank line under the summary.1313 Tasks:
.forge/merges/2026-09-10T08-33-29.866371160Z.md+10 −0
diff --git a/.forge/merges/2026-09-10T08-33-29.866371160Z.md b/.forge/merges/2026-09-10T08-33-29.866371160Z.mdnew file mode 100644index 0000000..d3d552d--- /dev/null+++ b/.forge/merges/2026-09-10T08-33-29.866371160Z.md@@ -0,0 +1,10 @@1+---2+pr: 3c5c330e-760e-4db1-bc2c-ef25644b575b3+applied: true4+verdict: pass5+resolved: []6+created: 2026-09-10T08:33:29.866371160Z7+---8+applied: 0f20352a1fab8155e35e67b32602b90c93dd9d3a9+patch: 7ab8de691be38ee3fd0cbfdff291e7d4c70cd0ff10+pass.
.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/patch.diff+136 −0
diff --git a/.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/patch.diff b/.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/patch.diffnew file mode 100644index 0000000..9e4d2b7--- /dev/null+++ b/.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/patch.diff@@ -0,0 +1,136 @@1+From 06ad5753528cc23ed38dd9a328091489f1cf40fc Mon Sep 17 00:00:00 20012+From: gl0w <gl0w@world>3+Date: Thu, 10 Sep 2026 09:33:29 +01004+Subject: [PATCH] m6/code-bits: CI badge colors + details gap fix5+6+---7+ src/build.rs     | 63 +++++++++++++++++++++++++++++++++++++++++++++---8+ static/style.css | 15 +++++++++++-9+ 2 files changed, 74 insertions(+), 4 deletions(-)10+11+diff --git a/src/build.rs b/src/build.rs12+index 5d176ba..ffd8e86 10064413+--- a/src/build.rs14++++ b/src/build.rs15+@@ -669,7 +669,7 @@ pub fn clone_block(16+     };17+     let mut out = format!(18+         "<details class=\"clonebox clone-block\" aria-label=\"Clone and download\">\n\19+-         <summary>Clone &amp; download <span class=\"muted\">{} @ {}</span></summary>\n",20++         <summary>Clone &amp; download <span class=\"muted\">{} @ {}</span></summary>\n<div class=\"clone-body\">\n",21+         esc(branch),22+         esc(short_sha)23+     );24+@@ -696,7 +696,7 @@ pub fn clone_block(25+                 esc(url)26+             ));27+         }28+-        out.push_str("</details>\n");29++        out.push_str("</div>\n</details>\n");30+         return out;31+     }32+     if let Some(url) = clone_url {33+@@ -727,7 +727,7 @@ pub fn clone_block(34+              served from this server: ask the host for its address.</p>\n",35+         );36+     }37+-    out.push_str("</details>\n");38++    out.push_str("</div>\n</details>\n");39+     out40+ }41+ 42+@@ -1996,6 +1996,63 @@ mod tests {43+         assert!(bundle_pos < tar_pos, "bundle before tarball");44+     }45+ 46++    #[test]47++    fn code_head_ci_badge_green_red() {48++        // f0rge #43: code repo-head CI badge is green/red via49++        // `.badge.pass` / `.badge.fail` (running/cancelled keep tones).50++        for verdict in ["pass", "fail"] {51++            let repo = fixture_repo();52++            let run_dir = repo.join(".forge").join("ci/runs/2026-09-10T00-00-00Z");53++            std::fs::create_dir_all(&run_dir).unwrap();54++            std::fs::write(55++                run_dir.join("summary.md"),56++                format!(57++                    "---\nrun: 2026-09-10T00-00-00Z\nverdict: {verdict}\ncreated: 2026-09-10T00:00:00Z\n---\nlog\n"58++                ),59++            )60++            .unwrap();61++            git(&repo, &["add", "-A"]);62++            git(&repo, &["commit", "-m", &format!("ci {verdict}")]);63++            let out = mktemp(&format!("out-ci-{verdict}"));64++            run_build(&repo, &out, &opts()).expect("build");65++            let index = std::fs::read_to_string(out.join("index.html")).expect("index");66++            let head_start = index.find("<div class=\"repo-head\">").expect("repo-head");67++            let head_end = index[head_start..].find("</div>").expect("repo-head end") + head_start;68++            let head = &index[head_start..head_end];69++            assert!(70++                head.contains(&format!("badge {verdict}")),71++                "code head carries badge {verdict}"72++            );73++        }74++    }75++76++    #[test]77++    fn clone_summary_followed_by_body_no_gap() {78++        // f0rge #44: summary immediately followed by content wrapper —79++        // no empty <p>, no margin-collapse gap when collapsed.80++        let (_repo, out) = build_fixture();81++        let index = std::fs::read_to_string(out.join("index.html")).expect("index");82++        assert!(83++            index.contains("</summary>\n<div class=\"clone-body\">"),84++            "summary immediately followed by clone-body wrapper"85++        );86++        let s = index.find("</summary>").expect("summary end");87++        let after = &index[s..s + 200];88++        assert!(89++            !after.contains("<p></p>"),90++            "no empty paragraph after summary"91++        );92++        assert!(93++            !after.contains("<p> </p>"),94++            "no blank paragraph after summary"95++        );96++        // Wrapper closes before the details closes (structure intact).97++        assert!(98++            index.contains("</div>\n</details>"),99++            "clone-body closes inside details"100++        );101++    }102++103+     #[test]104+     fn is_binary_sniffs_first_8kib() {105+         // f0rge #37: NUL in the first 8KiB means binary for math.106+diff --git a/static/style.css b/static/style.css107+index fa1b70d..386ad62 100644108+--- a/static/style.css109++++ b/static/style.css110+@@ -189,9 +189,22 @@ a.ln:hover,a.ln:focus{text-decoration:underline}111+ .lang-legend li{display:inline-flex;align-items:center;gap:.35rem}112+ .lang-dot{display:inline-block;width:.75rem;height:.75rem;flex:none}113+ details.clonebox{margin:1rem 0;padding:.25rem 1rem 1rem;background:var(--bg-alt);border:1px solid var(--border)}114+-details.clonebox>summary{cursor:pointer;min-height:40px;font-weight:700;color:var(--cyan)}115++details.clonebox>summary{cursor:pointer;min-height:40px;font-weight:700;color:var(--cyan);margin:0}116+ details.clonebox>summary:focus-visible{outline:2px solid var(--blue);outline-offset:2px}117++/* Clone gap (m6/code-bits, f0rge #44): no blank line under summary when118++   collapsed — collapsed padding stays tight; open gap lives on the119++   wrapper's first child so margins never collapse through summary. */120++details.clonebox:not([open]){padding-bottom:.25rem}121++.clonebox .clone-body{margin:0}122++.clonebox .clone-body>:first-child{margin-top:.75rem}123+ .clone-hint,.clonebox summary .muted{font-weight:400}124++/* CI verdict badges (m6/code-bits, f0rge #43): GitHub-style green/red on125++   the code repo-head; running/cancelled keep muted tones. */126++.badge{display:inline-block;padding:.1em .5em;border:1px solid var(--border);font-weight:700;font-size:.85rem}127++.badge.pass{color:var(--green);border-color:var(--green)}128++.badge.fail{color:var(--red);border-color:var(--red)}129++.badge.running{color:var(--yellow);border-color:var(--yellow)}130++.badge.cancelled{color:var(--muted);border-color:var(--muted)}131+ /* Stacked cards on narrow (m6/no-scroll, f0rge #39): Gitea-style reflow.132+    Desktop (>=768px) keeps .table-scroll horizontal scroll untouched above.133+    Narrow: no scroll (overflow visible), thead clipped for SR only, each134+-- 135+2.55.0136+
.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/pr.md+12 −0
diff --git a/.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/pr.md b/.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/pr.mdnew file mode 100644index 0000000..4553957--- /dev/null+++ b/.forge/prs/3c5c330e-760e-4db1-bc2c-ef25644b575b/pr.md@@ -0,0 +1,12 @@1+---2+id: 3c5c330e-760e-4db1-bc2c-ef25644b575b3+title: m6/code-bits4+state: merged5+base: master6+head: m6/code-bits7+draft: false8+issues: []9+ci: pass10+created: 2026-09-10T08:33:29.834388089Z11+updated: 2026-09-10T08:34:04.046165597Z12+---