---
name: lisa-jira-evidence
description: "Upload text evidence to GitHub pr-assets release, update PR description, post JIRA comment with code blocks, and move ticket to the configured review status only when `jira.workflow.review` is set (otherwise leave it in `claimed`). Reusable by any skill that captures evidence and generates evidence/comment.txt + evidence/comment.md."
---

# JIRA Evidence Posting

## Workflow resolution

The post-build review status is read from `.lisa.config.json` `jira.workflow.review` (or `jira.workflow.code_review`). `review` is optional; when unset, the ticket stays in `claimed` until `done` and this skill skips the transition. Never transition to a status that is not named in `config.jira.workflow`. If the configured status is not a valid transition from the current state, log a warning and skip.

```bash
REVIEW=""
if [ -f .lisa.config.json ]; then
  _cfg=$(jq -r '.jira.workflow.review // .jira.workflow.code_review // empty' .lisa.config.json 2>/dev/null)
  [ -n "$_cfg" ] && REVIEW="$_cfg"
fi
if [ -f .lisa.config.local.json ]; then
  _local=$(jq -r '.jira.workflow.review // .jira.workflow.code_review // empty' .lisa.config.local.json 2>/dev/null)
  [ -n "$_local" ] && REVIEW="$_local"
fi
```


Upload captured evidence and generated templates to GitHub PR description and JIRA ticket. This skill is the posting step — it assumes evidence files and comment templates already exist in the evidence directory.

## Arguments

`$ARGUMENTS`: `<TICKET_ID> <EVIDENCE_DIR> <PR_NUMBER>`

- `TICKET_ID` (required): JIRA ticket key (e.g., `PROJ-123`)
- `EVIDENCE_DIR` (required): Directory containing evidence and templates (e.g., `./evidence`)
- `PR_NUMBER` (required): GitHub PR number to update description

## Prerequisites

- `JIRA_API_TOKEN` environment variable set
- a jira-cli config — `.lisa/jira-cli/.config.yml` if the `setup-jira-cli`
  SessionStart hook wrote one, otherwise `~/.config/.jira/.config.yml`. `server`
  and `login` are read from whichever is used, and the fallback is announced on
  stderr rather than taken silently.
- `gh` CLI authenticated
- Evidence directory containing:
  - `NN-name.txt` or `NN-name.json` text evidence files (e.g., `01-health-check.json`)
  - `comment.txt` — JIRA wiki markup (generated by `generate-templates.py`)
  - `comment.md` — GitHub markdown (generated by `generate-templates.py`)

## Comment-body preflight (required)

Before posting or updating anything, check the evidence body (`comment.md`, and `comment.txt` where this skill uses it):

- It contains a `## Not established` heading. That heading is **never omitted and never blank** — when nothing is outstanding it still renders `None outstanding — reviewed`; otherwise it names, in plain operator language, what the verification did not prove.
- The accompanying verdict carries `not_established_reviewed: true` (the list may be empty; the flag may never be omitted).
- It contains a `## Artifact identity` heading carrying **values, not placeholders** — the repository, the `head_sha` the verification observed, the `environment`, and per artifact its `sha256` digest and `captured_at`. **Refuse to post** a body whose identity heading is absent or unpopulated, or whose recorded `artifact_head_sha` disagrees with the verdict's `artifact.head_sha` — report the evidence id and **both SHAs**. Definition: the `claim-evidence-mapping` rule.

If either is missing, **refuse to post**: stop and report the missing Not-established review to the caller instead of publishing. Composing the body is `lisa-tracker-evidence`'s job (see its UI Evidence Checklist); this skill only refuses to publish one that omits the section. The section is defined by the `claim-evidence-mapping` rule and generalizes `lisa-improve-harness`'s required, never-empty `Known limits` field.

## Usage

```bash
bash .claude/skills/jira-evidence/scripts/post-evidence.sh <TICKET_ID> <EVIDENCE_DIR> <PR_NUMBER>
```

### Example

```bash
bash .claude/skills/jira-evidence/scripts/post-evidence.sh PROJ-123 ./evidence 42
```

## What It Does

1. **Read JIRA config** — Resolves the jira-cli config (`$PROJECT_DIR/.lisa/jira-cli/.config.yml` first, then `~/.config/.jira/.config.yml`, announcing the fallback) and reads `server` and `login` from it dynamically — no hardcoded values. Exits 1 naming both paths when neither exists. The same resolved path is then passed to `jira issue move` as `--config`, so the CLI cannot end up on a different config than the one this script parsed.
2. **Upload to GitHub `pr-assets` release** — Uploads evidence files via `gh release upload --clobber`
3. **Update PR description** — Replaces or appends the `## Evidence` section in the PR body
4. **Post JIRA comment** — Posts `comment.txt` as a new comment (wiki markup with code blocks)
5. **Move ticket to the configured review status** — Transitions the JIRA ticket to `$REVIEW` (default: `Code Review`).

## Evidence Naming Convention

Text evidence files are named: `{NN}-{evidence-name}.txt` or `{NN}-{evidence-name}.json`

```text
evidence/
  01-health-check.json          uploaded
  02-schema-after-migration.txt uploaded
  03-rate-limit-response.txt    uploaded
  comment.txt                   used for JIRA comment
  comment.md                    used for PR description
```

## Troubleshooting

### Evidence not appearing in GitHub PR

Evidence files must be in the `pr-assets` GitHub release. If the release does not exist:

```bash
gh release create pr-assets --title "PR Assets" --notes "CDN for PR evidence"
```

### JIRA API returns 403

Ensure `JIRA_API_TOKEN` is set and `login` in the resolved jira-cli config (`.lisa/jira-cli/.config.yml`, else `~/.config/.jira/.config.yml`) matches your Atlassian account email.
