issue-close.sh: closing comment silently fails — tea issue comment is not a subcommand, and the result is unchecked
#1081
Closed
opened 2026-08-06 20:33:02 +00:00 by Ghost
·
1 comment
No Branch/Tag Specified
next
refactor
fix/1257-adopt-draft-transition
docs/prd-rev1-ratification
r4-helper-port
docs/containerization-plan
feat/m4-4b-enrollment-command
feat/m4-4a-enrollment-schema
feat/m4-4-0-enrollment-design
feat/m4-3a-p1-stop-mission-task-status-writes
docs/m4-3a0-p0-map-currency
docs/c2-amendment1-company-crud
config/minimal-subset
feat/m4-1b-ii-hierarchy-commands
mosaic-cli-p1-wrappers
mosaic-cli-p1-dispatch
docs/ruling-4b-company-visibility
feat/m4-1b-hierarchy-gateway
feat/m4-1a-hierarchy-schema
feat/p6-e2e-ci-gate
feat/p5-spa-cutover
fix/1451-appservice-dockerfile-scripts
contract/onboarding-wizard
contract/custody-schema
contract/api-artifacts
fix/appservice-dockerfile-scripts
docs/t78-cli-capability-migration
contract/rollup-projection
contract/hierarchy-schema
fix/invariant-r-version-probe-retry
contract/mode-conversion
contract/tool-gateway-mapping
contract/rbac-grants
contract/identity-lifecycle
chore/s1-docs-hygiene
docs/ri-050-release-evidence
feat/webui-p4-2-settings-admin
fix/bootstrap-race
fix/teams-enumeration-scope
fix/1407-next-image-parity
docs/prd-north-star-rewrite
rescue/ms-gate-001-gatekeeper
fix/1394-recover-token-headless
fix/1390-uninstall-headless
fix/1403-n1n2-followup
fix/1391-validationpipe-boot-check
archive/salvage-20260825/wp5b-consumer-compat
wp5b-consumer-compat-2
archive/salvage-20260825/t63-fix-2648
archive/salvage-20260825/t63-fix-1389
archive/salvage-20260825/i1380ff-fix
i1380-guard
fix/send-message-exact-target-pin
t51p2wp0b
archive/ms24-fork
fix/ci-queue-wait-no-ci-merge-path
fix/credentials-gitea-seat-slots
feat/onboarding-scripts-framework
pr-1367
fix/1357-issue-view-comments
fix/1356-tea-login-fail-closed
fix/1362-harness-aware-delivery-confirm
fix/gitea-guessed-login-credential
docs/w4-document-contract
fix/d29-lease-revoke-noop
peggy/agent-send-unverified-label
fix/pr-merge-fork-ci-status
riv001-clean
docs/1216-trunk-parameterization
fix/1256-fleet-pane-path-node
fix/1017-enumeration-guard-population
fix/1182-fail-closed-launch
fix/1327-setuppath-idempotency
merge/main-into-next
ci/push-ci-comment-model
ci/pin-ci-base-image
fix/ci-queue-wait-no-status
fred/code-review-pinned-tool-rules
fred/guides-seat-identity-fleet-comms
fred/credential-fail-closed-seat-slots
fix/fleet-greenfield-blockers
feat/ri-050-qr-evaluator
archive/salvage-20260825/zane/doctor-greenfield-hint
archive/salvage-20260825/fix/ri-050-registry-secrets
archive/salvage-20260825/docs/ri-050-release-evidence
docs/ri-050-forge-docs-fastfollow
fix/ri-050-registry-secrets
test/ri-050-publish-gate-negative
archive/salvage-20260825/fix/ri-050-verify-pglite-path
fix/ri-050-verify-pglite-path
docs/ri-050-qr-probe-inventory
archive/salvage-20260825/zane/doctor-brain-home
feat/ri-050-web-stale-safety
archive/salvage-20260825/pr-1298
archive/salvage-20260825/zane/mosaic-home-support
docs/ri-050-mission-bootstrap
fix/ri-050-forge-fail-closed
feat/ri-050-publish-gate
fleet/continuation-record-2026-08-17
feat/ri-050-prd-authority
fix/ri-050-macp-fail-closed
fix/1280-identity-first-resolution
feat/w-f4-store
fix/1264-fleet-unattended-first-start
fix/1269-ci-chain-unblock
fix/1256-fleet-runtime-preflight
fix/1257-e7-draft-transition
fix/1240-fleet-transport-check
fix/1017-wire-start-agent-session
e2e-compose
fix/1241-launch-failure-visible
fix/1237-fleet-v2-dispatch
fix/1236-installer-dir-modes
fix/installer-path-and-node
feat/wf-fleet-mvp
fix/installer-provisions-node
fix/lease-test-env-isolation
release/0.0.50-integration
feat/wf5-main-merge
feat/wf5-securestorage
feat/1216-trunk-resolver
docs/1214-branch-process
docs/ia-merge-current
fix/869-lease-probe-timeout
main
feat/workspace-hygiene-tool-enforcement
feat/1080-pr-edit
fix/1179-required-security-di
feat/p3-slice0-task5-chat-runtime-router-shaggy
feat/p3-slice0-task5-chat-runtime-router
feat/wf1-composition
feat/p3-slice0-task4-web-catalog-selection
feat/lease-promotion-and-harness-isolation
ci/provision-pi-runtime
feat/p3-slice0-task3-catalog-selection
feat/p3-slice0-task2-harness-registry
adopt/965-mos-ste-writing-standard
fix/991-comment-url-scheme-normalise
feat/wf2-bundle-migration
feat/wf4-plugin-acquisition
feat/wf5-refresh-safety
fix/1145-coord-di-compiled-boot
feat/p3-slice0-task1-harness-contracts
docs/webui-phase-p-structure
feat/1150-pi-goal-extension
feat/webui-p3-chat
fix/1146-ci-queue-purpose
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/next-node-gate
fix/mosaic-init-rce
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/1017-enumeration-guard
fix/1007-suite-hermeticity
feat/push-guard-null-case-verification
feat/wake-preimage-provenance
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
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
archive/salvage-20260825/fix/ci-prisma-generate
archive/salvage-20260825/feat/ms-gate-001-gatekeeper-local
archive/salvage-20260825/feat/ms-gate-001-gatekeeper
archive/salvage-20260825/feat/ms24-ci-webhook
archive/salvage-20260825/fix/mission-control-proxy-routes
archive/salvage-20260825/fix/deploy-missing-env-and-networks
archive/salvage-20260825/fix/mission-control-query-provider
archive/salvage-20260825/test/ms23-p2
archive/salvage-20260825/feat/ms23-p2-audit
archive/salvage-20260825/feat/ms23-p2-roster
archive/salvage-20260825/feat/ms23-p1-proxy
archive/salvage-20260825/feat/ms23-p1-registry
archive/salvage-20260825/feat/ms23-p1-internal-provider
archive/salvage-20260825/feat/ms23-p1-interface
archive/salvage-20260825/chore/ms23-tasks-p0-complete
archive/salvage-20260825/test/ms23-p0
archive/salvage-20260825/chore/ms23-tasks-p005-006
archive/salvage-20260825/feat/ms23-p0-tree
archive/salvage-20260825/chore/ms23-tasks-p004-005
archive/salvage-20260825/feat/ms23-p0-controls
archive/salvage-20260825/chore/ms23-tasks-p0-002-004
archive/salvage-20260825/feat/ms23-p0-stream
archive/salvage-20260825/fix/ms23-prisma-rm-symlink
archive/salvage-20260825/fix/ms23-prisma-kaniko-symlink
archive/salvage-20260825/fix/ms23-prisma-script-path
archive/salvage-20260825/fix/ms23-prisma-docker-vs-ci
archive/salvage-20260825/fix/ms23-prisma-schema-local
archive/salvage-20260825/fix/ms23-prisma-api-pkg
archive/salvage-20260825/fix/ms23-prisma-cli
archive/salvage-20260825/fix/ms23-orchestrator-prisma-generate
archive/salvage-20260825/feat/ms23-p0-ingestion
archive/salvage-20260825/feat/ms23-p0-schema
archive/salvage-20260825/fix/agent-template-auth-module
archive/salvage-20260825/feat/ms22-p2-discord-router
archive/salvage-20260825/test/ms22-p2-agent-tests
archive/salvage-20260825/chore/ms22-p2-docs-update
archive/salvage-20260825/feat/ms22-p2-agent-routing
archive/salvage-20260825/chore/ms22-p2-update-docs
archive/salvage-20260825/feat/ms22-p2-user-agents
archive/salvage-20260825/feat/ms22-p2-agent-crud
archive/salvage-20260825/fix/security-audit-multer
archive/salvage-20260825/ci/portainer-deploy
archive/salvage-20260825/fix/ms21-missing-user-auth-migration
archive/salvage-20260825/infra/fix-mosaic-db-init-extensions
archive/salvage-20260825/infra/migrate-to-openbrain-db
archive/salvage-20260825/fix/flaky-queue-test
archive/salvage-20260825/fix/deploy-service-names
archive/salvage-20260825/fix/deploy-service-update
archive/salvage-20260825/fix/deploy-user-v2
archive/salvage-20260825/fix/deploy-user
archive/salvage-20260825/fix/orchestrator-widget-endpoints
archive/salvage-20260825/fix/dashboard-widget-mock-data
archive/salvage-20260825/fix/ci-glibc-image
archive/salvage-20260825/fix/dockerfile-npmrc
archive/salvage-20260825/fix/matrix-native-binary
archive/salvage-20260825/fix/kaniko-cache
archive/salvage-20260825/fix/base-image-kaniko-v2
archive/salvage-20260825/fix/base-image-kaniko
archive/salvage-20260825/feat/custom-base-image
archive/salvage-20260825/ci/pnpm-cache
archive/salvage-20260825/fix/interceptor-tests
archive/salvage-20260825/fix/kanban-tests
archive/salvage-20260825/feat/wire-chat
archive/salvage-20260825/feat/usage-widget
archive/salvage-20260825/feat/usage-widget-review
archive/salvage-20260825/fix/security-hardening
archive/salvage-20260825/fix/project-domain-attach
archive/salvage-20260825/fix/project-domain-v2
archive/salvage-20260825/feat/kanban-add-task
archive/salvage-20260825/fix/logs-page-clean
archive/salvage-20260825/fix/logs-page
archive/salvage-20260825/fix/workspace-members
archive/salvage-20260825/fix/ci-lint-632
archive/salvage-20260825/fix/lint-from-632
archive/salvage-20260825/fix/file-manager-tags
archive/salvage-20260825/fix/csrf-debug-log
archive/salvage-20260825/fix/controller-type-imports
archive/salvage-20260825/fix/system-admin-env
archive/salvage-20260825/fix/gateway-cors-trusted-origins
archive/salvage-20260825/fix/fleet-provider-form-dto-v2
archive/salvage-20260825/fix/ms22-audit
archive/salvage-20260825/fix/orchestrator-widgets
archive/salvage-20260825/fix/fleet-provider-form-dto
archive/salvage-20260825/fix/orchestrator-widgets-preexisting
archive/salvage-20260825/fix/csrf-bearer-bypass
archive/salvage-20260825/fix/ms22-missing-authmodule-imports
archive/salvage-20260825/fix/container-lifecycle-config-module
archive/salvage-20260825/fix/swarm-compose-ms22-vars
archive/salvage-20260825/chore/ms22-p1-complete
archive/salvage-20260825/feat/ms22-p1k-idle-reaper
archive/salvage-20260825/feat/ms22-p1j-docker
archive/salvage-20260825/feat/ms22-p1e-onboarding-api-work
archive/salvage-20260825/feat/ms22-p1c-config-api
archive/salvage-20260825/chore/ms22-prd-tracking
archive/salvage-20260825/feat/ms22-p1b-crypto
archive/salvage-20260825/docs/ms22-architecture
archive/salvage-20260825/feat/ms22-openclaw-docker
archive/salvage-20260825/feat/ms22-openclaw-gateway-module
archive/salvage-20260825/chore/ms21-complete
archive/salvage-20260825/chore/ms21-final-tasks-done
archive/salvage-20260825/fix/ms21-ui-001-qa
archive/salvage-20260825/feat/ms22-openclaw-docker-backup-20260301
archive/salvage-20260825/chore/ms22-phase0-complete
archive/salvage-20260825/feat/ms21-ui-teams-rbac-v3
archive/salvage-20260825/test/ms22-integration
archive/salvage-20260825/feat/ms22-ingest-clean
archive/salvage-20260825/feat/ms21-ui-users-members
archive/salvage-20260825/feat/ms22-ingest
archive/salvage-20260825/feat/ms22-task-agent
archive/salvage-20260825/chore/ms22-tasks-tracking
archive/salvage-20260825/feat/ms21-ui-teams-rbac
archive/salvage-20260825/fix/openbao-otel-cve
archive/salvage-20260825/ci/unified-pipeline
archive/salvage-20260825/feat/ms22-conversation-archive
archive/salvage-20260825/feat/ms22-agent-memory
archive/salvage-20260825/feat/ms22-findings
archive/salvage-20260825/feat/ms22-knowledge-schema
archive/salvage-20260825/chore/tasks-final
archive/salvage-20260825/chore/tasks-update
archive/salvage-20260825/feat/ms21-session-invalidation
archive/salvage-20260825/feat/ms21-rbac-settings
archive/salvage-20260825/feat/ms21-rbac
archive/salvage-20260825/feat/ms21-ui-user-dialogs
archive/salvage-20260825/feat/ms21-ui-workspace-members
archive/salvage-20260825/feat/ms21-ui-teams
archive/salvage-20260825/chore/ms21-tasks-ui-progress
archive/salvage-20260825/feat/ms21-ui-workspaces
archive/salvage-20260825/feat/ms21-ui-users
archive/salvage-20260825/chore/ms21-tasks-schema-fix
archive/salvage-20260825/feat/ms21-import-api
archive/salvage-20260825/test/ms21-migration-tests
archive/salvage-20260825/feat/ms21-teams-page
archive/salvage-20260825/feat/ms21-users-page
archive/salvage-20260825/chore/ms21-task-update-p1-p3
archive/salvage-20260825/feat/ms21-admin-module
archive/salvage-20260825/fix/websocket-reconnect
archive/salvage-20260825/merge/develop-to-main
skill-lifecycle-v1
onboarding-v1
agent-seats-v1
interactive-agent-v1
auto-apply-v1
session-fork-v1
retention-v1
mission-policy-v1
conductor-v1
workspace-capabilities-v1
sessions-v1
operator-ergonomics-v1
adapter-seam-v1
release-model-v1
mission-task-v1
config-hello-v1
poc-container-hello-v0
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
archive/ms24-fork-20260823
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Assignees
code-be-01 (Mosaic fleet seat code-be-01)
code-be-02 (Mosaic fleet seat code-be-02)
code-dogfood-01 (Mosaic fleet seat code-dogfood-01)
code-infra-01 (Mosaic fleet seat code-infra-01)
darkwing (Mosaic fleet seat darkwing)
dewey (Mosaic fleet seat dewey)
fargo
filbert (Mosaic fleet seat filbert)
fred
gate-merge-01 (Mosaic fleet seat gate-merge-01)
happy
jason.woltje (Jason Woltje)
marcie
merge-gate
ops-01 (Mosaic fleet seat ops-01)
ops-02 (Mosaic fleet seat ops-02)
ops-03 (Mosaic fleet seat ops-03)
ops-ci-01 (Mosaic fleet seat ops-ci-01)
ops-deploy-01 (Mosaic fleet seat ops-deploy-01)
orch-01 (Mosaic fleet seat orch-01)
pepper
resume
rev-code-01
rev-code-02
rev-security-01
rev-security-02
rev-security-03 (Mosaic fleet seat rev-security-03)
rocko (Mosaic fleet seat rocko)
sanity
scooby (Scooby)
scrappy
shaggy
tiny
topher (Mosaic fleet seat topher)
velma
veronica (Mosaic fleet seat veronica)
vision
woodpecker
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1081
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
tools/git/issue-close.shcallstea issue comment, which is not a subcommand oftea. On any host where a tea login is configured — the normal, correctly-configured case — the closing comment silently fails and the issue is closed anyway. The audit trail for why an issue was closed is lost, with no error surfaced.The same file already defines a working
gitea_issue_comment_api()helper, but it is only reached on the no-login fallback path.Evidence
Measured against
main@80a45b1e1c3b65999bd48c5b0f41f4b1cb702ff9:issue-close.sh:94(live code, comments stripped — 1 live call site):Two independent defects:
tea issue commentcannot succeed — the subcommand does not exist.||guards on it), so the script proceeds totea issue closeregardless.tea issue closeis valid, so the issue closes and the comment does not post.The no-login branch calls
gitea_issue_comment_api— which works — but it is also unchecked (:100), so it carries defect 2 on its own.Impact
This sits on the completion gate (linked issue closed). The closure outcome is unaffected; what is lost is the record of why, silently. This is the silent-failure class: an operation reports success while doing nothing.
Suggested fix
Route the comment through the existing
gitea_issue_comment_api()on both branches (it is login-independent and already proven), and fail closed — do not close the issue if the comment could not be posted:Alternatively keep
teaand correct it to the top-leveltea comment, but the API helper avoids depending on tea's subcommand surface and already exists in-file.Acceptance
Provenance note
This defect was independently fixed on a homelab host in July; that host-local edit routes both branches through the API helper with a fail-closed guard. The fix is being contributed upstream rather than left as undeclared host divergence.
No closing keywords intended; none used.
⛔ Correction to this issue's severity claim — from the author
I wrote that the issue closes anyway and the record of why is silently lost. That is wrong.
issue-close.shcarriesset -eat line 5, so the failingtea issue commentaborts the script. Measured againstmainunder a mockedtea:So there is no silent failure and no fail-open.
set -ealready fails closed, by accident rather than by design, and the "issue closes without its comment" scenario I described does not occur.What the defect actually is
issue-close.sh -c <comment>cannot succeed at all on any host where a tea login resolves.tea issue commentis not a subcommand, so the command aborts every time. The close path is fine; the commented close is simply broken.That is still a real bug — the documented way to close an issue with a note does not work — but it is loud, not silent, and it is a usability/availability defect rather than an audit-integrity one. I over-stated the severity and the mechanism.
What this changes about the fix
The change in #1085 is still correct and still needed, for narrower reasons:
tea comment(top-level) is the valid subcommand — this is the actual repair|| { ...; exit 1; }guard is still worth having: relying onset -efor a fail-closed property means the property silently disappears if anyone adds a|| true, wraps the call in a conditional, or runs the function in a context whereset -edoes not apply. A safety property that holds by accident is not a control.How I found it
The regression test I wrote for this went red on the unfixed script for the wrong reason — it fired on "wrong subcommand" rather than on "closed after the comment failed", which told me the close was never reached. Chasing that discrepancy produced the
set -efinding.The test that was supposed to prove the fix instead disproved the bug report. Recording that, because it is the argument for red-first testing better than anything I could assert.
No closing keywords intended; none used.