Skip to content

feat(#1900)!: support bot and service-account Jira authentication - #1914

Merged
ggallen merged 2 commits into
mainfrom
agent/1900-jira-bot-service-account-auth
Nov 7, 2026
Merged

ggallen merged 2 commits into
mainfrom
agent/1900-jira-bot-service-account-auth

Conversation

@fullsend-ai-coder

@fullsend-ai-coder fullsend-ai-coder Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The Jira-aware agents in this repository now work with either Jira credential mode from fullsend#9007:

  • Token + email (bot user): Basic auth with email:token.
  • Token only (service account): Bearer auth with the token. An empty or whitespace-only email counts as absent, so an unset secret never produces an empty-user Basic header.

Both modes send REST calls through JIRA_API_URL. JIRA_BASE_URL is still used for browse links and the tenant check.

Changes

  • scripts/lib/jira-auth.lib.sh (new): one helper shared by the triage and scribe Jira libraries and post-code. It picks curl --user or curl --oauth2-bearer, and runs the fullsend CLI with FULLSEND_JIRA_TOKEN. It sets FULLSEND_JIRA_EMAIL only when an email is present, and removes an inherited one in Bearer mode. Credentials reach the CLI through the environment, never through flags.
  • Triage and scribe helpers, post-code: JIRA_TOKEN is required and JIRA_USER_EMAIL is optional. fullsend issues post-comment and fullsend issues create now use the config-backed CLI contract from fullsend#9078: --fullsend-dir "${FULLSEND_DIR}", with no --jira-url, --jira-email or --token. The minimum fullsend CLI is a release that includes #9078, as stated in the scribe, triage and code docs and in the scribe preflight error. Bundles were rebuilt with scripts/bundle-sh.sh and match their sources.
  • pre-scribe: with FULLSEND_TRACKER=jira it fails before the agent runs when FULLSEND_DIR is unset, rather than in post-scribe.
  • post-code credential isolation: the script now re-executes itself at the start with JIRA_TOKEN, JIRA_USER_EMAIL and the FULLSEND_JIRA_* names removed from the environment, before any git command. It holds the credentials only in shell variables and passes them to the Jira stage update after hooks have finished. Repo-controlled hooks, including the reference-transaction hook that fires when the agent branch is renamed, can no longer read them from their environment or from a parent's /proc/<pid>/environ. This does not defend against a same-user process that can ptrace the script.
  • Harnesses (triage.yaml, code.yaml): the Jira overlays map JIRA_TOKEN: ${FULLSEND_JIRA_TOKEN} and JIRA_USER_EMAIL: ${FULLSEND_JIRA_EMAIL} in env.runner, following the host-side mapping from fullsend#9079, and add FULLSEND_DIR: ${FULLSEND_DIR}. JIRA_USER_EMAIL no longer goes in env.sandbox, where an unset value fails the run. It reaches the sandbox only through the expanded env/jira/*.env host files; code.env gained the export.
  • Skills (jira-forge, issue-labels/jira, jira-components, code-implementation): Jira curl calls choose Basic or Bearer from JIRA_USER_EMAIL. The selection uses plain variables (JIRA_AUTH_FLAG and JIRA_AUTH) because the tirith shell hook rejects arrays that hold flags. I trimmed the code-implementation text so it stays within its skillsaw context-budget baseline.
  • Provider: fullsend#9079 makes provider credential values referencing FULLSEND_JIRA_* resolve empty, so providers/jira-ro.yaml keeps reading JIRA_TOKEN. I added a comment explaining why. The sandbox still only ever sees the placeholder.
  • Docs: docs/triage.md, docs/code.md, docs/scribe.md and LOCAL.md cover the two modes, the new mappings, FULLSEND_DIR and the minimum CLI version.

Breaking change

The triage and code Jira overlays now take host-side credentials from FULLSEND_JIRA_TOKEN and the optional FULLSEND_JIRA_EMAIL, not from JIRA_TOKEN and JIRA_USER_EMAIL. The Jira scripts also need FULLSEND_DIR for the config-backed CLI. Custom scribe harnesses on Jira must add FULLSEND_DIR to env.runner, and must omit JIRA_USER_EMAIL when using a service-account token.

Testing

  • Script tests: post-scribe-test.sh, pre-scribe-test.sh, pre-triage-test.sh and bundle-sh-test.sh pass, and post-code-test.sh passes except for three signed-commits harness checks that also fail on main. make itself could not run in the sandbox, so I ran each test directly, and yq and shellcheck are not installed there, so the yq-based tests (harness-jira, sandbox-credential-boundary, skill-env-reachability, post-triage) did not run in the latest fix pass. New cases cover:
    • Basic auth with an email; Bearer auth with an unset, empty or blank email; an inherited FULLSEND_JIRA_EMAIL being dropped.
    • The JIRA_API_URL request path in Bearer mode.
    • --fullsend-dir and the CLI environment; a missing FULLSEND_DIR failing the step, in post-scribe and in pre-scribe before any network call.
    • Pre-commit, pre-push and branch-rename hooks seeing no Jira credentials, in their environment or in the /proc environment of their parent and grandparent, while the Jira write still receives them.
    • Harness env.runner mappings, and no FULLSEND_JIRA_* reaching sandbox env, host files or the provider.
  • pre-commit could not fetch its hook repos because of a TLS error in the sandbox, so the hooks were not run through it. lint-agent-docs and gitleaks (through scan-secrets) pass.

Notes for reviewers

  • The sandbox jira-ro provider still depends on the JIRA_TOKEN secret. A repository that only has FULLSEND_JIRA_TOKEN still needs JIRA_TOKEN for sandbox reads, because fullsend does not let providers expand the FULLSEND_JIRA_* values.
  • This PR touches skills/ and harness/, which may need human approval under the protected-path rules.

🤖 Generated with Claude Code


Closes #1900

Post-script verification

  • Branch is not main/master (agent/1900-jira-bot-service-account-auth)
  • Secret scan passed (gitleaks — 270303be62213ed80cd962053f6683d959708686..HEAD)
  • PR body secret scan passed (gitleaks — no-git)
  • Final PR description secret scan passed (gitleaks — no-git)

@fullsend-ai-coder
fullsend-ai-coder Bot requested a review from a team as a code owner November 6, 2026 21:18
@fullsend-ai-coder fullsend-ai-coder Bot added the ready-for-review Triggers review agent dispatch label Nov 6, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ❌ Failure (validation failed after 1 iteration(s)) · Started 9:20 PM UTC · Completed 9:35 PM UTC

Commit: 532af76 · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $3.47

@ggallen

ggallen commented Nov 6, 2026

Copy link
Copy Markdown
Member

/fs-review

@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:58 PM UTC · Completed 10:08 PM UTC

Commit: 532af76 · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $2.43

@fullsend-ai-review fullsend-ai-review Bot added the risk/moderate PR risk: moderate label Nov 6, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Risk Assessment: moderate (2/5)

Details

Moderate risk driven by large change size and protected path updates with active git churn, tempered by bot authorship, zero security-sensitive or workflow changes, and complete alignment with a fresh, active linked issue.

Previous run

Risk Assessment: moderate (2/5)

Details

Moderate risk driven by large change size and protected path updates with active git churn, tempered by bot authorship, zero security-sensitive or workflow changes, and complete alignment with a fresh, active linked issue.

Previous run (2)

Risk Assessment: moderate (2/5)

Details

Moderate risk driven by large change size and protected path updates with active git churn, tempered by bot authorship, zero security-sensitive or workflow changes, and complete alignment with a fresh, active linked issue.

Previous run (3)

Risk Assessment: moderate (2/5)

Details

Moderate risk driven by large change size and protected path updates with active git churn, tempered by bot authorship, zero security-sensitive or workflow changes, and complete alignment with a fresh, active linked issue.

Previous run (4)

Risk Assessment: moderate (2/5)

Details

Moderate risk driven by large change size and protected path updates with active git churn, tempered by bot authorship, zero security-sensitive or workflow changes, and complete alignment with a fresh, active linked issue.

@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Review

Findings

Medium

  • [protected-path] harness/code.yaml — This PR modifies governance/infrastructure files under protected paths: harness/code.yaml, harness/triage.yaml, providers/jira-ro.yaml, skills/code-implementation/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-components/SKILL.md, skills/jira-forge/SKILL.md, and the scripts/ files (post-code, post-scribe, post-triage, pre-scribe, pre-triage and their sources and tests, lib/jira-auth.lib.sh, lib/jira-scribe-ops.lib.sh, lib/jira-triage-ops.lib.sh, harness-jira-test.sh, sandbox-credential-boundary-test.sh, skill-env-reachability-test.sh). The PR links Jira agents: support bot and service-account authentication #1900 and explains the rationale, but human approval is always required for protected-path changes, regardless of context.

Earlier findings

  • docs/scribe.md:211 — incorrect-doc, resolved: the FULLSEND_DIR host-side variable is now listed and the CI setup steps for it were added.
  • docs/code.md:348 — incomplete-doc, resolved: the jira-ro provider's JIRA_TOKEN requirement for sandbox reads is now documented.
Previous run

<!-- fullsend:review-findings-v2:eyJ2ZXJzaW9uIjoyLCJhY3Rpb24iOiJyZXF1ZXN0LWNoYW5nZXMiLCJmaW5kaW5ncyI6W3sic2V2ZXJpdHkiOiJtZWRpdW0iLCJjYXRlZ29yeSI6ImluY29ycmVjdC1kb2MiLCJmaWxlIjoiZG9jcy9zY3JpYmUubWQiLCJpZCI6ImZfZjQzNGEwMjQ3ZGM1YjIxOCIsImxpbmUiOjIxMSwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoiZG9jcy1jdXJyZW5jeSJ9LHsic2V2ZXJpdHkiOiJtZWRpdW0iLCJjYXRlZ29yeSI6ImluY29tcGxldGUtZG9jIiwiZmlsZSI6ImRvY3MvY29kZS5tZCIsImlkIjoiZl83Yjg4NTM4ZGM5ZGEyNjM3IiwibGluZSI6MzMzLCJhY3Rpb25hYmxlIjp0cnVlLCJkaW1lbnNpb24iOiJkb2NzLWN1cnJlbmN5In0seyJzZXZlcml0eSI6Im1lZGl1bSIsImNhdGVnb3J5IjoiaW5jb21wbGV0ZS1kb2MiLCJmaWxlIjoiTE9DQUwubWQiLCJpZCI6ImZfM2ViMjFiYWFiMjE3Y2JmZSIsImxpbmUiOjEzNywiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoiZG9jcy1jdXJyZW5jeSJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImluY29ycmVjdC1kb2MiLCJmaWxlIjoiZG9jcy90cmlhZ2UubWQiLCJpZCI6ImZfOWQ3N2U0ZDVjMDBjZjYwMyIsImxpbmUiOjI2NiwiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6ImRvY3MtY3VycmVuY3kifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJzZWNyZXQtZXhwb3N1cmUiLCJmaWxlIjoic2NyaXB0cy9wb3N0LWNvZGUuc3JjLnNoIiwiaWQiOiJmX2M2ZjM1MDY0NTc3OWIyZjgiLCJsaW5lIjo4OSwiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6InNlY3VyaXR5In0seyJzZXZlcml0eSI6ImxvdyIsImNhdGVnb3J5Ijoic2VjcmV0LWV4cG9zdXJlIiwiZmlsZSI6InNjcmlwdHMvcG9zdC1jb2RlLnNyYy5zaCIsImlkIjoiZl8yMDAyZmIzZTM4NzM1ODEyIiwibGluZSI6Njk2LCJhY3Rpb25hYmxlIjpmYWxzZSwiZGltZW5zaW9uIjoic2VjdXJpdHkifSx7InNldmVyaXR5IjoiaW5mbyIsImNhdGVnb3J5Ijoic2VjcmV0LWV4cG9zdXJlIiwiZmlsZSI6InNjcmlwdHMvcG9zdC1jb2RlLnNyYy5zaCIsImlkIjoiZl9iNzg4NjAyNWI3ODkxYjE5IiwibGluZSI6NjkzLCJhY3Rpb25hYmxlIjpmYWxzZSwiZGltZW5zaW9uIjoic2VjdXJpdHkifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJicmVha2luZy1jb25maWciLCJmaWxlIjoic2NyaXB0cy9saWIvamlyYS1zY3JpYmUtb3BzLmxpYi5zaCIsImlkIjoiZl82MWQ4MmVjMzRiZGMwZWRhIiwibGluZSI6NDYxLCJhY3Rpb25hYmxlIjpmYWxzZSwiZGltZW5zaW9uIjoiY3Jvc3MtcmVwby1jb250cmFjdHMifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJiYWNrd2FyZC1pbmNvbXBhdGlibGUiLCJmaWxlIjoic2NyaXB0cy9saWIvamlyYS1zY3JpYmUtb3BzLmxpYi5zaCIsImlkIjoiZl8wYzFiMDMzYzc0NWM4YjFmIiwibGluZSI6NDY1LCJhY3Rpb25hYmxlIjpmYWxzZSwiZGltZW5zaW9uIjoiY3Jvc3MtcmVwby1jb250cmFjdHMifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJicmVha2luZy1jb25maWciLCJmaWxlIjoiaGFybmVzcy90cmlhZ2UueWFtbCIsImlkIjoiZl80OTU5OTE3MTEzN2FmOWFkIiwibGluZSI6MTQ5LCJhY3Rpb25hYmxlIjpmYWxzZSwiZGltZW5zaW9uIjoiY3Jvc3MtcmVwby1jb250cmFjdHMifSx7InNldmVyaXR5IjoibWVkaXVtIiwiY2F0ZWdvcnkiOiJsb2dpYy1lcnJvciIsImZpbGUiOiJzY3JpcHRzL3NraWxsLWVudi1yZWFjaGFiaWxpdHktdGVzdC5zaCIsImlkIjoiZl8zZTE3NzMxNjM5YjI3ODRmIiwibGluZSI6MTEyLCJhY3Rpb25hYmxlIjp0cnVlLCJkaW1lbnNpb24iOiJjb3JyZWN0bmVzcyJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImVkZ2UtY2FzZSIsImZpbGUiOiJza2lsbHMvamlyYS1mb3JnZS9TS0lMTC5tZCIsImlkIjoiZl82MjZkZmMyZTU1NmIxMDA3IiwibGluZSI6MjgsImFjdGlvbmFibGUiOnRydWUsImRpbWVuc2lvbiI6ImNvcnJlY3RuZXNzIn0seyJzZXZlcml0eSI6Im1lZGl1bSIsImNhdGVnb3J5IjoidGVzdC1pbmFkZXF1YXRlIiwiZmlsZSI6InNjcmlwdHMvaGFybmVzcy1qaXJhLXRlc3Quc2giLCJpZCI6ImZfNjgzMGVjNGQwYmExYWVjMyIsImxpbmUiOjI2MSwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoiY29ycmVjdG5lc3MifSx7InNldmVyaXR5IjoibWVkaXVtIiwiY2F0ZWdvcnkiOiJzZWNyZXQtZXhwb3N1cmUiLCJmaWxlIjoic2NyaXB0cy9wb3N0LWNvZGUuc3JjLnNoIiwiaWQiOiJmXzM2OGRmZWQ2ZGE0MGM2MTEiLCJsaW5lIjo2OTQsImFjdGlvbmFibGUiOnRydWUsImRpbWVuc2lvbiI6InNlY3VyaXR5In1dLCJkaXNwb3NpdGlvbnMiOlt7ImlkIjoiZl8yMDAyZmIzZTM4NzM1ODEyIiwic3RhdHVzIjoib3BlbiJ9LHsiaWQiOiJmX2I3ODg2MDI1Yjc4OTFiMTkiLCJzdGF0dXMiOiJvcGVuIn0seyJpZCI6ImZfMzY4ZGZlZDZkYTQwYzYxMSIsInN0YXR1cyI6InJlc29sdmVkX2J5X2NoYW5nZSJ9LHsiaWQiOiJmXzYxZDgyZWMzNGJkYzBlZGEiLCJzdGF0dXMiOiJkaXNtaXNzZWRfYnlfaHVtYW4ifSx7ImlkIjoiZl8wYzFiMDMzYzc0NWM4YjFmIiwic3RhdHVzIjoiZGlzbWlzc2VkX2J5X2h1bWFuIn0seyJpZCI6ImZfNDk1OTkxNzExMzdhZjlhZCIsInN0YXR1cyI6ImRpc21pc3NlZF9ieV9odW1hbiJ9LHsiaWQiOiJmXzNlMTc3MzE2MzliMjc4NGYiLCJzdGF0dXMiOiJkaXNtaXNzZWRfYnlfaHVtYW4ifSx7ImlkIjoiZl82MjZkZmMyZTU1NmIxMDA3Iiwic3RhdHVzIjoicmVzb2x2ZWRfYnlfY2hhbmdlIn0seyJpZCI6ImZfNjgzMGVjNGQwYmExYWVjMyIsInN0YXR1cyI6InJlc29sdmVkX2J5X2NoYW5nZSJ9XX0= -->

Review

Findings

Medium

  • [protected-path] harness/code.yaml — This PR modifies protected paths (harness/code.yaml, harness/triage.yaml, providers/jira-ro.yaml, scripts/**, and the code-implementation, issue-labels/jira, jira-components and jira-forge skills). It links issue Jira agents: support bot and service-account authentication #1900 and the description explains the rationale, but human approval is always required for protected-path changes, regardless of context.
  • [incorrect-doc] docs/scribe.md:211 — The "Supplying Jira credentials in CI" section lists only JIRA_BASE_URL, JIRA_TOKEN and JIRA_USER_EMAIL. The GitHub Actions env: example and the GitLab steps omit FULLSEND_DIR. pre-scribe.sh now exits 1 when FULLSEND_TRACKER=jira and FULLSEND_DIR is unset, so following these steps as written fails the run.
    Remediation: Add FULLSEND_DIR to the variable list and to the GitHub Actions and GitLab examples.
  • [incomplete-doc] docs/code.md:333 — The "Jira results" section never says that the JIRA_TOKEN secret must still be configured for the sandbox jira-ro provider, which cannot expand FULLSEND_JIRA_*. docs/triage.md states this, so an operator following only docs/code.md can configure just FULLSEND_JIRA_TOKEN and break sandbox reads.
    Remediation: Add the requirement to the Jira-source overlay section of docs/code.md, matching docs/triage.md.
  • [incomplete-doc] LOCAL.md:137 — The local Jira triage and code snippets (around lines 131-146 and 170-183) never export FULLSEND_DIR. The post-scripts now require it, and nothing sets it automatically.
    Remediation: Add export FULLSEND_DIR=<path to the .fullsend directory> to both snippets.

Low

  • [incorrect-doc] docs/triage.md:266 — The FULLSEND_DIR row says "The harness sets it in env.runner." The harness only passes ${FULLSEND_DIR} through from the host environment, so the operator must supply it.
  • [secret-exposure] scripts/post-code.src.sh:89 — The re-exec at lines 89-105 removes the Jira credentials from the environment before any git command, which addresses the earlier hook-inheritance concern. Residual limits remain: the credentials stay in this process's memory, and ancestor processes and same-user ptrace are not covered, as the comment at lines 67-88 acknowledges.

Earlier findings

  • scripts/post-code.src.sh, secret-exposure — resolved: the credentials are now stashed and the script re-executed without them (lines 89-105) before any git command, including the one that fires on git branch -M.

Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (2)

<!-- fullsend:review-findings-v2:eyJ2ZXJzaW9uIjoyLCJhY3Rpb24iOiJyZXF1ZXN0LWNoYW5nZXMiLCJmaW5kaW5ncyI6W3sic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6InNlY3JldC1leHBvc3VyZSIsImZpbGUiOiJzY3JpcHRzL3Bvc3QtY29kZS5zcmMuc2giLCJpZCI6ImZfMjAwMmZiM2UzODczNTgxMiIsImxpbmUiOjY5NiwiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6InNlY3VyaXR5In0seyJzZXZlcml0eSI6ImluZm8iLCJjYXRlZ29yeSI6InNlY3JldC1leHBvc3VyZSIsImZpbGUiOiJzY3JpcHRzL3Bvc3QtY29kZS5zcmMuc2giLCJpZCI6ImZfYjc4ODYwMjViNzg5MWIxOSIsImxpbmUiOjY5MywiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6InNlY3VyaXR5In0seyJzZXZlcml0eSI6ImxvdyIsImNhdGVnb3J5IjoiYnJlYWtpbmctY29uZmlnIiwiZmlsZSI6InNjcmlwdHMvbGliL2ppcmEtc2NyaWJlLW9wcy5saWIuc2giLCJpZCI6ImZfNjFkODJlYzM0YmRjMGVkYSIsImxpbmUiOjQ2MSwiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6ImNyb3NzLXJlcG8tY29udHJhY3RzIn0seyJzZXZlcml0eSI6ImxvdyIsImNhdGVnb3J5IjoiYmFja3dhcmQtaW5jb21wYXRpYmxlIiwiZmlsZSI6InNjcmlwdHMvbGliL2ppcmEtc2NyaWJlLW9wcy5saWIuc2giLCJpZCI6ImZfMGMxYjAzM2M3NDVjOGIxZiIsImxpbmUiOjQ2NSwiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6ImNyb3NzLXJlcG8tY29udHJhY3RzIn0seyJzZXZlcml0eSI6ImxvdyIsImNhdGVnb3J5IjoiYnJlYWtpbmctY29uZmlnIiwiZmlsZSI6Imhhcm5lc3MvdHJpYWdlLnlhbWwiLCJpZCI6ImZfNDk1OTkxNzExMzdhZjlhZCIsImxpbmUiOjE0OSwiYWN0aW9uYWJsZSI6ZmFsc2UsImRpbWVuc2lvbiI6ImNyb3NzLXJlcG8tY29udHJhY3RzIn0seyJzZXZlcml0eSI6Im1lZGl1bSIsImNhdGVnb3J5IjoibG9naWMtZXJyb3IiLCJmaWxlIjoic2NyaXB0cy9za2lsbC1lbnYtcmVhY2hhYmlsaXR5LXRlc3Quc2giLCJpZCI6ImZfM2UxNzczMTYzOWIyNzg0ZiIsImxpbmUiOjExMiwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoiY29ycmVjdG5lc3MifSx7InNldmVyaXR5IjoibWVkaXVtIiwiY2F0ZWdvcnkiOiJzZWNyZXQtZXhwb3N1cmUiLCJmaWxlIjoic2NyaXB0cy9wb3N0LWNvZGUuc3JjLnNoIiwiaWQiOiJmXzM2OGRmZWQ2ZGE0MGM2MTEiLCJsaW5lIjo2OTQsImFjdGlvbmFibGUiOnRydWUsImRpbWVuc2lvbiI6InNlY3VyaXR5In0seyJzZXZlcml0eSI6ImxvdyIsImNhdGVnb3J5IjoiZWRnZS1jYXNlIiwiZmlsZSI6InNraWxscy9qaXJhLWZvcmdlL1NLSUxMLm1kIiwiaWQiOiJmXzYyNmRmYzJlNTU2YjEwMDciLCJsaW5lIjoyOCwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoiY29ycmVjdG5lc3MifSx7InNldmVyaXR5IjoibWVkaXVtIiwiY2F0ZWdvcnkiOiJ0ZXN0LWluYWRlcXVhdGUiLCJmaWxlIjoic2NyaXB0cy9oYXJuZXNzLWppcmEtdGVzdC5zaCIsImlkIjoiZl82ODMwZWM0ZDBiYTFhZWMzIiwibGluZSI6MjYxLCJhY3Rpb25hYmxlIjp0cnVlLCJkaW1lbnNpb24iOiJjb3JyZWN0bmVzcyJ9XSwiZGlzcG9zaXRpb25zIjpbeyJpZCI6ImZfNjgzMGVjNGQwYmExYWVjMyIsInN0YXR1cyI6InJlc29sdmVkX2J5X2NoYW5nZSJ9LHsiaWQiOiJmXzNlMTc3MzE2MzliMjc4NGYiLCJzdGF0dXMiOiJvcGVuIn0seyJpZCI6ImZfMjAwMmZiM2UzODczNTgxMiIsInN0YXR1cyI6InJlY2xhc3NpZmllZCJ9LHsiaWQiOiJmXzYxZDgyZWMzNGJkYzBlZGEiLCJzdGF0dXMiOiJvcGVuIn0seyJpZCI6ImZfMGMxYjAzM2M3NDVjOGIxZiIsInN0YXR1cyI6Im9wZW4ifSx7ImlkIjoiZl80OTU5OTE3MTEzN2FmOWFkIiwic3RhdHVzIjoib3BlbiJ9LHsiaWQiOiJmXzM2OGRmZWQ2ZGE0MGM2MTEiLCJzdGF0dXMiOiJvcGVuIn0seyJpZCI6ImZfNjI2ZGZjMmU1NTZiMTAwNyIsInN0YXR1cyI6InJlc29sdmVkX2J5X2NoYW5nZSJ9XX0= -->

Review

Findings

Medium

  • [protected-path] harness/code.yaml — This PR modifies protected paths (harness/, providers/, scripts/, skills/, including harness/code.yaml, harness/triage.yaml, providers/jira-ro.yaml and the Jira skills). It links issue Jira agents: support bot and service-account authentication #1900 and the description explains the rationale, but human approval is always required for protected-path changes regardless of context.

Low

  • [secret-exposure] scripts/post-code.src.sh:696 — Unsetting the Jira credentials stops child processes from inheriting them, but repo-controlled hooks running as the same user can still read the initial environment through /proc/$PPID/environ. The code comment above the unset says so. The base branch already had this pattern for JIRA_TOKEN and JIRA_USER_EMAIL, and this PR adds the FULLSEND_JIRA_* names to the unset, so it does not widen the exposure.
    Remediation: Run repo-controlled hooks in a boundary that cannot reach the credential-bearing process, or hand the Jira credentials to a separate trusted write process only after the hooks finish.
  • [breaking-config] scripts/lib/jira-scribe-ops.lib.sh:461 — forge_create_issue now returns an error when FULLSEND_DIR is unset, so custom Jira scribe harnesses must add FULLSEND_DIR to env.runner. The PR declares this as a breaking change.
  • [backward-incompatible] scripts/lib/jira-scribe-ops.lib.sh:465 — The auth mode now depends on whether JIRA_USER_EMAIL is set. Callers that leave it empty switch from Basic to Bearer auth. The PR declares this as a breaking change.
  • [breaking-config] harness/triage.yaml:149 — The triage overlay now reads FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL, and FULLSEND_DIR is new, so consumers must rename or supply these values. The PR declares this as a breaking change.

Earlier findings

  • scripts/harness-jira-test.sh:261, test-inadequate — resolved: the skill-auth assertions now match the trimmed JIRA_EMAIL selection lines in the Jira skills.
  • scripts/skill-env-reachability-test.sh:112, logic-error — resolved: JIRA_EMAIL is now listed in SKILL_LOCAL_VARS.
  • scripts/post-code.src.sh:694, secret-exposure — reclassified from medium to low: the /proc caveat is already documented in the code and predates this PR.

Re-review note: One or more prior medium-or-higher findings remain open and must still be addressed.

Blocking prior findings:

  • medium logic-error at scripts/skill-env-reachability-test.sh:112 (original inline comment)
  • medium secret-exposure at scripts/post-code.src.sh:694

Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

1 finding(s) below the low severity threshold were not posted.

Previous run (3)

<!-- fullsend:review-findings-v2:eyJ2ZXJzaW9uIjoyLCJhY3Rpb24iOiJyZXF1ZXN0LWNoYW5nZXMiLCJmaW5kaW5ncyI6W3sic2V2ZXJpdHkiOiJtZWRpdW0iLCJjYXRlZ29yeSI6InRlc3QtaW5hZGVxdWF0ZSIsImZpbGUiOiJzY3JpcHRzL2hhcm5lc3MtamlyYS10ZXN0LnNoIiwiaWQiOiJmXzY4MzBlYzRkMGJhMWFlYzMiLCJsaW5lIjoyNjEsImFjdGlvbmFibGUiOnRydWUsImRpbWVuc2lvbiI6ImNvcnJlY3RuZXNzIn0seyJzZXZlcml0eSI6Im1lZGl1bSIsImNhdGVnb3J5IjoibG9naWMtZXJyb3IiLCJmaWxlIjoic2NyaXB0cy9za2lsbC1lbnYtcmVhY2hhYmlsaXR5LXRlc3Quc2giLCJpZCI6ImZfM2UxNzczMTYzOWIyNzg0ZiIsImxpbmUiOjExMiwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoiY29ycmVjdG5lc3MifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJzZWNyZXQtZXhwb3N1cmUiLCJmaWxlIjoic2NyaXB0cy9wb3N0LWNvZGUuc3JjLnNoIiwiaWQiOiJmXzIwMDJmYjNlMzg3MzU4MTIiLCJsaW5lIjo2OTYsImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJzZWN1cml0eSJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImJyZWFraW5nLWNvbmZpZyIsImZpbGUiOiJzY3JpcHRzL2xpYi9qaXJhLXNjcmliZS1vcHMubGliLnNoIiwiaWQiOiJmXzYxZDgyZWMzNGJkYzBlZGEiLCJsaW5lIjo0NjEsImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJjcm9zcy1yZXBvLWNvbnRyYWN0cyJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImJhY2t3YXJkLWluY29tcGF0aWJsZSIsImZpbGUiOiJzY3JpcHRzL2xpYi9qaXJhLXNjcmliZS1vcHMubGliLnNoIiwiaWQiOiJmXzBjMWIwMzNjNzQ1YzhiMWYiLCJsaW5lIjo0NjUsImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJjcm9zcy1yZXBvLWNvbnRyYWN0cyJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImJyZWFraW5nLWNvbmZpZyIsImZpbGUiOiJoYXJuZXNzL3RyaWFnZS55YW1sIiwiaWQiOiJmXzQ5NTk5MTcxMTM3YWY5YWQiLCJsaW5lIjoxNDksImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJjcm9zcy1yZXBvLWNvbnRyYWN0cyJ9LHsic2V2ZXJpdHkiOiJtZWRpdW0iLCJjYXRlZ29yeSI6InNlY3JldC1leHBvc3VyZSIsImZpbGUiOiJzY3JpcHRzL3Bvc3QtY29kZS5zcmMuc2giLCJpZCI6ImZfMzY4ZGZlZDZkYTQwYzYxMSIsImxpbmUiOjY5NCwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoic2VjdXJpdHkifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJlZGdlLWNhc2UiLCJmaWxlIjoic2tpbGxzL2ppcmEtZm9yZ2UvU0tJTEwubWQiLCJpZCI6ImZfNjI2ZGZjMmU1NTZiMTAwNyIsImxpbmUiOjI4LCJhY3Rpb25hYmxlIjp0cnVlLCJkaW1lbnNpb24iOiJjb3JyZWN0bmVzcyJ9XSwiZGlzcG9zaXRpb25zIjpbeyJpZCI6ImZfMzY4ZGZlZDZkYTQwYzYxMSIsInN0YXR1cyI6Im9wZW4ifSx7ImlkIjoiZl82MjZkZmMyZTU1NmIxMDA3Iiwic3RhdHVzIjoicmVzb2x2ZWRfYnlfY2hhbmdlIn0seyJpZCI6ImZfNjFkODJlYzM0YmRjMGVkYSIsInN0YXR1cyI6Im9wZW4ifSx7ImlkIjoiZl8wYzFiMDMzYzc0NWM4YjFmIiwic3RhdHVzIjoib3BlbiJ9LHsiaWQiOiJmXzQ5NTk5MTcxMTM3YWY5YWQiLCJzdGF0dXMiOiJvcGVuIn1dfQ== -->

Review

Findings

Medium

  • [test-inadequate] scripts/harness-jira-test.sh:261 — The whitespace-trim change makes every Jira skill select auth from the local JIRA_EMAIL, but this assertion (and scripts/sandbox-credential-boundary-test.sh:165) still requires the old JIRA_USER_EMAIL expressions verbatim with grep -qF. All four skill checks fail under make script-test.
    Remediation: Update both scripts to assert the normalized-email expressions, ideally also executing the snippets with populated, unset, empty and whitespace-only emails.
  • [logic-error] scripts/skill-env-reachability-test.sh:112 — The skills now assign JIRA_EMAIL locally, but SKILL_LOCAL_VARS only exempts JIRA_AUTH and JIRA_AUTH_FLAG. The reachability checker reports JIRA_EMAIL as missing from env.sandbox, so make script-test fails.
    Remediation: Add JIRA_EMAIL to SKILL_LOCAL_VARS.
  • [protected-path] harness/ — The PR modifies protected paths (harness/, providers/, scripts/, skills/). It links Jira agents: support bot and service-account authentication #1900 and explains the rationale, but human approval is always required for protected-path changes, regardless of context.

Low

  • [secret-exposure] scripts/post-code.src.sh:696 — Reclassified from medium. The FULLSEND_JIRA_* names are now withheld with the legacy names. One gap remains: git branch -M (line 675) runs before the unset, so a repo-controlled reference-transaction hook could inherit the Jira variables on the branch-rename path. The ordering is the same in the base, and the PR only extends the unset list.
    Remediation: Optionally unset the credentials before branch normalization, or run it with -c core.hooksPath=/dev/null. Rebuild scripts/post-code.sh.
  • [breaking-config] scripts/lib/jira-scribe-ops.lib.sh:461 — Unchanged since the prior review. Custom Jira scribe harnesses now need FULLSEND_DIR in env.runner, and a JIRA_USER_EMAIL set for a service-account token must be removed. The PR declares both as breaking config changes.
  • [backward-incompatible] scripts/lib/jira-scribe-ops.lib.sh:465 — Unchanged since the prior review. Email is now optional, with Basic vs Bearer chosen from it, and the code now relies on the FULLSEND_DIR library. Existing custom harnesses may break.
  • [breaking-config] harness/triage.yaml:149 — Unchanged since the prior review. The triage Jira overlay now reads FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL on the host instead of JIRA_TOKEN and JIRA_USER_EMAIL. Downstream secret and variable wiring must be renamed.

Earlier findings

  • skills/jira-forge/SKILL.md:28, edge-case — resolved: the skill now trims JIRA_USER_EMAIL into JIRA_EMAIL before choosing the auth mode, so a whitespace-only email selects Bearer.
  • scripts/post-code.src.sh:696, secret-exposure — reclassified from medium to low (see above).

Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (4)

<!-- fullsend:review-findings-v2:eyJ2ZXJzaW9uIjoyLCJhY3Rpb24iOiJyZXF1ZXN0LWNoYW5nZXMiLCJmaW5kaW5ncyI6W3sic2V2ZXJpdHkiOiJtZWRpdW0iLCJjYXRlZ29yeSI6InNlY3JldC1leHBvc3VyZSIsImZpbGUiOiJzY3JpcHRzL3Bvc3QtY29kZS5zcmMuc2giLCJpZCI6ImZfMzY4ZGZlZDZkYTQwYzYxMSIsImxpbmUiOjY5NCwiYWN0aW9uYWJsZSI6dHJ1ZSwiZGltZW5zaW9uIjoic2VjdXJpdHkifSx7InNldmVyaXR5IjoibG93IiwiY2F0ZWdvcnkiOiJlZGdlLWNhc2UiLCJmaWxlIjoic2tpbGxzL2ppcmEtZm9yZ2UvU0tJTEwubWQiLCJpZCI6ImZfNjI2ZGZjMmU1NTZiMTAwNyIsImxpbmUiOjI4LCJhY3Rpb25hYmxlIjp0cnVlLCJkaW1lbnNpb24iOiJjb3JyZWN0bmVzcyJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImJyZWFraW5nLWNvbmZpZyIsImZpbGUiOiJzY3JpcHRzL2xpYi9qaXJhLXNjcmliZS1vcHMubGliLnNoIiwiaWQiOiJmXzYxZDgyZWMzNGJkYzBlZGEiLCJsaW5lIjo0NjEsImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJjcm9zcy1yZXBvLWNvbnRyYWN0cyJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImJhY2t3YXJkLWluY29tcGF0aWJsZSIsImZpbGUiOiJzY3JpcHRzL2xpYi9qaXJhLXNjcmliZS1vcHMubGliLnNoIiwiaWQiOiJmXzBjMWIwMzNjNzQ1YzhiMWYiLCJsaW5lIjo0NjUsImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJjcm9zcy1yZXBvLWNvbnRyYWN0cyJ9LHsic2V2ZXJpdHkiOiJsb3ciLCJjYXRlZ29yeSI6ImJyZWFraW5nLWNvbmZpZyIsImZpbGUiOiJoYXJuZXNzL3RyaWFnZS55YW1sIiwiaWQiOiJmXzQ5NTk5MTcxMTM3YWY5YWQiLCJsaW5lIjoxNDksImFjdGlvbmFibGUiOmZhbHNlLCJkaW1lbnNpb24iOiJjcm9zcy1yZXBvLWNvbnRyYWN0cyJ9XX0= -->

Review

Findings

Medium

  • [secret-exposure] scripts/post-code.src.sh:694 — Credential withholding does not cover the newly supported FULLSEND_JIRA_* names. JIRA_TOKEN and JIRA_USER_EMAIL are saved and unset before repository-controlled pre-commit and push hooks run, but inherited FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL remain exported, so hooks receive the real credentials directly when those are present. LOCAL.md now exports both naming pairs, while the credential-boundary tests inspect only the legacy pair.
    Remediation: Unset FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL alongside JIRA_TOKEN and JIRA_USER_EMAIL before running repository-controlled commands; jira_auth_fullsend can restore the saved credentials only for the trusted CLI invocation. Update the hook tests to seed and check all four variables, and rebuild scripts/post-code.sh.
  • [protected-path] harness/code.yaml — This PR modifies protected paths: harness/code.yaml, harness/triage.yaml, providers/jira-ro.yaml, skills/code-implementation/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-components/SKILL.md, skills/jira-forge/SKILL.md, and the changed scripts/* files. The PR links Jira agents: support bot and service-account authentication #1900 and explains the rationale, but human approval is always required for protected-path changes regardless of context.

Low

  • [edge-case] skills/jira-forge/SKILL.md:28 — The sandbox auth selector (test -n "${JIRA_USER_EMAIL:-}") treats a whitespace-only JIRA_USER_EMAIL as a supplied email, producing --user ' :placeholder', whereas jira_auth_email in scripts/lib/jira-auth.lib.sh trims it and selects Bearer. The same selector is repeated in skills/code-implementation/SKILL.md, skills/issue-labels/jira/SKILL.md and skills/jira-components/SKILL.md.
    Remediation: Normalize surrounding email whitespace before selecting the auth flag and building JIRA_AUTH in all four skills, matching jira_auth_email. Optionally add an executable test of the snippets for unset, empty, whitespace-only and supplied emails.
  • [breaking-config] scripts/lib/jira-scribe-ops.lib.sh:461 — Scribe Jira issue creation now fails when FULLSEND_DIR is unset. Custom scribe harnesses on Jira must add it to env.runner; until then they get a runtime failure (with a clear message) rather than an early harness-level error.
    Remediation: Keep the ! marker and BREAKING CHANGE trailer. Consider failing fast in pre-scribe when FULLSEND_DIR is unset.
  • [backward-incompatible] scripts/lib/jira-scribe-ops.lib.sh:465 — The fullsend issues create / post-comment calls dropped --jira-url, --jira-email and --token and now need a fullsend CLI that includes fullsend#9078. docs/scribe.md still names #8499 as the minimum CLI requirement and does not mention #9078. The same applies to the call in post-code.
    Remediation: Update the minimum fullsend CLI requirement in docs/scribe.md, docs/triage.md and docs/code.md to reference fullsend#9078.
  • [breaking-config] harness/triage.yaml:149 — The triage and code Jira overlays now read host-side credentials from FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL, not JIRA_TOKEN and JIRA_USER_EMAIL. This is declared in the PR and carries the ! marker. The jira-ro provider still reads JIRA_TOKEN, so a repository with only FULLSEND_JIRA_TOKEN gets no sandbox read access.
    Remediation: No change needed beyond the BREAKING CHANGE trailer; keep the migration notes in the docs.

Labels: PR adds Jira bot/service-account auth support and updates docs.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added enhancement New feature or request documentation Improvements or additions to documentation labels Nov 6, 2026
@fullsend-ai-coder

fullsend-ai-coder Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 10:10 PM UTC · Completed 10:14 PM UTC

Commit: 532af76 · View workflow run →

Runtime: claude · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $0.37

@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 1 (bot-triggered)

Fixed the credential-withholding gap and the whitespace-email auth selector. Recorded disagreements on the protected-path gate and the three non-actionable breaking-change and docs findings.

Fixed (2):

  1. Credential withholding does not cover FULLSEND_JIRA_TOKEN / FULLSEND_JIRA_EMAIL (scripts/post-code.src.sh): Unset FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL together with the legacy names before repo-controlled hooks run; the saved copies still feed the trusted CLI call. Hook tests now seed and check all four variables; scripts/post-code.sh rebuilt.
  2. Sandbox auth selector treats a whitespace-only JIRA_USER_EMAIL as an email (skills/jira-forge/SKILL.md): All snippets in the four Jira skills now strip whitespace from JIRA_USER_EMAIL before choosing Basic vs Bearer, matching jira_auth_email; the jira-forge prose notes that whitespace-only counts as absent.

Disagreed (4):

  1. Protected-path modification requires human approval: This is the mandatory merge-gate finding. It demands human approval and prescribes no content change, so there is nothing to edit.
  2. Scribe Jira issue creation fails when FULLSEND_DIR is unset: The reviewer marked this non-actionable and asked to keep the breaking-change marker. A fail-fast check in pre-scribe is optional and beyond what this review requires.
  3. Docs should name fullsend#9078 as the minimum CLI requirement: The reviewer marked this non-actionable. I cannot verify from the repository what #9078 changed, and docs/triage.md and docs/code.md state no minimum CLI version today, so I did not edit the docs. A maintainer who knows the release requirement should add it.
  4. Triage and code overlays read FULLSEND_JIRA_ while jira-ro reads JIRA_TOKEN*: The reviewer states no change is needed beyond the existing breaking-change marker and migration notes.

Tests: passed

CI inspections (4):

  1. functional-tests (code) (passing, success): Passed.
  2. functional-tests (triage) (passing, success): Passed.
  3. commit-lint (passing, success): Passed.
  4. DCO (passing, success): Passed.

Conflict update: skipped; strategy none; forge MERGEABLE; target main

Next steps:

  • /fs-review — request a re-review of the changes
  • /fs-fix <your instruction> — run another fix pass with specific guidance
  • Push commits directly — review re-runs automatically on push
    Updated by fullsend fix agent

fullsend-ai-coder Bot added a commit that referenced this pull request Nov 6, 2026
…mail

Unset FULLSEND_JIRA_TOKEN and FULLSEND_JIRA_EMAIL alongside the legacy
names before repo-controlled hooks run, extend the hook tests to check
all four variables, and rebuild post-code.sh. Normalize whitespace-only
JIRA_USER_EMAIL in the Jira skill snippets so they select Bearer auth
like jira_auth_email.

Addresses review feedback on PR #1914.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:16 PM UTC · Completed 10:24 PM UTC

Commit: 4320cfc · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $1.86

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-coder

fullsend-ai-coder Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 10:26 PM UTC · Completed 10:30 PM UTC

Commit: 4320cfc · View workflow run →

Runtime: claude · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $0.53

@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 2 (bot-triggered)

Fixed the two script-test failures: updated two test scripts to assert the trimmed JIRA_EMAIL selection and exempted JIRA_EMAIL as a skill-local variable. Also fixed the skillsaw failure, caused by this PR growing code-implementation/SKILL.md past its baselined ceiling, by trimming one redundant parenthetical. Recorded disagreements for the protected-path gate, the optional low-severity hook-ordering suggestion, and the already-declared breaking-config notes. The test scripts need yq, which is missing in this sandbox, so they were not run end to end. Pre-commit could not fetch hook repositories. The edited skill lines were verified by direct grep and skillsaw ran locally.

Fixed (4):

  1. test-inadequate: skill auth assertions still require the old JIRA_USER_EMAIL expressions (scripts/harness-jira-test.sh): Updated the skill checks to assert the trimmed JIRA_EMAIL selection lines (trim, flag choice, JIRA_AUTH) in all four Jira skills. The same update was made in scripts/sandbox-credential-boundary-test.sh. Added only grep-based assertions; did not add executable snippet tests.
  2. test-inadequate: sandbox credential boundary test uses the old email expressions (scripts/sandbox-credential-boundary-test.sh): Asserted the normalized JIRA_EMAIL trim, flag-selection and JIRA_AUTH lines instead of the old JIRA_USER_EMAIL expressions.
  3. logic-error: JIRA_EMAIL skill-local variable reported as missing from env.sandbox (scripts/skill-env-reachability-test.sh): Added JIRA_EMAIL to SKILL_LOCAL_VARS next to JIRA_AUTH and JIRA_AUTH_FLAG.
  4. CI: skillsaw context-budget ceiling exceeded by code-implementation skill (pr-related, grew by a few tokens) (skills/code-implementation/SKILL.md): Removed the redundant placeholder parenthetical in the Jira fetch intro (documented in the jira-forge skill) so the skill is back under its baselined ceiling. Verified locally with skillsaw 0.18.0: zero errors.

Disagreed (3):

  1. protected-path: PR modifies harness/, providers/, scripts/ and skills/: This is the mandatory merge-gate finding. It requires human approval and does not prescribe a content edit, so there is nothing to change in code.
  2. secret-exposure (low, optional): git branch -M runs before the Jira credentials are unset: The reviewer marks this optional and notes the ordering is unchanged from the base; the PR only extends the unset list. Reordering would also require rebuilding the bundled post-code.sh and is outside the scope of this PR.
  3. breaking-config / backward-incompatible: FULLSEND_DIR, optional email and renamed FULLSEND_JIRA_ wiring for custom harnesses*: The reviewer marks these as unchanged since the prior review, and the PR already declares them as breaking changes (the ! marker and migration notes). No code change was requested.

Tests: passed

CI inspections (8):

  1. script-test (pr-related, failure): Four skill auth checks failed because the tests still expected the old email expressions after the PR switched the skills to a trimmed local email variable. Updated the assertions and the skill-local variable allowlist; the full script-test suite could not run locally because yq is unavailable.
  2. skillsaw (pr-related, failure): The code-implementation skill exceeded its baselined context-budget ceiling by a few tokens after this PR's additions. Trimmed a redundant parenthetical; local skillsaw lint now reports zero errors.
  3. test (passing, success)
  4. commit-lint (passing, success)
  5. functional-tests (code) (passing, success)
  6. functional-tests (triage) (passing, success)
  7. behaviour (passing, success)
  8. DCO (passing, success)

Conflict update: skipped; strategy none; forge MERGEABLE; target main

Next steps:

  • /fs-review — request a re-review of the changes
  • /fs-fix <your instruction> — run another fix pass with specific guidance
  • Push commits directly — review re-runs automatically on push
    Updated by fullsend fix agent

fullsend-ai-coder Bot added a commit that referenced this pull request Nov 6, 2026
Assert the normalized JIRA_EMAIL selection lines in the skill checks of
harness-jira-test.sh and sandbox-credential-boundary-test.sh, and exempt
the skill-local JIRA_EMAIL from the env reachability check.

Addresses #1914

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fullsend-ai-coder Bot added a commit that referenced this pull request Nov 6, 2026
The Jira auth selection lines grew the skill past its baselined
context-budget ceiling; drop the redundant placeholder parenthetical
(the placeholder behavior is documented in the jira-forge skill).

Addresses #1914

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:32 PM UTC · Completed 10:41 PM UTC

Commit: cef2264 · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $1.89

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-coder

fullsend-ai-coder Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 10:44 PM UTC · Completed 10:47 PM UTC

Commit: cef2264 · View workflow run →

Runtime: claude · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $0.24

@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 4 (bot-triggered)

No code changes were needed. Both blocking prior findings are already resolved or were reclassified as non-actionable, and the remaining findings are informational. Project CI on the current head is passing.

Disagreed (5):

  1. Blocking prior finding: JIRA_EMAIL missing from SKILL_LOCAL_VARS in scripts/skill-env-reachability-test.sh: Already resolved on the current head: JIRA_EMAIL is listed in SKILL_LOCAL_VARS, the review's own 'Earlier findings' section marks it resolved, and the script-test CI job passes. No change needed.
  2. Blocking prior finding: secret-exposure in scripts/post-code.src.sh (credentials readable via /proc by repo hooks): The review reclassified this to low and non-actionable. The /proc caveat is documented in the code comment, predates this PR, and this PR only extends the unset list to cover the FULLSEND_JIRA_* names. A proper fix would need a separate trusted process boundary, which is out of scope here.
  3. Low: forge_create_issue requires FULLSEND_DIR, and auth mode depends on JIRA_USER_EMAIL (scripts/lib/jira-scribe-ops.lib.sh): Non-actionable informational findings. The behavior is intentional and declared as a breaking change in the PR; no remediation is requested.
  4. Low: triage overlay now reads FULLSEND_JIRA_TOKEN/FULLSEND_JIRA_EMAIL and FULLSEND_DIR (harness/triage.yaml): Non-actionable informational finding. This is the intended, declared breaking change for the PR.
  5. Medium: protected-path modifications require human approval: This is the mandatory merge-gate finding. It asks for human approval, not a content edit, so there is nothing for the fix agent to change.

Tests: passed

CI inspections (7):

  1. test (passing, success): Passing on current head.
  2. commit-lint (passing, success): Passing on current head.
  3. skillsaw (passing, success): Passing on current head.
  4. script-test (passing, success): Passing on current head.
  5. functional-tests-complete (passing, success): Functional tests passing.
  6. behaviour (passing, success): Behaviour tests passing.
  7. DCO (passing, success): DCO check passing.

Conflict update: skipped; strategy none; forge MERGEABLE; target main

Next steps:

  • /fs-review — request a re-review of the changes
  • /fs-fix <your instruction> — run another fix pass with specific guidance
  • Push commits directly — review re-runs automatically on push
    Updated by fullsend fix agent

@fullsend-ai-coder fullsend-ai-coder Bot added the needs-human Agent loop needs human intervention label Nov 6, 2026
@ggallen

ggallen commented Nov 6, 2026

Copy link
Copy Markdown
Member

/fs-fix
Address the remaining review findings on this PR:

  1. Make the Jira scribe preflight fail before the agent runs when FULLSEND_DIR is missing. Add a regression test.
  2. Update the minimum Fullsend CLI requirement in docs/scribe.md (and docs/triage.md and docs/code.md where relevant) to require the config-backed Jira commands from Fullsend #9078, not the older #8499 reference.
  3. Rework scripts/post-code.src.sh so repo-controlled Git hooks cannot access Jira credentials during branch renaming or through /proc/$PPID/environ. Do not rely on unsetting credentials after hooks run; pass them only to the trusted Jira-write step after hook execution.

Rebuild the generated script bundles and run the relevant script tests. Reply to and resolve the corresponding review threads once each finding is fixed.

Rebase and squash commits.

@fullsend-ai-coder

fullsend-ai-coder Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 11:06 PM UTC · Completed 11:17 PM UTC

Commit: cef2264 · View workflow run →

Runtime: claude · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $1.54

The Jira agents required JIRA_USER_EMAIL and always used Basic auth,
and their `fullsend issues` calls used --jira-url/--jira-email flags
that the config-backed CLI (fullsend#9078) no longer accepts. Per
fullsend#9007, an email selects bot-user Basic auth and its absence
selects service-account Bearer auth.

- New scripts/lib/jira-auth.lib.sh picks the mode: a non-empty email
  means Basic (curl --user), otherwise Bearer (curl --oauth2-bearer).
  An empty or blank email counts as absent. It also runs the fullsend
  CLI with FULLSEND_JIRA_TOKEN, and FULLSEND_JIRA_EMAIL only when an
  email is set (an inherited one is dropped in Bearer mode).
- Triage and scribe Jira libs and post-code use the helper. The token
  stays required, the email is optional, and REST calls still go to
  JIRA_API_URL in both modes. CLI calls pass --fullsend-dir so the
  CLI reads tracker.jira from config.yaml.
- Triage and code harness Jira overlays map JIRA_TOKEN and
  JIRA_USER_EMAIL from the FULLSEND_JIRA_TOKEN and optional
  FULLSEND_JIRA_EMAIL secrets in env.runner (fullsend#9079), and set
  FULLSEND_DIR. JIRA_USER_EMAIL now reaches the sandbox only through
  the expanded env/jira host files, so an unset email no longer
  fails the run.
- Jira skills select Basic or Bearer from JIRA_USER_EMAIL with
  tirith-parseable plain variables, normalizing a whitespace-only
  email to Bearer. fullsend refuses FULLSEND_JIRA_* in provider
  credentials, so the jira-ro provider keeps reading JIRA_TOKEN; a
  comment records why. The code-implementation skill is trimmed to stay
  under its skillsaw ceiling.
- Review feedback: post-code.sh now moves the Jira credentials out of
  its environment before it runs any git command, by re-executing
  itself with them removed and holding them only in shell variables.
  Repo-controlled hooks (pre-commit, pre-push, and the
  reference-transaction hook that `git branch -M` fires when the agent
  branch is renamed) can no longer read them from their environment or
  from a parent's /proc/<pid>/environ. Only the Jira stage update
  receives them. The FULLSEND_JIRA_* names are withheld too.
- Review feedback: pre-scribe.sh fails before the agent runs when
  FULLSEND_TRACKER=jira and FULLSEND_DIR is unset, instead of failing
  in post-scribe.sh. The scribe, triage and code docs and the CLI
  preflight message now name fullsend#9078 (config-backed Jira
  commands) as the minimum CLI requirement, not fullsend#8499.
- Bundles rebuilt. Tests cover Basic, Bearer, unset/empty/blank email,
  the JIRA_API_URL path in Bearer mode, the CLI env and --fullsend-dir,
  missing FULLSEND_DIR in post-scribe and pre-scribe, hook and
  /proc-environ credential hiding including the branch-rename hook,
  and the harness mappings and sandbox boundary.

Verification: pre-commit could not fetch hook repos (TLS error in the
sandbox), and shellcheck and yq are not installed, so shellcheck and
the yq-based tests (harness-jira, sandbox-credential-boundary,
skill-env-reachability, post-triage) could not run here. Bundles were
checked against bundle-sh.sh output, bash -n passed, hack/lint-agent-docs
passed, and gitleaks ran via scan-secrets. post-code-test.sh has three
failures (signed-commits harness checks) that also fail on origin/main.

BREAKING CHANGE: the triage and code Jira overlays now read the host
credentials from FULLSEND_JIRA_TOKEN and optional FULLSEND_JIRA_EMAIL
instead of JIRA_TOKEN and JIRA_USER_EMAIL, and the Jira scripts need
FULLSEND_DIR for the config-backed fullsend CLI. Custom scribe
harnesses on Jira must add FULLSEND_DIR to env.runner.

Closes #1900
Addresses #1914

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fullsend-ai-coder
fullsend-ai-coder Bot force-pushed the agent/1900-jira-bot-service-account-auth branch from cef2264 to b4aef6e Compare November 6, 2026 23:17
@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 4 (human-triggered)

Addressed all three findings (pre-scribe FULLSEND_DIR preflight, #9078 minimum CLI in docs and messages, post-code Jira credential isolation incl. branch rename and /proc), rebuilt bundles, rebased onto main and squashed to one commit. Could not reply to or resolve review threads (not permitted for this agent). Not run in this sandbox: pre-commit (TLS), shellcheck and the yq-based tests (yq missing). post-code-test has 3 signed-commits failures that also fail on origin/main.

Fixed (5):

  1. Jira scribe preflight must fail before the agent runs when FULLSEND_DIR is missing (scripts/pre-scribe.src.sh): pre-scribe now exits with an error when FULLSEND_TRACKER=jira and FULLSEND_DIR is unset, before any network call or workspace setup. Added a regression test that runs the script without FULLSEND_DIR and asserts the error, no curl/gh calls and no workspace; the existing full-script Jira test now sets FULLSEND_DIR. Bundles rebuilt.
  2. Update minimum Fullsend CLI requirement to the config-backed Jira commands (#9078), not #8499 (docs/scribe.md): docs/scribe.md now names fullsend#9078 and the FULLSEND_DIR/tracker.jira requirement; docs/triage.md and docs/code.md gained the same minimum-CLI statement. The scribe lib comment and the CLI preflight error message also reference #9078 instead of #8499.
  3. Repo-controlled Git hooks must not reach Jira credentials during branch renaming or via /proc/$PPID/environ (scripts/post-code.src.sh): The credentials were only unset after the branch rename, so a hook fired by git branch -M inherited them, and the initial environment stayed readable via /proc. post-code now re-executes itself at the very start with JIRA_TOKEN, JIRA_USER_EMAIL and the FULLSEND_JIRA_* names removed from the environment, handing them over through an unlinked private file that the new process reads into shell variables and closes immediately, before any git command. They are passed only to the Jira stage update after hook execution. Added a branch-rename (reference-transaction) hook test and extended the pre-push test to check the parent and grandparent /proc environ; both fail on the old code and pass now. Bundles rebuilt.
  4. Rebase onto main and squash the PR into one commit: Rebased the 4 PR commits onto origin/main (89b7b5d) without conflicts, then folded this run fixes and the PR into a single commit between origin/main and HEAD, with a message covering the whole PR.
  5. PR description is stale after the new credential isolation, preflight and test changes: Proposed an updated PR body covering the pre-scribe preflight, post-code credential isolation, minimum CLI version and the current test status.

Disagreed (1):

  1. Reply to and resolve the corresponding review threads once each finding is fixed: The fix agent cannot post comments or resolve threads; the post-script summary comment reports the outcome and a human or workflow can resolve the threads.

Tests: passed

CI inspections (5):

  1. test (passing, SUCCESS): Passed on the previous head; not re-evaluated for the squashed commit.
  2. script-test (passing, SUCCESS): Passed on the previous head.
  3. skillsaw (passing, SUCCESS): Passed on the previous head.
  4. commit-lint (passing, SUCCESS): Passed on the previous head.
  5. DCO (passing, SUCCESS): Passed on the previous head.

Conflict update: skipped; strategy none; forge UNKNOWN; target main@89b7b5d4fb6cb74f866cb5d9aeda7b2b4635886d

Decision points
  • How to keep the Jira credentials from hooks (alternatives: Only move the existing unset before the branch rename, Re-exec with a clean environment and hand the credentials over via a short-lived unlinked file; rationale: Moving the unset leaves the credentials in the script process initial environment, readable via /proc//environ by hooks that walk parent processes; re-exec removes them from every environment and file a hook could read, at the cost of a small re-exec block. A same-user process that can ptrace the script is out of scope.)

PR metadata: body updated

Next steps:

  • /fs-review — request a re-review of the changes
  • /fs-fix <your instruction> — run another fix pass with specific guidance
  • Push commits directly — review re-runs automatically on push
    Updated by fullsend fix agent

@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 11:18 PM UTC · Completed 11:36 PM UTC

Commit: b4aef6e · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $4.41

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-coder

fullsend-ai-coder Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 11:38 PM UTC · Completed 11:41 PM UTC

Commit: b4aef6e · View workflow run →

Runtime: claude · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $0.31

…ra auth

Address review feedback on #1914: add FULLSEND_DIR to the scribe CI
credential steps and examples, note the JIRA_TOKEN secret requirement for
the sandbox jira-ro provider in docs/code.md, export FULLSEND_DIR in the
LOCAL.md Jira snippets, and correct the FULLSEND_DIR description in
docs/triage.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 2 (bot-triggered)

Fixed the four documentation findings (FULLSEND_DIR in scribe docs and LOCAL.md, JIRA_TOKEN requirement in code docs, FULLSEND_DIR description in triage docs). The protected-path finding needs human approval and the residual secret-exposure note is informational, so neither was changed.

Fixed (4):

  1. scribe.md omits FULLSEND_DIR from CI credential steps (docs/scribe.md): Added FULLSEND_DIR to the variable list, the GitHub Actions env example (github.workspace) and the GitLab steps, noting pre-scribe.sh fails when it is unset.
  2. code.md lacks JIRA_TOKEN requirement for sandbox jira-ro (docs/code.md): Added to the Jira results section that the JIRA_TOKEN secret must still be configured for sandbox reads because the provider cannot expand FULLSEND_JIRA_*, linking docs/triage.md.
  3. LOCAL.md Jira snippets never export FULLSEND_DIR (LOCAL.md): Added an export of FULLSEND_DIR to both the Jira triage and Jira code snippets.
  4. triage.md says the harness sets FULLSEND_DIR (docs/triage.md): Reworded: the harness passes FULLSEND_DIR through from the host environment, so the operator must set it.

Disagreed (2):

  1. Protected-path changes need human approval: This is the mandatory merge-gate finding and prescribes no content edit; it requires human approval, so the paths are left unchanged.
  2. Residual Jira credential exposure after re-exec in post-code: Informational and non-actionable: the reviewer confirms the earlier concern is resolved and the remaining limits (process memory, ancestor processes, ptrace) are already documented in the code comment.

Tests: passed

CI inspections (4):

  1. script-test (passing, success): Passed on the previous head.
  2. skillsaw (passing, success): Passed on the previous head.
  3. commit-lint (passing, success): Passed on the previous head.
  4. test (passing, success): Passed on the previous head.

Conflict update: skipped; strategy none; forge MERGEABLE; target main@56cd8c1fa81b5d3028a9798511c08eb190086f1a

Next steps:

  • /fs-review — request a re-review of the changes
  • /fs-fix <your instruction> — run another fix pass with specific guidance
  • Push commits directly — review re-runs automatically on push
    Updated by fullsend fix agent

@fullsend-ai-review

fullsend-ai-review Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ❌ Failure (validation failed after 1 iteration(s)) · Started 11:43 PM UTC · Completed 12:05 AM UTC

Commit: 5b7525c · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $0.56

@ggallen

ggallen commented Nov 7, 2026

Copy link
Copy Markdown
Member

/fs-review

@fullsend-ai-review

fullsend-ai-review Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:49 AM UTC · Completed 12:59 AM UTC

Commit: 5b7525c · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5-5 · Effort: high · Cost: $2.03

@fullsend-ai-review
fullsend-ai-review Bot dismissed stale reviews from themself November 7, 2026 00:59

Superseded by updated review

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Nov 7, 2026
@ggallen
ggallen added this pull request to the merge queue Nov 7, 2026
Merged via the queue into main with commit 5b3049b Nov 7, 2026
70 of 75 checks passed
@ggallen
ggallen deleted the agent/1900-jira-bot-service-account-auth branch November 7, 2026 01:20

This branch was previously deployed

1 inactive deployment
dev — 5b7525c9 Deployed Nov 6, 2026 by fullsend-ai-coder[bot] via behaviour #1800
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request needs-human Agent loop needs human intervention ready-for-review Triggers review agent dispatch requires-manual-review Review requires human judgment risk/moderate PR risk: moderate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Jira agents: support bot and service-account authentication

1 participant