pr-merge.sh:417 blocks the squash-trailer remedy on exactly the PRs carrying the owner's own commits (unlinked commit address on account id=2) #1108
Open
opened 2026-08-07 16:58:17 +00:00 by Mos
·
1 comment
No Branch/Tag Specified
main
next
fix/1138-conditional-federation
feat/webui-p2-data-auth
fix/gateway-runner-image
feat/webui-p1-vite-skeleton
fix/break-c-hooks-and-web-image
docs/webui-fleet-claude-bridge-plan
fix/wizard-gateway-failure
fix/ci-queue-wait-no-status
fix/next-node-gate
fix/mosaic-init-rce
feat/lease-promotion-and-harness-isolation
greenfield/fomo-lin
fix/1099-pipefail-wake
fix/1099-pipefail-tests
fix/1099-pipefail-sweep
fix/framework-shell-portability
fix/1043-pane-git-identity
fix/1081-issue-close-silent-comment-failure
fix/1090-enrollment-wallclock-tolerance
feat/1082-tea-stale-token-diagnostic
fix/detect-platform-silent-128-outside-repo
feat/1050-install-state-machine-red-fixture
fix/pr-merge-message-field
feat/1051-mosaic-brain-installer
feat/1045-mosaic-cred
remediation/state
fix/1056-upgrade-rollback-control-race
fix/1019-ci-queue-timeout-harness
feat/rm-02-gate-registry
fix/rm-01-reproducible-checkout
remediation/mission-setup
fix/hygiene-inert-format-gate
fix/1019-queue-guard-stdin
feat/mos-ste-writing-standard
fix/1007-suite-hermeticity
fix/991-comment-url-scheme-normalise
feat/push-guard-null-case-verification
mos-comms-live
docs/heartbeat-framework-layering-ms-lead
feat/869-c4-version-coupling
feat/869-c2-install-ordering-guard
feat/869-c5-doctor-activation-check
feat/per-agent-gitea-identity
fix/875-belongs-case-insensitive-slug
fix/ci-queue-wait-404-branch-absent
feat/869-c1-activation-probe
feat/869-c3-broker-supervisor
fix/865-tea-cli-comment-invocation
feat/glpi-skills
fix/860-deflake-mutator-lease-gate
fix/850-detect-platform-port-normalization
fix/856-worktree-deps-preflight
fix/835-pr-review-approve-reject-comment-flag
fix/848-truthful-evidence
fix/812-pr-review-comment
fix/849-recovery-runtime-fixture-race
docs/758-ledger-m5-001-sync
feat/834-tc-server-side-doc
feat/833-constrained-recovery-command
feat/827-gate0-probe
governance/gate0-probe3-amendment
fix/795-codex-pr-diff
fix/795-ci-base-jq
fix/795-ci-base-git
feat/791-pr3-fleet-regen
feat/791-pr2-snapshot-restore
fix/807-glpi-206
fix/808-agent-send-false-sender
feat/791-upgrade-config-protection
feat/790-mosaic-yolo-claudex-pr2
feat/790-mosaic-yolo-claudex
feat/758-v1-v2-migrator
fix/766-exact-fleet-comms
test/758-reconciler-lifecycle-gates
docs/771-kbn101-db-role-split
test/758-example-profile-dispositions
feat/758-shared-role-resolution
feat/mos-logical-identity-fencing
feat/769-kbn100-unified-schema
docs/753-kbn010-threat-gate
feat/758-roster-v2-compiler
feat/756-official-discord-plugin
docs/758-fleet-config-management
fix/mos-option2-qualification-format
docs/issue-758-m0
docs/mos-option2-qualification
mos-comms
feat/tess-interaction-agent
fix/tess-docs-format
draft/mosaic-platform-prd
fix/installer-provider-gate-and-local-gateway-redis
release/mosaic-cli-0.0.37
feat/framework-constitution-alpha
fix/git-wrapper-repo-detection
fix/woodpecker-wrapper-legacy-mosaic
fix/t-a292e96f-gitea-pr-metadata
fix/gitea-pr-metadata-login-t-a292e96f
fix/t_a292e96f-pr-metadata-gitea
fix/t_3a368a52-gitea-usc-login
fix/bootstrap-hotfix
fix/populate-known-packages-list
fix/idempotent-init
v0.0.39-alpha
mosaic-v0.0.31
fed-v0.2.0-m2
fed-v0.1.0-m1
mosaic-v0.0.29
mosaic-v0.0.28
mosaic-v0.0.27
mosaic-v0.0.26
mosaic-v0.0.25
mosaic-v0.0.24
v0.2.0
v0.1.0
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1108
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
pr-merge.sh:417refuses to merge a PR when any commit hasauthor.login == NULL. Ongit.mosaicstack.devthat condition currently fires on four open PRs — #965, #1022, #1023, #1024 —and every one of the six NULL-resolving commits is authored
Jason Woltje.The cause is not a missing account. Account
jason.woltje(id=2) exists; it is registered with anoreply-form address on themosaicstack.devdomain, while his commits here are authored with a singleexternal-domain address on
uscllc.com. Gitea cannot resolve the commit address to the account, soauthor.logincomes back NULL. (One distinct address across all four PRs. No address value is recordedin this issue — shape and a truncated digest only:
sha256[:10]=ccb5a21b.)Why it matters
pr-merge.shonmaincarries full--co-author-trailersmachinery (:73-74flag,:442emitsCo-authored-by:). A squash that emits trailers preserves every constituent author and satisfiesConstitution gate 15 (squash-only). That is the only attribution remedy that does not require splitting a
PR by author and re-running review + CI.
:417blocks that remedy for exactly the commits it would most protect. Measured contrast: ongit.uscllc.comall four held PRs (#3130, #3121, #3123, #3127) have zero NULLs — every author is afleet seat with a registered address — so route D is viable there and blocked here.
Asks (in cost order)
jason.woltje(id=2) ongit.mosaicstack.dev. One accountsetting. Account-settings work on the owner's own account — no agent seat can or should do it.
⚠ Bound, unverified: Gitea resolves on a verified linked email. Nobody has verified that this
address can be verified on this instance, so linking is the diagnosed cause of the NULL, not a proven
fix. Confirm by re-reading
author.loginon #965 afterwards.:442/:417: should a squash record the commit's AUTHOR, or only a LINKEDACCOUNT? A
Co-authored-by:trailer is a plain string and has never required a registered address.As written, an unlinked address makes the wrapper drop the author entirely rather than drop the
clickable link.
:359-361says so in its own words: "This gate checks ATTRIBUTION LINKAGE, notAUTHORSHIP."
Also relevant
main(23,435 B). The deployed wrapper is 7,901 B with zerotrailer code and zero production callers pass the flag ⇒ delivery is gated on #1072.
commit_id).Measured by
tl-mosaic(read-only homelab seat, 403 onread:issue); filed bymos-claudeat its request.Ask 2 has a concrete answer in the code — the trailer is already half-raw
Measured by
tl-mosaicagainstorigin/main:pr-merge.sh, recorded here so it survives the fleet session::412commit_author = commit.get("author")— the raw git author: name AND email:413email = commit_author.get("email")— raw email, and it is used:415login = provider_author.get("login")— the resolved account:417-425if not login:⇒ block, exit 75.:418putsemailin the diagnostic, so the function demonstrably has the address in hand at the moment it refuses:442trailers.append(f"Co-authored-by: {login} <{email}>")So the emitted trailer is already a mix of resolved login + raw email. And
commit_author.get("name")— the actual author name — is fetched at:412and never read anywhere inthe function.
⇒ Preserving the author is therefore not a new capability; it is stopping the function from discarding a
field it already fetched. The shape of the change:
:442→f"Co-authored-by: {commit_author.get('name')} <{email}>":439→ dedup currently keys onlogin; would key on email or name:417→ degrade to the raw name instead of blocking:429→ the[A-Za-z0-9_.-]+character guard is the only part that genuinely depends on a login; a namefield needs a different validator, not that one.
This resolves
:359-361's own note — "This gate checks ATTRIBUTION LINKAGE, not AUTHORSHIP" — in thedirection its author warned about: as written, an unlinked address loses the author entirely rather
than losing the link.
Scope, and the cost, stated plainly
Linking the address (ask 1) fixes six commits. Fixing
:442/:417fixes the whole class, includingauthors that have no provider account and never will —
Hermes Agent,mosaic-coder,ms-lead-reviewer.⚠ The real cost, not hidden: raw-name trailers are unverified self-asserted strings — which is exactly
what
:359says git author metadata is. Preserving them records claimed authorship. That is a deliberatetrade and it is the repo owner's to make.
⛔ No patch is proposed here. This is framework code with its own review path, and
--co-author-trailershas never been exercised in production by anything.
Cross-estate contrast (measured by
orchestrator,git.uscllc.com):417NULLs on the four held USC PRs: #3130 8 commits → 0 · #3121 3 → 0 · #3123 4 → 0 ·#3127 4 → 0. Every author there is a fleet seat with a registered address. So the remedy works where
the injured party is an agent and fails where it is the human — not a design choice anybody made, just
whose email happened to be linked.