Handover for a separate session that will design a whole release workflow. This is the delta from a day spent shipping two tickets into Raiffeisen 1.9.11.100 and rebuilding the TjK flow — what I learned, what contradicts the current documentation, and the decisions the design session has to make.
Read devel-update-and-release-flow first
It already covers Phases 0–5 (preconditions → devel update → validation → ticket collection → gates → pre-push re-check) in 28K of detail, and it is good. Do not redesign from scratch — extend it. Everything below is either new, or corrects it.
1. The biggest gap: there are TWO release topologies, and only one is documented
devel-update-and-release-flow Phase 4 gate 1 states:
The
chore/...branch is MERGED intocustomization/<partner>via PR. The tag is cut from the customization branch, not from your working branch.
Raiffeisen 1.9.11.100 does not work like that, and it is a live, in-flight release. Verified 2026-08-11:
| Documented (devel-update flow) | Observed (Raiffeisen .100) | |
|---|---|---|
| Integration branch | customization/<partner> | chore/FKITDEV-9156-raiffeisen-release-1.9.11.100 |
| What merges into it | one chore/... devel-update branch | individual feature/fix PRs, retargeted onto it |
| Base | customization/<partner> tip | tag raiffeisen-1.9.11.99 |
| Tag source | the customization branch | unresolved — nothing tagged yet |
| Back-merge | n/a, it is the customization branch | owed and not done |
Concretely: vuer_oss PR #7971 (FKITDEV-8827) and vuer_css PR #3064 (FKITDEV-8787) were both
retargeted off the dead release/FKITDEV-8902-raiffeisen-1.9.11.95 branch and merged into the .100
release branch on 2026-08-10. Neither is on customization/raiffeisen or devel. raiffeisen-1.9.11.100
is not tagged in either repo.
The consequence nobody has hit yet
Any branch cut from
customization/raiffeisentoday silently loses both fixes. The release branch istag .99 + the fixes; the customization branch istag .99. There is no error, no conflict — the work is simply absent.vuer_cssPR #3051 tried to land the 8787 fix oncustomization/raiffeisenand was closed unmerged in favour of the release-branch route, so the fix has no path home yet.
Design question 1: are these two genuinely different flows (a scheduled devel-update release vs. a hotfix/feature release cut from the last tag), or is one of them an accident that should be normalised? If both are legitimate, the workflow needs to say which one applies when, and the back-merge step needs to be an explicit gate, not an assumption.
2. Release trains are per partner, and numbers collide across teams
There is no global release number. On 2026-08-11 Raiffeisen was on 1.9.11.100 while NÚSZ was on 1.9.11.48 and Generali on 1.9.11.19. Any tooling or prompt that carries “the release” as a scalar is wrong.
Worse, numbers get renumbered after the fact: NÚSZ .47 → .48 because another team took .47 for a standalone CRNUSZ-102 release. So a version is not stable until the tag exists.
Rule for any tool: resolve the version from that partner’s own release ticket
(project: <YTPROJECT> Assistance Type: Release, newest open), never from context, a sibling partner, or
a human’s memory. This is baked into /fk-tjk already.
3. “PR merged” is not “code is in the release”
gh pr view --json state returning MERGED tells you nothing about whether the code is on the branch
you are about to tag. Verify by content:
# explicit refspec - these clones have narrowed remote.origin.fetch
git fetch origin "+refs/heads/<release-branch>:refs/remotes/origin/<release-branch>"
git ls-remote origin refs/heads/<release-branch> # cross-check the SHA matches
git grep -n "<a distinctive string from the change>" origin/<release-branch> -- <path>Both today’s changes were confirmed this way — the 8787 self-heal at
server/socket/events/selfservice-v2.js:303-322 and the abort clear at :575, and all three 8827 files
present as blobs. narrowed-fetch-refspec-stale-devel-merge explains why the naive fetch lies.
Design question 2: should the workflow require a content-level assertion per changelog line before the tag is cut? It is cheap and it is the only check that actually proves the release contains what the changelog claims.
4. Ticket state is not maintained, so it cannot be a signal
Both dev tickets were still State: Pending, Blocker: Review Needed, Review: Ready to Review on
2026-08-11 — a full day after their PRs merged. Both partner-side parents (ASSRAFIPI-119, SLARAFIPI-60)
were still Blocked / Release needed. Nobody moved anything.
Related: Bence Varga asked on SLARAFIPI-60 on 2026-07-30 “melyik release-be tud ez belekerülni?” — the answer has been unambiguous since 2026-08-10 (1.9.11.100 / ASSRAFIPI-135) and was never posted.
Design question 3: the workflow needs an explicit “close the loop” phase — move dev tickets, move
partner tickets, answer outstanding partner questions on the SLA/ASS ticket. Today that work is invisible
and therefore never done. Note /fk-tjk is deliberately read-only against YouTrack; if write-back is
wanted, that is a decision, not an oversight.
5. Release tickets are created blank and stay blank
ASSNUSZ-126 (“NÚSZ Release 1.9.11.48”) has TODO in every field — Changelog, Jegyek, GitHub tagek,
Telepítési utasítás. It is the template, unfilled, and it is the current release.
So the release ticket is not a reliable source of scope. Anything that needs the ticket list must
fall back to the dev tickets and git history. release_tickets.py
(Phase 3 — Collect the release tickets) is the right tool for this and
should probably become the thing that populates the release ticket rather than a side report.
By contrast ASSRAFIPI-135 (.100) does have a real 9-line changelog. So it varies per partner/author,
which means the workflow cannot assume either way.
6. Document production is now solved — reuse it, do not redesign it
/fk-tjk was rewritten today into a zero-context flow (historian → partner/base/release → gather →
evidence regeneration → draft → render → tester runbook → hand-off). Full detail:
tesztjegyzokonyv-generation-flow and tesztjegyzokonyv-partner-release-document-structure.
What the release workflow needs to know:
- All partners are standardized on the
release-docshape (decision 2026-08-11), and the newest TjK in~/Downloadsis the authoritative format. Legacy shapes (sablon,.xlsx) survive only aspriorShapeinpartners.json, to warn a customer their format changed. - Build is two mechanical steps, no hand-written code:
append_release_sections.py newdocrebases any partner’s TjK onto a new partner+release, then plain append adds sections from JSON. - Evidence is regenerated, never quoted from old reports — old dev boxes get decommissioned and old
numbers rot. Today both suites and the 8827
.dev-e2e/harness were re-run to produce dated output.
Rebasing one partner's TjK onto another leaks ticket ids
The TOC is a static Word field: it keeps the previous document’s heading text until refreshed. A Raiffeisen→NÚSZ rebase left
ASSRAFIPI-124/SLARAFIPI-59in the TOC — another customer’s ticket ids inside this customer’s document, invisible in the body. The tool now clears the cache and refuses to write if anyASS…/SLA…/CR…/BUG…id from the source survives. Any document-templating step in the release workflow needs the same class of check.
Dependency: the flow reads its base from ~/Downloads. If that directory is tidied, the format source
disappears and it falls back to ticket attachments — which for NÚSZ would find the legacy shape. If the
release workflow is to be robust, the canonical base should move somewhere stable.
7. Delivery is the least-understood phase
Nobody has confirmed whether .100 ships via the modern vuer-release project or the legacy
vuer_build/partner/raiffeisen path. It is recorded as delivery_target: unconfirmed on
raiffeisen-1.9.11.100. The NÚSZ hub shows this materially changes the cut
procedure.
Design question 4: this is the phase with the least written down and the most partner variance (see FKITDEV-8344-vuer-release-migration-batch — six partners were mid-migration between the two). It probably deserves the most attention in the design session.
8. Tooling inventory — what already exists
| Thing | Path | Status |
|---|---|---|
| Devel-update + release flow | devel-update-and-release-flow | good, extend it |
| Release ticket collector | .claude/scripts/release_tickets.py | works; two-bucket output |
| TjK flow | .claude/commands/fk-tjk.md | rewritten 2026-08-11 |
| TjK renderers | .claude/scripts/tjk/{append_release_sections,render_tjk}.py | both --selfcheck clean |
| Partner map | .claude/scripts/tjk/partners.json | 14 partners; priorShape verified for 3 |
| YouTrack read client | .claude/scripts/fkticket/client.py | read-only; _get / fetch_issue / download |
Note /fk-tjk and release_tickets.py both independently work out “what is in this release”. That
overlap is a natural seam for the design session — one collector, two consumers.
9. Environment gotchas that cost time today
- rtk mangles arguments.
git show <rev>:<path>had:server/socket/eaten, producing a bogus “unknown revision”. It also swallows jest--verboseper-test lines entirely. Workarounds: drive git from a pythonsubprocessargs list, and use jest--json --outputFilethen parse. Extends rtk-mangles-curl-and-pipes. - Worktree
node_modulesdrifts from the branch lock. A branch that changedyarn.lockleft the tree unable to run jest (Cannot find module '@babel/plugin-proposal-class-properties'). Fix:yarn install --frozen-lockfilein that worktree before concluding anything about tests. textutilcannot read PDF — it hands back the raw stream and exits 0. Usepdftotext -layout.~/Downloadshas decoys — a 765K CV sits next to the 763K TjK. Match documents by name, never by size or list position.- Docker is OrbStack; the build host is
fk-dev(100.91.108.61) andsshis aliased, socommand ssh.ssh Facekomis dead. See dev-build-host.
10. Suggested shape for the design session
The existing doc ends at “gates”. The missing half is everything after the code is right:
Phase 6 Cut tag both repos; decide the source branch per topology (§1)
Phase 7 Back-merge release branch → customization/<partner> → devel; assert no orphans (§1)
Phase 8 Document TjK + tester runbook; execute the runbook; PDF; attach (§6)
Phase 9 Deliver image build / vuer-release vs vuer_build (§7)
Phase 10 Close move dev + partner tickets, answer open partner questions (§4)
Phases 7 and 10 are the two that are currently done by nobody, and §1 is the ambiguity that has to be resolved before 6 and 7 can be written down at all.
Related
- devel-update-and-release-flow — the existing Phases 0–5, extend rather than replace
- raiffeisen-1.9.11.100 — the live release this was learned on
- tesztjegyzokonyv-generation-flow · tesztjegyzokonyv-partner-release-document-structure
- narrowed-fetch-refspec-stale-devel-merge · rtk-mangles-curl-and-pipes · dev-build-host
- FKITDEV-8344-vuer-release-migration-batch — the vuer-release vs vuer_build split