{"messages":[{"content":"You are a constitutional council ranking individual git commits for ownership allocation.\n\nCompare these two commits. Decide which contributed more lasting value to the project.\n\nJudge substance, not spectacle:\n- Prefer correct, lasting design and real bugfixes over churn, formatting, renames, or generated noise.\n- Prefer clarity and necessity over sheer line count. A small precise change can beat a large diffuse one.\n- Do not favor a side merely because its patch is longer or noisier.\n- Weight what the change does for the project, not the contributor's name.\n\nReturn ONLY a JSON object: {\"winner\": \"A\" or \"B\", \"ratio\": \"N:M\", \"explanation\": \"...\"}\nThe explanation must cite concrete differences in the patches (1-3 sentences).\n\nSide A — contributor: tommy-mor\nSide A — commit message:\n[af27c3ab] oicd first pass for npm\n\nSide A — unified diff (full patch):\ndiff --git a/.github/workflows/release.yml b/.github/workflows/release.yml\nindex faed75894dace9edcde19eb10753234a1c1261e9..6f3e27e491b56aaaa1ef64c547cc68921e010b3f 100644\n--- a/.github/workflows/release.yml\n+++ b/.github/workflows/release.yml\n@@ -88,9 +88,12 @@ jobs:\n \n - uses: actions/setup-node@v4\n with:\n- node-version: 20\n+ node-version: 22\n registry-url: \"https://registry.npmjs.org\"\n \n+ - name: Upgrade npm for OIDC trusted publishing support\n+ run: npm install -g npm@latest\n+\n - name: Copy binaries into npm platform packages\n shell: bash\n run: |\n@@ -125,8 +128,6 @@ jobs:\n \n - name: Publish npm platform packages\n shell: bash\n- env:\n- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n run: |\n set -euxo pipefail\n for pkg in packages/npm/platforms/*; do\n@@ -135,15 +136,10 @@ jobs:\n \n - name: Publish npm root package\n shell: bash\n- env:\n- # Unscoped packages need a token that is allowed to create/publish unscoped names.\n- # GitHub's setup-node expects NODE_AUTH_TOKEN. See:\n- # https://docs.github.com/en/actions/tutorials/publish-packages/publish-nodejs-packages\n- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN_UNSCOPED }}\n run: |\n set -euxo pipefail\n cd packages/npm\n- npm publish --access public --provenance\n+ npm publish --access public\n \n publish-pypi:\n name: publish PyPI\n\n\nSide B — contributor: tommy-mor\nSide B — commit message:\n[af6c4464] moved delete button\n\nSide B — unified diff (full patch):\ndiff --git a/server/src/html/forum/ingest.rs b/server/src/html/forum/ingest.rs\nindex 168106e495cf1a81f62f6a49e35c64beea287924..308358abc6cd6811079d9ec41b114093c0294d02 100644\n--- a/server/src/html/forum/ingest.rs\n+++ b/server/src/html/forum/ingest.rs\n@@ -45,6 +45,7 @@ fn post_header_meta(\n principal: &str,\n ts: i64,\n now: i64,\n+ delete_post_id: Option<&str>,\n ) -> Markup {\n let post_href = nav.post_url(tag, post_idx);\n let profile = profile_href(principal);\n@@ -52,11 +53,19 @@ fn post_header_meta(\n let ago = timeago::timeago(now, ts);\n html! {\n div class=\"ingest-meta muted\" title=(hover) {\n- a href=(post_href) class=\"post-num\" { \"#\" (post_idx) }\n- \" \"\n- a href=(profile) class=\"post-author\" { \"@\" (principal) }\n- \" · \"\n- (ago)\n+ span class=\"ingest-meta-primary\" {\n+ a href=(post_href) class=\"post-num\" { \"#\" (post_idx) }\n+ \" \"\n+ a href=(profile) class=\"post-author\" { \"@\" (principal) }\n+ \" · \"\n+ (ago)\n+ }\n+ @if let Some(pid) = delete_post_id {\n+ form class=\"post-delete-form\" method=\"POST\" action=\"/ui\" {\n+ input type=\"hidden\" name=(UI_RPC_FIELD) value=(template_json_compact(&HtmlUiAction::RedactPost { post_id: pid.to_string() }).unwrap());\n+ button type=\"submit\" class=\"post-delete-btn\" { \"delete\" }\n+ }\n+ }\n }\n }\n }\n@@ -70,18 +79,12 @@ pub(super) fn post_header_row(\n now: i64,\n show_delete: bool,\n ) -> Markup {\n- let meta = post_header_meta(nav, tag, post_idx, &ing.principal, ing.ts, now);\n- html! {\n- div class=\"ingest-header-row\" {\n- (meta)\n- @if show_delete {\n- form class=\"post-delete-form\" method=\"POST\" action=\"/ui\" {\n- input type=\"hidden\" name=(UI_RPC_FIELD) value=(template_json_compact(&HtmlUiAction::RedactPost { post_id: ing.id.clone() }).unwrap());\n- button type=\"submit\" class=\"post-delete-btn\" { \"delete\" }\n- }\n- }\n- }\n- }\n+ let delete_post_id = if show_delete {\n+ Some(ing.id.as_str())\n+ } else {\n+ None\n+ };\n+ post_header_meta(nav, tag, post_idx, &ing.principal, ing.ts, now, delete_post_id)\n }\n \n pub(super) fn redacted_header_row(\n@@ -92,7 +95,7 @@ pub(super) fn redacted_header_row(\n now: i64,\n expanded: bool,\n ) -> Markup {\n- let meta = post_header_meta(nav, tag, post_idx, &ing.principal, ing.ts, now);\n+ let meta = post_header_meta(nav, tag, post_idx, &ing.principal, ing.ts, now, None);\n let rpc_expand = template_json_compact(&json!({\n \"action\": \"expand_redacted_post\",\n \"room\": nav.room_wire,\ndiff --git a/server/static/theme_default.css b/server/static/theme_default.css\nindex 560881c1eec62f12d1e66875287be3c2f39198fc..83b49d079e6bf3e47c27fbd443a0ae75b1a03051 100644\n--- a/server/static/theme_default.css\n+++ b/server/static/theme_default.css\n@@ -552,12 +552,21 @@ pre a.pre-link {\n }\n \n div.ingest-meta {\n+ align-items: center;\n background: var(--g3);\n border-bottom: 2px solid var(--lo);\n color: var(--meta);\n+ display: flex;\n+ flex-wrap: wrap;\n font-size: 12px;\n+ gap: 6px 10px;\n+ justify-content: space-between;\n padding: 3px 10px;\n }\n+span.ingest-meta-primary {\n+ flex: 1 1 auto;\n+ min-width: 0;\n+}\n a.post-num { color: var(--meta); font-size: 12px; }\n a.post-num:hover { color: var(--signal); }\n a.post-author { color: var(--meta); font-size: 12px; text-decoration: none; }\n@@ -579,7 +588,12 @@ div.ingest-header-row div.ingest-meta {\n flex: 1 1 auto;\n padding: 0;\n }\n-form.post-delete-form { display: inline; margin: 0; }\n+form.post-delete-form {\n+ display: block;\n+ flex-shrink: 0;\n+ margin: 0;\n+ margin-left: auto;\n+}\n button.post-delete-btn {\n background: var(--g4);\n border: var(--bv) solid;\ndiff --git a/server/static/theme_retro_craft.css b/server/static/theme_retro_craft.css\nindex eb022a8c84c1d0cff36410541872d68a11195e31..7181c7f8547940a402ae0211220fd6ee93ee1364 100644\n--- a/server/static/theme_retro_craft.css\n+++ b/server/static/theme_retro_craft.css\n@@ -132,8 +132,22 @@ p.post-truncation-action {\n margin: 0;\n }\n div.ingest-meta {\n+ align-items: center;\n border-bottom: 1px solid var(--line);\n- padding: 0.35rem 0.65rem;\n+ display: flex;\n+ flex-wrap: wrap;\n+ justify-content: space-between;\n+ padding-left: 0.35rem;\n+}\n+span.ingest-meta-primary {\n+ flex: 1 1 auto;\n+ min-width: 0;\n+}\n+form.post-delete-form {\n+ display: block;\n+ flex-shrink: 0;\n+ margin: 0;\n+ margin-left: auto;\n }\n a.post-num {\n color: var(--ink-dim);\n","role":"user"}],"model":"~x-ai/grok-latest"}