LT-22723: Agent skills for filing Jira issues and writing PR bodies - #1100
LT-22723: Agent skills for filing Jira issues and writing PR bodies#1100johnml1135 wants to merge 14 commits into
Conversation
Agent-authored LT tickets put good analysis in the wrong shape. The reference failure opens with a heading, runs past a thousand words, and states that it contains four separate user-visible problems, so a triager scanning a queue cannot act on it. Jira Data Center has no expand macro, so nothing in a description can be folded away. The skill keeps the description short and moves the depth into the first comment. The skill interviews for who, when, where and how under a cap of six questions, hunts duplicates before drafting rather than before posting, and gets a three-line lede approved before anything else is written. Unknowns are recorded rather than guessed, and nothing enters a description that the reporter did not say or that we did not verify. compact-style.md is a shared reference adapting the MIT-licensed i-have-adhd skill from chat turns to written artifacts. pr-pitch now points at it and gains a Start here line, numbered verification steps, a closing Next line, an optional status line for long-lived PRs, and the pre-send check. jira-bugfix gains the LT-XXXXX-short-slug branch convention, a relaxed worktree rule that asks rather than refuses, and a note that it is entered at Step 3 when jira-issue hands off. Evidence and screenshot handling is deliberately absent; it follows in a stacked branch. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Not every LT ticket is about FLEx the product. One about developer tooling, an agent skill, the build or documentation has no FLEx version, no project file, no menu path and nothing to reproduce inside the application. Phase 0b now decides what kind of thing the ticket is about before the interview starts, and maps that to the environment questions worth asking. Asking which FLEx build was running, for a ticket about a Markdown reference file, spends one of six questions and signals that the ticket was generated rather than written. The output rule is the same: never emit a section that does not apply. A template dutifully filled with N/A costs the reader the same scan and returns nothing, so the heading goes instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The design document was a working artifact, not something a future maintainer needs in order to change this code correctly. Under the pr-pitch triage it is RESEARCH: a one-time investigation whose conclusions are now carried by the skill itself. Its content survives in the pull request body, where the decisions, the rejected alternatives and the reasoning stay recoverable without shipping scaffolding into the repository. Refs LT-22723 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every new LT ticket carries Affects Version FW 9.3, with no exception. It is a filing convention that keeps the queue filterable rather than a claim about which build the reporter was running, so the Phase 0b relevance rule does not exempt a tooling, build or documentation ticket from it. A specific point release the reporter names is added alongside FW 9.3, never in place of it. Neither jira_create_issue nor jira_update_issue exposes the versions field, so it goes through custom_fields. The same applies to assignee, which those helpers send as a Cloud-style accountId that SIL's Data Center rejects; both fallbacks are now written down where the publish step needs them. Refs LT-22723 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The example carried placeholder keys for the four symptom tickets that splitting LT-22715 would create. Those tickets now exist, filed on 2026-08-21 as LT-22724 through LT-22727 and linked back with Issue split, so the example names them. A worked example that cites real tickets can be checked by a reader. One that cites LT-AAAAA cannot, and quietly invites the reader to treat the whole example as hypothetical. Refs LT-22715, LT-22723 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
SKILL.md goes from 224 lines to 95. It is the only file loaded every time the skill triggers, so every line it holds is context spent whether or not the reader needs it. Mechanics move to references, which load when the phase that needs them is reached. Moved out: the four duplicate-search passes to a new duplicates.md, the publish calls to publish.md, the relevance table to format.md. What stays is the phase table, the two gates, the budgets and the traps. Recorded from the retroactive rewrite of 28 tickets: - Link types must be read, never guessed. There is no Relates in this Jira, and falling back to the first name in the list produced four bogus Cloners links between a cause ticket and its children. - resolution cannot be set by an update, only by a transition. - The read-only skill's jira_workflow.py and jira_projects.py raise NameError on import; use the atlassian-skills copies. - A private Gmail or Drive URL in a description is broken evidence. - Rewriting a ticket posts the original as a comment first. Task-type tickets gain their own lede labels. Two of the rewritten tickets were Tasks and had to improvise them. Refs LT-22723 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A visible change should ship with a picture, and the repo already has the hard half: headless Skia capture for Avalonia, MCP capture for WinForms, and an Output/ManualEvidence naming convention. What was missing is the last mile -- trimming, captioning, provenance labelling, and any route at all from a PNG to a PR body or a ticket. The rule evidence.md turns on is that the test is the evidence and the screenshot is the courtesy. A control-level headless capture is not a screenshot of the product, and every image now says which it is. Publishing probes three routes and reports the one it used: native gh attach once it ships, gh image where a session cookie is reachable, and an orphan evidence branch with sha-pinned raw URLs otherwise. Only the third works under an Actions token, which is why it stays. jira_add_attachment uploads to Jira. It drives client.session directly because AtlassianClient.post sends JSON only, while multipart needs the XSRF header and no Content-Type. Its validation paths are exercised; the upload path has not yet been run against a live issue. A screenshot of a live project is a data disclosure exactly as a project file is, so the permission gate covers both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
evidence.md sits in .claude/references/ and pointed at fieldworks-avalonia-ui/references/visual-snapshot-testing.md as if it were a sibling. The file is under .claude/skills/, so the pointer resolved from nowhere. Made absolute from the repo root. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7c5c41a to
63d4d33
Compare
The third upload route proposed creating a never-merged orphan branch to host screenshots and referencing them by sha-pinned raw URL. It was speculative, nothing had been built, and it solved a problem lasting one review by putting binaries in history permanently. Route three is now the honest one: when no upload path is available, say which was tried and hand the file to the author to drag in. The skill also states plainly that images are not committed to the repository and no side branch is created to host them. Refs LT-22723
jira-bugfix, pr-preflight and pr-pitch drop from 1107 lines to 374, about two thirds. A SKILL.md is loaded whole every time its skill triggers, so every line it holds is context spent whether the reader needs it or not. Procedure that only one phase needs now lives in a reference that loads when that phase is reached. Moved out: the review-summary template, the accordion catalogue, and the publish-and-verify mechanics. Deduplicated rather than shortened in place. jira-bugfix carried its own copy of the JIRA API calls, the assignee and version workarounds, and the transition rules; it now points at the jira-issue skill's publish.md. It also delegates commit messages, PR creation and test coverage to the skills that own them instead of restating them. Nothing about the guidance changed. The pitch structure, the triage buckets, the four analysis passes, the interview discipline and every gate survive verbatim or tightened. Refs LT-22723 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63d4d33 to
68e01e7
Compare
Nine cross-references in the Avalonia migration and WinApp skills were written relative to the skill root while the citing file lives inside references/, so they resolved to references/references/<name>.md and pointed at nothing. Every target exists; only the paths were wrong. Seven become plain sibling names, which is what a file inside references/ needs to reach the file next to it. Two genuinely cross skill boundaries and become repo-root paths: winforms-avalonia-parity cites parity-evidence in the migration skill, and architecture-patterns cites style-system in the Avalonia UI skill. Nothing else changed. No prose, no guidance, no file moved or renamed. Verified by resolving every reference in every .claude markdown file from the directory it is written in: nine dangling before, none after. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jasonleenaylor
left a comment
There was a problem hiding this comment.
The best part of this branch is the deduplication: jira-bugfix stops carrying its own copy
of the Jira API procedure and delegates commits to commit-messages, PR bodies to
pr-preflight, and coverage to fieldworks-test-coverage, with an explicit "Never
hand-write a PR body". pr-preflight and pr-pitch are extended in place rather than forked.
compact-style.md is one file with two consumers instead of a copy. That is the right shape.
Two other things worth saying before the list. Deleting the stray ```skill fence at
the top of jira-bugfix/SKILL.md is a real defect fix — that fence makes the frontmatter
unparseable, which is why the skill currently advertises itself in the loaded skill list with
the description "```skill". And the security guidance in .claude/references/evidence.md:68-78
is genuinely good: naming the `user_session` cookie as full-account access that bypasses 2FA,
forbidding `gh image extract-token` in an agent session because stdout becomes context, and
requiring the developer to set the token in their own shell rather than paste it into a prompt.
That is the right instinct written down correctly.
1. Fix the Optional import; do not route Jira reads through the write-capable scripts.
jira-issue/references/publish.md:74-79 and SKILL.md:63-65 tell every agent to use the
atlassian-skills copies of jira_workflow.py and jira_projects.py "for reads as well as
writes, until the read-only ones are fixed."
The bug is real:
atlassian-skills/scripts/jira_workflow.py:12 from typing import Any, Dict, Optional
atlassian-readonly-skills/scripts/jira_workflow.py:11 from typing import Any, Dict
atlassian-skills/scripts/jira_projects.py:14 from typing import Any, Dict, Optional
atlassian-readonly-skills/scripts/jira_projects.py:13 from typing import Any, Dict
The fix is , Optional on two lines, in this repo. What is shipping instead is a standing
instruction, in an always-loaded skill, to perform reads with the script set that can create,
update, delete and transition — and it contradicts three places, none of which this PR updates:
AGENTS.md:59— forLT-tickets use.claude/skills/atlassian-readonly-skills/scripts.atlassian-skills/SKILL.md:23— "Default toatlassian-readonly-skillsfor read operations.
Use this full skill set only when the user explicitly requests create/update/delete."Docs/workflows/ai-pr-workflow.md:45— same read-only invocation.
This is not a credential leak, but it is a permanent widening of blast radius adopted as a side
effect of not fixing a typo. Please add the import and delete the workaround sections; the
AGENTS.md conflict disappears with them, and the change is smaller than the workaround it
replaces.
Note the scope is narrower than the workaround implies — only those two scripts are affected.
Reads through the other read-only scripts work today.
2. Restore the dropped anti-fabrication rule.
The pre-compression pr-preflight/SKILL.md opened Setup with: "Determine the review model
name. Use GitHub Copilot when running in Copilot. Do not invent AI co-author trailers."
Neither half survives. Searching the branch's pr-preflight/SKILL.md for
co-author|trailer|Review model returns zero matches, while
pr-preflight/references/summary-template.md:11 still requires a **Review model**: <model name> field. So the agent is asked to fill in a field it is no longer told how to determine,
and the sentence forbidding it to invent attribution is gone.
That is the half worth keeping most: it exists precisely to stop a fabricated author line.
Please restore it.
Worth knowing for its own sake: the "14/14 rules survived" check could not have caught this,
because the rule's distinctive phrase was not on the grep checklist. A read of the deletions is
the only thing that finds a rule that vanished rather than moved.
3. The worktree path is wrong in two places.
jira-bugfix/SKILL.md:83-85 says worktrees on disk are under .tmp/worktrees/, and
publish.md:106 repeats it in the example ticket comment
(`.tmp/worktrees/nc-delete-warning`).
git worktree list shows thirteen worktrees, all under .claude/worktrees/. There is no
.tmp at the repo root. The ../<repo>.worktrees/ half is right and matches
scripts/Worktree-CreateFromBranch.ps1:5,119; the "what is already there" half is invented,
so an agent told to match it creates worktrees at a path that does not exist.
Please correct both. Worth noting where this bites: worktrees live under .claude/worktrees/
deliberately, because the FwBuildTasks bootstrap fails on paths containing spaces.
This is also the rule this branch introduces failing on its own first outing — pr-pitch
Phase 2 says to verify every concrete noun a DURABLE file names, and its checklist says every
name in the body must resolve in the current tree.
4. The body breaks two rules this PR introduces.
pr-pitch/SKILL.md:78 — "200-400 words, fitting one screen without scrolling. That is
binding, not a target," followed by "Word-count before publishing. Over 400, cut — do not
rationalize."
This body breaks both:
- The budget. Everything above the first
---measures 490 words, against a ceiling the
same branch calls binding. - The no-rationalizing rule. The framing paragraph — "why does a set of writing-style
skills need 1,500 lines?" — is an argument for why the length is justified, written into the
body by the branch that forbids exactly that move.
Either the body comes under the budget or the rule is softened, but the two need to agree. A
process PR that does not follow its own process is the first thing anyone asked to adopt the
process will point at.
The accordions themselves are fine — this is a genuinely large multi-part branch, which is when
they are warranted. The one I would cut is the licence-provenance accordion, which already
appears verbatim at compact-style.md:9-12.
5. pr-pitch contradicts its own checklist about **Start here:**.
pr-pitch/SKILL.md:103 places **Start here:** inside section 3 ("Where to look"), the third
of six sections. pr-pitch/references/publishing.md:51 checks that the body "opens with
**Start here:**". Those cannot both be satisfied.
Please decide which is intended and update the other file to match. This PR's own body is the
evidence that the ambiguity bites: it puts **Start here:** in the fourth paragraph, so read
literally it fails its own published checklist — the third way this body does not satisfy the
rules the branch adds.
6. "Gates" — please use "check" or "checkpoint".
jira-issue/SKILL.md:32 ("## The two gates"), :39, and the PR body ("Two gates block
publishing"). This is a standing preference for newly written prose across the repo rather than
a note specific to this branch, so it is worth adopting in new skill files generally — "## The
two checks" loses nothing.
7. Two small things in the new skill.
publish.md:44hardcodes a real colleague's Jira username (John_Lambert) in the worked
example. Use<username>— the skill already storesjiraUsernamein
.claude/.jira-issue-prefs.json, so the placeholder has somewhere real to resolve from, and
a template gets copied.jira-issue/SKILL.md:43andreferences/format.mdhardcode Affects VersionFW 9.3as an
absolute rule with no pointer to where it is bumped. The repo is on 9.3.12 today; this goes
stale at 9.4 with nothing to catch it. Either point at the source of truth or say how it is
maintained.
This review was assisted by Claude Fable 5.
Review of this PR raised seven items. Six were confirmed against the tree and are fixed here; the seventh was backwards and is answered instead. jira_workflow.py and jira_projects.py under atlassian-readonly-skills were missing two names their own signatures use, Optional and AtlassianCredentials, so both raised NameError on import. The class is already defined in the read-only _common.py -- the vendoring generator dropped it from each module's import list. Both now import, and were run against live Jira. The workaround telling jira-issue to route around them is deleted: it contradicted AGENTS.md, which names the read-only scripts as the route for reads. Ten further read-only modules still fail to import, from the same generator bug plus a relative-import class in the bitbucket ones. They are left to the Atlassian transport PR that this branch already defers to. Also: pr-preflight names the review model again, so the summary template's field has an owner, and is told never to invent a co-author trailer; pr-pitch hoists the Start here line to the top of the body, where its own checklist already required it; jira-issue counts three gates rather than two, because Phase 5 permission is equally a hard stop; and the assignee username and Affects Version are derived from the prefs file and Src/MasterVersionInfo.txt rather than frozen as one developer's name and one release. Worktree paths in jira-bugfix and dependabot-consolidation now point at Worktree-CreateFromBranch.ps1 instead of naming a directory. The review placed worktrees under .claude/worktrees; that path does not exist, and all twelve on disk are under .tmp/worktrees, so no fixed path written here stays true.
|
Six of the seven confirmed and fixed in 1. The broken imports — right diagnosis, wrong scopeYou were right that the workaround should not exist and that the fix is the
Twelve of sixteen fail to import. Only
I fixed the two you named — both now import, and I did not fix the other ten, and I want that decision visible rather than 3. Backwards — worktrees are not where you say
So there were three candidate paths and the docs named two of them, neither 2, 5, 6, 7 — all confirmed
4. Body cut to 396 wordsWas 490 against a 400 ceiling my own skill sets. Gone: the "why does a set of Verification
One thing I nearly shipped: |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1100 +/- ##
==========================================
+ Coverage 38.33% 38.35% +0.01%
==========================================
Files 1507 1507
Lines 350580 350634 +54
Branches 40293 40304 +11
==========================================
+ Hits 134410 134499 +89
+ Misses 186941 186902 -39
- Partials 29229 29233 +4 🚀 New features to boost your workflow:
|
The previous commit fixed the two modules a skill documented a workaround for. Checking the rest found twelve of sixteen read-only modules failing to import, so this finishes the job and records where the breakage came from. It came from us. Upstream langpingxue/atlassian-skills is correct: its read-only jira_workflow.py imports both Optional and AtlassianCredentials. Our copies arrived in one commit, d1a9bc6 (PR #935), with names deleted from the import lists -- the signature of an automated unused-import pass that did not understand names used only inside annotations. Nine modules lost AtlassianCredentials, five also lost Optional, and jira_projects.py lost NotFoundError, which import alone does not catch because it is raised inside a function body. Eight modules are restored to upstream's imports verbatim; the diff against upstream is now empty for all of them. The four bitbucket modules are a different defect, and this one is upstream's: they use "from ._common import", a relative import, in both variants. That can never resolve under the invocation every SKILL.md documents, which inserts the scripts directory on sys.path and imports the module directly. They now use the absolute import and the path shim that the other fourteen modules already use. This diverges from upstream deliberately, and is worth sending back to them. Verified: all 33 modules across both variants import, pyflakes reports no undefined name in either, and five modules that previously raised NameError on import -- jira_workflow, jira_links, jira_projects, jira_worklog, jira_agile -- were called against live Jira and returned data. Only Jira is configured in this environment, so the Confluence and Bitbucket modules are verified statically rather than end to end. Left alone deliberately: _common.py sets ssl_verify to False where upstream sets True. That is a local change, not vendoring damage, and reverting it without knowing why it was made would break every call this repo makes.
|
Follow-up on item 1: all twelve are fixed in ProvenanceUpstream
Our copies arrived in a single commit, One I had missed: Eight modules are now restored to upstream's imports verbatim. The diff against The bitbucket four are genuinely upstream's bugDifferent cause, and this one is not ours: all four use Verification33/33 modules import across both variants; Two things I did not change, for the author to decide
|
The previous commit repaired all twelve broken modules in both vendored Atlassian variants. That was the wrong call twice over, and this reverts it. PR #1101 is open on branch atlassian-skills-fix and already fixes this. It goes further: it deletes the Bitbucket and Confluence modules outright, reducing both variants to Jira, and adds a PROVENANCE.md to each. Eleven of the fifteen files the previous commit touched are files #1101 removes, so the repair was work against a deletion, and would have conflicted on merge. The stated cause was also wrong. The names were not pruned locally when we vendored. Upstream introduced the bug in cdd1823f6 (2025-12-20) and fixed it in 0fafb48e7, "Fix missing imports in readonly variant scripts" (2026-02-10). Our copy is byte-identical to the pre-fix upstream state, and d1a9bc6 vendored it in 2026-06-11 -- four months after upstream had fixed it. So this is a stale snapshot, and the correct remedy is a re-sync from upstream rather than hand-patching, which is close to what #1101 does. Kept from the reverted commit: one line in the read-only jira_projects.py, which also lost NotFoundError. It is raised at :179, inside a function body, so importing the module successfully does not prove it works -- and this branch does claim to fix that module, because it deletes the documented workaround for it. The other fourteen files are back to their vendored state. This branch now touches exactly two vendored files, jira_workflow.py and jira_projects.py, which is the minimum for deleting a workaround that named them. Those two lines overlap #1101; whichever merges second takes a two-line conflict.
|
Retracting my previous comment. Two of its claims were wrong, and the It is not our bug, and it is already being fixedI said the missing imports were pruned locally when these were vendored, and
Our copy is byte-identical to upstream at Worse: PR #1101 is open and already does this. It reduces both variants to What this branch now touchesTwo vendored files, One line survives the revert: the read-only Still standing from the earlier commentsItems 2, 3, 5, 6 and 7, and the body cut, are unaffected — none of them touch Two observations for #1101 rather than here, since that PR owns these files:
|
Start here:
.claude/skills/jira-issue/SKILL.md— 95 lines, the whole design. The sixreferences/files are detail it delegates to.Filing an LT ticket with an agent now goes through a skill instead of improvisation, and the three existing skills lost two thirds of their bulk without losing a rule.
/jira-issueinterviews for who/when/where/how, searches for duplicates before drafting, gets a three-line lede approved, caps the description at 250 words, and moves the analysis into the first comment.LT-22723 was filed by the skill itself as the worked example; the 28 tickets before it were rewritten the same way — median description 368 → 140 words, every original preserved verbatim as a comment.
Jira Data Center has no
{expand}macro, so nothing in a description folds away — every budget here serves that constraint. No product code: markdown, plus three.gitignorelines. Net +584, mostly deletion.Where to look:
compact-style.mdis shared, not copied.pr-pitchreads the same file, so ticket and PR style cannot drift apart.jira-bugfixcarried its own copy of the JIRA calls,custom_fieldsworkarounds and transition rules; it now points atpublish.md. Read the diff for deleted duplication, not for changed rules — a rule that changed meaning is a bug.jira_add_attachmentis proven against live Jira (LT-22723, attachment 154621).references/.Deliberately not here: the Atlassian transport skills — that is #1101, already open, which reduces both variants to Jira and fixes their broken modules. This branch touches two of their files only, because it deletes a workaround that named them.
Verification:
gitlintclean on 12 commits. 39/39 key rules survive compression, checked by grep. Every.mdreference in.clauderesolves from where it is written — nine dangling before, zero after. The two vendored modules this branch repairs were imported and called against live Jira. Nothing compiled changed, so nobuild.ps1; whitespace was verified by hand, becausecheck-and-fix-whitespace.ps1errors on a clean branch.Next: review, or tell me to split the compression commits out of the new-skill commits.
Reading this a year from now — start here
This began as four separate PRs — the new skill, the evidence framework, the compression pass, and a reference-path fix — stacked in that order. They were consolidated because they are one story told in four parts, and because the alternative was asking a reviewer to hold four bases in their head. All eleven commits survive, so the original boundaries are still there in
git log.The design was written as a document in
Docs/workflows/and deliberately deleted before merge; it was working scaffolding, not something anyone needs in order to change this code correctly. What follows is that record.What was measured, before and after
jira-bugfix/SKILL.mdpr-pitch/SKILL.mdpr-preflight/SKILL.mdjira-issue/SKILL.mdA
SKILL.mdis loaded whole every time its skill triggers, so every line it holds is context spent whether the reader needs it or not. Procedure only one phase needs now lives in a reference that loads when that phase is reached.The 28 rewritten tickets: median 368 → 140 words, longest 1,255 → 271, two still over the 250 budget and justified (LT-22709's acceptance-test steps are the deliverable; LT-22715 carries a cause plus four children plus three options).
Decisions, and why
Search before drafting, not before posting. If the ticket already exists, the work is a comment on it. Discovering that after twenty minutes of drafting wastes the drafting.
The lede is approved before anything else is written. Every other budget is enforceable by counting; this one is only enforceable by stopping.
"I don't know" is recorded, not resolved. Missing facts become a
*Not known:*line. Nothing enters a description that the reporter did not say or that we did not verify — inferred mechanism goes to the comment, labelled inferred. Fabricated detail in a ticket becomes folklore that outlives the ticket.Affects Version on every new ticket, derived from
Src/MasterVersionInfo.txt, as a filing convention rather than a claim about a build — so the relevance rule that drops FLEx-specific sections from a tooling ticket does not exempt it.Branches are
LT-XXXXX-short-slug. A real session was lost hunting for "the branch for LT-22715" among sixteen descriptively-named worktrees.Preferences are a gitignored file, not agent memory — portable to any agent this repo supports, and per-clone, so one developer's
worktreepreference never becomes another's default.Paths not taken
A second skill pair mirroring
pr-preflight/pr-pitch. Two entrypoints for a workflow that is mostly linear. The PR pair earns its split because the write-up gets re-run on existing PRs; a Jira description is rewritten far less often.Collapsible sections in the description.
{expand}is a Confluence macro, not a Jira one — verified absent before the comment split was designed around it. Had it existed, the whole shape would be different.A standalone
compact-writingskill. A fourth skill in the chain, loadable when nobody asked for it. A reference file that two skills read costs less.An orphan
evidencebranch hosting screenshots behind sha-pinned raw URLs. Cut before review: speculative, unbuilt, and it traded permanent repo weight for a problem that lasts one review. The honest third route is to hand the file to the author.Compressing the Atlassian skills here. They are vendored and need their own review; they are the other PR.
Evidence
The reference failure is real. LT-22715's first rendered line was
h3. The underlying problem, its description ran past a thousand words, and it stated in its own text that it contained "four separate user-visible problems". It has since been split into LT-22724 through LT-22727, linked withIssue split, andreferences/examples.mdcarries the before-and-after.The skill was used to file its own ticket. LT-22723 went through the type check, the relevance check (tooling, so no environment or repro sections), three JQL passes finding no duplicate, developer-approved lede, and publish. 232 words against a 250 budget; summary 60 characters against 80.
Jira API surfaces were read, not guessed.
jira_create_issuesets{'accountId': ...}forassignee, which is Cloud-only — SIL Jira is Data Center and needs{'name': ...}.resolutioncannot be set by an update at all, only by a transition. Both confirmed by hitting them.The compression was verified by grep, not by reading. Distinctive rules from each original — the 200-400 word budget, the triage buckets, "Always trust the written code", the 65,536 cap, the four analysis passes, "Author does not understand", the TDD escape hatch, "never transition to Done" — were checked present in the compressed files. 39 of 39.
One rule was genuinely dropped, deliberately:
jira-bugfix's IDE-Specific Notes, obsolete now thatpr-preflightowns PR creation.This change is