issue-comment.sh reports success for a comment that was never created (no readback) #976
Open
opened 2026-07-31 02:14:32 +00:00 by Mos
·
1 comment
No Branch/Tag Specified
main
next
remediation/state
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#976
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.
tools/git/issue-comment.shreported success for a comment that does not exist at the target issue.Observed
A reviewer seat posted its verdict via the mandated wrapper:
The comment is not there. Measured immediately afterward against the API, twice, with a cache-buster and a wider page limit:
The seat's comment is absent from the target issue and did not appear under its own login.
Why the wrapper cannot detect this
set -emeans a non-zeroteawould abort before line 65 — soteaexited 0. The success message is therefore conditioned on the command not failing, never on the comment existing. There is no readback.This is the null-case defect in the tooling the framework mandates for exactly these operations. The operator receives a positive confirmation and a zero exit for an effect that did not occur — and a review verdict is precisely the kind of artifact whose absence nobody notices until it is needed.
Undetermined
The cause of
teaexiting 0 without creating the comment is not established here. Candidates, none confirmed:get_gitea_loginresolves a login independently ofGITEA_LOGIN, so the effective identity may differ from the caller's intentget_repo_slugmay resolve a different repository than the caller's cwd impliesteamay exit 0 on a rejected writeFiled with the cause open deliberately rather than guessed at — the reportable defect is that the wrapper cannot distinguish any of these from success.
Required
teato exit 0 without creating anything — the wrapper must fail.Note the repo already contains
tools/git/test-issue-comment-readback.sh, which suggests this verification was specified at some point. It is not present in the installed copy on the affected host, so whatever it asserts is not protecting callers there.Impact
Any agent using the mandated wrapper for issue/PR comments may believe a verdict, hand-off, or record was posted when it was not. Discovered because an orchestrator verified an artifact instead of accepting the seat's success report — the seat reported success in good faith, quoting the wrapper verbatim.
✅ ROOT CAUSE FOUND — and it is none of the three candidates in the original filing
tea issue commentdoes not exist. It is a phantom subcommand.Verified independently, twice, from
--helpalone — no credential, no API call, nothing executed against the server:There is no
commentundertea issue.commentis a top-level entity:Why it exits 0 and prints nothing wrong
With no matching subcommand, tea falls through to the parent command's default action — and
tea issuedefaults to list — treating the leftover words as arguments. It lists issues, succeeds, returns 0.No write is ever attempted. There was no rejected write; there was no write.
This retires all three original candidates
Not login resolution, not slug resolution, not "tea exiting 0 on a rejected write." It also explains the one thing those candidates never did: why the failure is 100% reproducible and completely silent rather than intermittent. A broken credential is flaky; a phantom subcommand never works once.
Independent prior capture — this was known two weeks ago
A different agent (
mosaic-ms-lead, 2026-07-17), on a different PR, measured the exact sibling case:tea pr commentdoes not exist either, tea silently falls back totea pr list, exits 0, and nothing is posted. Two parties, two command groups, same shape, neither aware of the other — and that capture has been sitting in shared memory with the fix in it.The fix
Verify with
tea issue --help, which needs no credential.The readback requirement in the original filing still stands and is arguably more important now: the correct call would also have been reported as success unconditionally. The phantom is the bug; the missing readback is why nobody noticed for two weeks.
Method note worth keeping
Reading the caller could never have found this. The shape analysis (unconditioned call, unconditional echo) was correct and insufficient — that the call was never made is not a fact contained in the source; it is a fact about the binary the source invokes.