---
from: usc
to: all
utc: 20260721T213558Z
---

[web1:mosaic-100 (MS-LEAD) -> web1:homelab] NEW CODER LANE REQUEST (non-KBN, independent of the frozen KBN base — safe to run in parallel while KBN stays parked). Dispatch ONE fresh independent terra-tier coder (gpt-5.6-terra) as a genuinely fresh agent (zero prior context = accepted dispatch-fresh equivalent). Builder cap respected: this is the only active builder. Task: drive framework-tooling issue 865 to a reviewable PR. Coder implements, lints, pushes a branch, opens the PR, then EXITS — it does NOT merge and does NOT review its own work (author does not equal reviewer; a separate reviewer lane and Mos named-executor clearance follow later).

===== BEGIN VERBATIM CODER BRIEF (issue 865) =====

REPO: mosaicstack/stack at git.mosaicstack.dev. Fresh-clone into your own lane dir under /home/hermes/<lane> (do NOT touch any existing checkout). Branch from origin/main (current main tip is 4e5af232-class; take whatever main is at clone time). Branch name: fix/865-tea-cli-comment-invocation.

BACKGROUND: tea CLI 0.11.1 has NO comment subcommand under tea pr or tea issue. The shared framework wrapper scripts call those non-existent subcommand forms; tea silently no-ops and exits 0 — a false-success write (a lane believes it posted a review or comment when nothing was posted). The correct invocation is the TOP-LEVEL form: tea comment <index> <body>. Also, tea pr approve and tea pr reject take the comment/reason as a TRAILING POSITIONAL argument, not as a --comment flag.

FILES TO FIX (both under packages/mosaic/framework/tools/git/):

1. pr-review.sh — three code paths:
   a. approve path: invoke tea pr approve with the comment supplied as a trailing positional arg (append it after the repo args and PR number), NOT via a --comment flag.
   b. reject/request-changes path: invoke tea pr reject with the reason supplied as a trailing positional arg, same positional pattern.
   c. comment path: post via the top-level form tea comment <index> <body>, NOT tea pr comment.
   In all three paths, keep the existing repo-arg detection via get_gitea_repo_args() and place any per-invocation identity override AFTER the get_gitea_repo_args() output, because tea last-wins on repeated --login flags (an override placed before the detected default is silently clobbered back to the default identity).

2. issue-comment.sh — line 64 currently calls the broken form tea issue comment INDEX BODY (with repo and login flags). Replace it with the top-level positional form tea comment INDEX BODY, preserving the repo-arg detection and identity override in the SAME after-detection ordering as pr-review.sh.

3. OPTIONAL-BUT-PREFERRED post-write read-back verification (add to BOTH scripts): after the write call, do a lightweight Gitea REST GET (via curl and the already-available token) to confirm the review/comment actually landed, and make the script exit non-zero with a clear message if the read-back does not find it. Rationale: exit 0 from tea must never be trusted alone as proof of a successful write. If wiring full read-back cleanly into both scripts is out of proportion for this fix, implement it for at least the comment paths and leave a clearly-marked TODO for the approve/reject paths — but state in the PR body exactly what you did and did not cover.

4. --login PASSTHROUGH (formalize the mechanism, operator-agnostic): expose an optional --login <name> flag on BOTH wrappers that appends --login <name> to the tea invocation AFTER get_gitea_repo_args(), so a caller can select a specific Gitea identity (the reason author-does-not-equal-reviewer needs distinct identities). Document the flag and the after-detection last-wins ordering rationale in the script header comment and in whatever docs/ reference covers these wrappers. Recommend, in that doc, a durable successor: give each reviewer slot its own Gitea login so author-does-not-equal-reviewer holds at the credential level. Frame this as a recommendation, not an implementation in this PR.

HARD FIREWALL (operator-agnostic ONLY): the PR must contain ZERO specific account names, tokens, logins, or ids (no jason.woltje, no bot-account names, no numeric account ids). Only the invocation fix and the --login flag MECHANISM belong in framework source. Specific identities are operator credential config and stay OUT of the PR entirely. If you feel the urge to reference a concrete login to explain the flag, use a placeholder like <reviewer-login> instead.

CONSTRAINTS: no --no-verify. Do not weaken or delete any existing check. Match the surrounding shell style (same quoting, same error-handling idiom, same variable naming). Keep the PowerShell (.ps1) siblings consistent if they share the same bug; if they use a different CLI path that is not affected, say so in the PR body rather than editing them blindly.

PR: open against main, title fix(tools): use top-level tea comment invocation and formalize --login passthrough (865), body MUST include the line Closes #865 and a short summary of each file changed plus exactly what read-back coverage you implemented. Run the repo lint/format gates before pushing. After the PR is open, EXIT. Do NOT merge, do NOT self-approve.

===== END VERBATIM CODER BRIEF (issue 865) =====

On PR open: relay the PR number, the head SHA, and the list of files changed back to me. I will then arrange an independent reviewer lane (author does not equal reviewer) and, on a clean review plus green CI, relay to Mos for a named-executor merge decision. KBN reclaims top priority the instant the coordinator (A)/(B) ruling lands — if that happens mid-flight, this lane finishes its current PR and then yields. Thanks.
