2026-09-08
- SLARAFIPI-84 ROUND 2 — the biggest finding is about our own record: the “final reply” this vault said was SENT was never posted. Re-fetched the thread: 4 comments, the last is Bihari Péter’s 2026-09-04 refutation, ticket State = Blocked — the customer had been waiting 4 days while SLARAFIPI-84 carried a callout reading “This is the text that was sent” above 90 verbatim Hungarian lines. Corrected in place; the block is now labelled an undelivered draft. Round 2 then re-derived all 19 claims at ref
raiffeisen-1.9.11.100=2352f5117ffrom a blob-hash-verifiedgit archive(worktreevuer_oss-rel100is an ancestor of the tag by 6 commits → pin check exit 2), across four lenses (STATIC / ADVERSARIAL / CUSTOMER_DATA / DEPLOYMENT) and all 8 attachments (the.tgzand.xlsxfetched by hand afterextractskipped themskipped-type, exit 0 — second occurrence). Regression check: 5 of our 9 posted 2026-08-31 claims regressed (P2 and P5 outright REFUTED, P4/P6/P7 PARTIAL) ⇒ the reply must open with one concession block. New facts: the debug flagsraiffeisen.debug.cvand.livenessaretrueat the tag (config/docker.json:13-15) — nothing we need is gated off; the three recovery sources (selfService:attachment,selfService:cvTask:log,selfService:v2:config:state) are NOT inENCRYPTED_ACTIVITIES(activity.js:152-163) ⇒ key deletion cannot make them unreadable, retiring the crypto-shred worry; “Auto delete customers” selects only room-less customers (CustomCustomerDeleteService.js:25-31) and deletes no rows; archive / flow-clear / delete-rooms / room-bulk-delete are not registered in their UATvuer_cron.log(a runtime observation, not a repo not-finding);DebugLivenessTaskis v1-only (instantiated only in the v1 init hook,self-service-v2.js:1208,:1269) so v2 sessions log nothing;springCloudConfigServeris configured in NEITHERdocker.jsonNORdev.jsonat the tag ⇒ the “second override path” caveat is retracted for this partner andconfig/local.jsonis the only in-repo mechanism; their effective config isdocker.json+ a hostlocal.json(proved by a Sales Funnel cron that no repo config enables);NODE_ENVwas set (the csv failure itself proves it — unset would have loadeddev.jsonand csv would have worked); and the delivery path is UNVERIFIABLE from the repo (no Dockerfile invuer_oss; image built invuer_docker/vuer_build) ⇒ “Ehhez nem kell release” must not be repeated. The decisive customer-checkable proof: the delivered xlsx’sFace comparison IDcolumn runs 9559 → 10365 with ZERO gaps (807 ids, 807 rows), and 11651’s two comparisons (13:01:47 / 13:02:36) would fall between id 9559 (room 11646, 09:41:29) and 9560 (room 11652, 13:04:19) ⇒ not filtered — never created. Room 11651 precision fixes: window 13:00:34.680–13:02:36.286 (createdAtPrecise), sharpness 37/33 live incvTask:log … messages.details.sharpness, 148702 failed face detection too, and the comparison ran on only 2 of 5 attempts. Fix branchfix/SLARAFIPI-84-facecomparison-export-rejected(worktreevuer_oss-SLARAFIPI-84, off the tag): 34/34 tests, eslint clean, UNCOMMITTED, three review findings being applied. Round-2 draft reply written but UNPOSTED — awaiting the user’s decision. Quarantined from the thread: Q1 the_isSameFacemissing-TARGET fail-open (:338-367, score stays 0 ⇒0 <= perfect⇒ portrait accepted uncompared — STATIC’s “fails closed” refutation quoted the missing-SOURCE branch:322-324and does not overturn it), Q2 the unguarded liveness-v2 writer, Q3test.selfService.recognition.submitEnabled, Q5 the release-state risk. → Round 2 — 2026-09-08 - verification-failure-modes — four new traps, all of which exit 0. (1) A note that says “sent” is not evidence of posting — fetch the thread and count the comments; label vault drafts
UNPOSTEDin the heading, not just the prose. (2) A lens can refute the wrong branch: STATIC declared_isSameFace“fails CLOSED” quoting handler:322-324(the missing-source branch, which does) while the quarantined fail-open is the missing-target branch:338-367; ADVERSARIAL declared the config threshold “never reaches the comparison” by readingmigrateConfigStateas “only a change detector” and overlooking the Setting-row write atSelfServiceCheckerService.js:1360-1364— re-read the cited lines before accepting a refutation of a refutation. (3) Agent notifications truncate silently: 4 of 6 reports arrived cut mid-sentence with no marker ⇒ every agent must write its full report to a file and report only the path. (4)extractskips attachments with exit 0 (skipped-typeon.tgzand.xlsx— the server log and the 807-row export, i.e. the two decisive files). - face-comparison-distance-thresholds SCOPED — classifier vs flow. The perfect/probable/
different_faceladder is the export classifier’s semantics. The myra self-service flow does not use it:const success = faceComparisonResult === CHECK_SUCCESS(handler:366-367@raiffeisen-1.9.11.100) ⇒ for the flow,perfect(0.55) IS the accept/reject boundary and the 0.55–0.6probableband can never be populated by it (max distance 0.5394541 over 807 rows, zero rows in[0.55,0.6)). The note’s §4 “0.55 trap” section is true of the classifier and was the Mode 3 failure that increased our confidence in the wrong answer to Raiffeisen — both it and the TL;DR row are now scoped rather than removed. - raiffeisen-1.9.11.100 CORRECTED — the release IS tagged.
raiffeisen-1.9.11.100is an annotated tag, objecteaeacd0799→ commit2352f5117f, tagged 2026-08-18 12:36 +0200; the release branchchore/FKITDEV-9156-raiffeisen-release-1.9.11.100sits at the same commit. The 2026-08-11 “NOT tagged” warning is superseded, and the recorded branch head350d3e626bis now 6 commits behind (see facekom-worktree-vs-tag-trap). Release-state risk re-confirmed and still open:customization/bin/raiffeisen-facecomparison-export.jsexists only on that lineage — absent fromorigin/customization/raiffeisen(fa983a0eba) and fromdevel(ls-remote+ls-tree, 2026-09-08) ⇒ the next cut fromcustomization/raiffeisensilently loses the delivered export script.
2026-09-07
- FKITDEV-9252 LIVE FAULT INJECTION RUN — the fix’s core promise is VERIFIED, and one of my own review findings is REFUTED. 11 scenarios, real
activedirectory2/ldapjsstack, liveglauthbehind a purpose-built BER-parsing TCP proxy. THE HEADLINE PASSES: withservers: [always-resetting proxy, real glauth], server 1 took 5 resets + 4 retry warnings thenfail('ldap_unavailable'), the chain moved to server 2, which completed search + user bind and authenticated the user (id 4242) — previously the chain aborted and server 2 was never tried. The new success log line also fires with the right URL:"Active directory (%s) authenticated user (%s)", "ldap://127.0.0.1:60692", 4242. Also passing: baseline login succeeds; wrong password yieldsfail("Authentication failed for operator")and neverldap_unavailable(InvalidCredentialsErrorgoes straight tothis.fail, the classifier is not involved); closed port ⇒ECONNREFUSED, no retry. REFUTED — my earlier “the retry depends on WHICH PHASE the reset lands in” (search →ECONNRESET→ retries, bind →ConnectionError80 → no retry) is WRONG and must not be repeated. The determinant is HOW the connection dies, and it behaves identically in both phases: RST (abortive) ⇒Error,code: 'ECONNRESET'(string),'read ECONNRESET'⇒ retries 4× then failover; FIN (graceful) ⇒ConnectionError,code: 80(number),'<id>__ldap://… closed'⇒ NO retry, immediate failover; black hole/hang ⇒TimeoutError,code: 80(number),'request timeout (client interrupt)'⇒ no retry; closed port ⇒Error,ECONNREFUSED⇒ no retry. MECHANISM, OBSERVED not inferred (by attaching a listener to theActiveDirectoryinstance): ldapjs emits BOTH the raw socket error and theConnectionErrorfromclient.js:1083;activedirectory2’sclient.on('error')handler fires FIRST with the raw socket error and itscallbackInvokedonce-guard swallows theConnectionErrorarriving afterwards ⇒ on an RST the raw error wins the race, and on a clean FIN there is no socket error at all so onlyConnectionErrorappears. THE FINDING THAT REPLACES IT — this is the one worth telling Varga: the 4× retry only ever fires for RST. A graceful FIN — idle-timeout close, F5/HAProxy drain, a domain controller restarting cleanly, arguably the more common real-world event — takes the no-retry path and burns the whole server. If retry is meant to absorb single-connection blips,ConnectionError(code 80) is the case that most deserves it and precisely the one excluded. NOT a defect against what the PR claims — a policy question worth a deliberate decision. SECONDARY:AD_CONNECTION_ERROR_NAMESis load-bearing —ConnectionErrorandTimeoutErrorboth carry a NUMERICcode: 80, soAD_CONNECTION_ERROR_CODEScan never match them; the classification is correct as written and every branch is reachable with a real stack; the retry budget is per strategy invocation and each attempt reopens both connections, so a deterministic RST costs 5 full round trips (~1 s of 250 ms sleeps) per server before failover. HONEST LIMITS:ECONNABORTEDandEPIPEwere never reached by any injection — no claim is made about them; glauth returns[]forgetGroupMembershipForUser, souseMemberOfProperty: falsecannot produce a successful login on this fixture and ALL runs useduseMemberOfProperty: true; the chain driver was a re-implementation of passport’s chain semantics (fail→next,error→abort,success→done), not passport’s actual middleware. REUSABLE GOTCHAS: (a)passport-activedirectory’smainis the rollup buildindex.js, NOTsrc/strategy.js— the two differ (index.jsnormalises arrayattributesinto{user: [...]}), always readindex.js; (b) an LDAP fault-injection fixture now EXISTS where the vault previously said none did anywhere — proxy/Users/levander/coding/facekom/vuer_oss-FKITDEV-9252/scratch-9252/ldap-fault-proxy.js(BER-parsing TCP proxy; triggersaccept,acceptHang,bind,search,bindResponse,finBind,finSearch,hangBind,hangSearch, selectable by connection and op ordinal; RST viasocket.resetAndDestroy()), drivertest/tests/unit/zz-ad-live-failover.test.js, outputscratch-9252/full-run-output.txt— ALL UNTRACKED in a scratch worktree, so it is LOST if that worktree is removed; worth preserving somewhere tracked (first real tier-2 asset for facekom-test-tiers); (c) phase mapping observed on the wire — one login opens TWO TCP connections: conn#1 = technical bind +searchRequest, conn#2 = technical bind AGAIN (becausecreateClient(null, null, this)inheritsbindDN/bindCredentials) then the real user bind. — FKITDEV-9252, authentication, facekom-test-tiers - FKITDEV-9252 test round done — no regressions, three review findings, and the decisive test still unrun. (Earlier entry, kept for the trail. Superseded the same day by the live fault-injection entry above: the decisive test HAS since been run, and it REFUTED finding 1.) The ticket is a review request, not a bug: Varga Vencel had already written the fix and asked for a test round before merge — vuer_oss PR #8143,
fix/FKITDEV-9252-generali-ldap-hotfix→devel, functional commit5e24c3667d, approved by chrismakaay + marcuscosinus, verified NOT merged as of 2026-09-07; a first attemptorigin/fix/FKITDEV-9252-ldap-auth-server-fix(b9dc560d2b) was abandoned with no PR — do not review the wrong branch. Defect: “Something broke into 400 pieces!” on OSS admin login, 47 failed vs 28 successful over 9 days; the network resets a share of LDAPS connections, one login opens several (user search, bind, and withuseMemberOfProperty: falsethe group-membership query), andpassport-activedirectoryreports transport errors viathis.error(), which passport sends straight to the error handler and which aborts the strategy chain ⇒ the configured second AD server was never tried. TEST ROUND (Node v24.18.0 = CI’s pinnedNODE_VERSION: 24; two worktrees, each with its OWNyarn install --frozen-lockfile):web-server-auth.test.js37/37 on the PR vs 21/21 on the devel baseline ⇒ +16 tests all green; fullyarn test:unit3 suites / 4 tests failing on the PR and an IDENTICAL 3 suites / 4 tests failing on devel ⇒ NO REGRESSIONS;yarn lintexit 0 on both. The 4 survivors are the usual ones —converter.test.js(ffmpegmergeFiles),vuer-cv-service.test.jspadDetection×2 (hardcoded/workspace/container path),self-service-v2.test.jsphotoCandidate. RUNNER GOTCHA worth carrying:npx jest -c jest.config-unit.jsis NOT this repo’s runner — it omits--experimental-vm-modulesand invents three bogusSyntaxError: Unexpected token 'export'failures from the ESM-onlystack-tracepackage (logger/helpers,logger/syslog-client,logger/papertrail); always validate withyarn test:unit, and distrust any review figure that did not come from it. THREE REVIEW FINDINGS (mine, not in the PR, none blocking): (1) ⚠️ REFUTED LATER THE SAME DAY BY LIVE FAULT INJECTION — see the entry above; the phase-based version below is WRONG and must not be repeated.“retries 4× on the same server” is only half true — a reset during user search arrives as a rawThe real determinant is how the connection dies (RST vs graceful FIN), not which phase. What does survive from this finding: the unit tests structurally cannot catch any of it — they setECONNRESET(activedirectory2/lib/components/search.js:65-68hands the ldapjs error straight to the callback) so the retry fires, but a reset during bind comes back as aConnectionErrorwith the NUMERIC code80(ldapjs/lib/client/client.js:1083) which matchesAD_CONNECTION_ERROR_NAMESbut notAD_RETRYABLE_ERROR_CODES⇒ immediate failover, no retry.authenticate = jest.fn(), so the real strategy never runs and no test ever sees a real ldapjs error object. (2)_setupLocalRouting’s rewritten message-selection block has ZERO coverage although it decides the user-visible message AND whether theuser.auth.wrong_passwordaudit event fires, and it sits on the shared login path for every partner including non-AD ones. (3) Config-schema gap —servers[*].ldap.connectTimeout/.timeoutare documented indeveloper-hu.mdbut absent fromdocs/config/schemas/activeDirectory.schema.json; not a validation blocker (additionalPropertiesunset ⇒ permitted) but it breaks the project rule that new config fields get a schema entry. Minor:x || DEFAULTsilently overrides an explicit0(ldapjs’s “no deadline”) and the config object is mutated in place. FOUR THINGS VERIFIED SOUND (the ways this shape of fix usually breaks): overridingthis.error/fail/successinsideauthenticateis per-request, not shared state, because passport 0.7.0 doesObject.create(prototype)per attempt (lib/middleware/authenticate.js:195);info.slice(0, adStrategyCount)indexing holds — AD strategies are pushed first (WebServerAuth.js:93) and AD/SAML/local are mutually exclusive (else if);infois always an array (passport returns a bare challenge only when!multi, andmultiis true becausestrategyNamesis an array); and as a bonus the rewrite fixes a latent TypeError —passport-activedirectory/index.js:107callsthis.fail()with no challenge and the old loop diditem.messageonundefined. DELIVERY: PR targetsdevel, Generali runscustomization/generali-atvilagitas⇒ it reaches them only via a devel update (FKITDEV-9194); no partner-side change needed because Generali’scustomization/ui/pages/login/login.trans.jsoverride is an intentional no-op, so the newldap_unavailablestring surfaces as-is.STILL OPEN — the live fault-injection round has NOT been run— SUPERSEDED: it was run the same day, see the entry above. The plan recorded here (theglauthimage under OrbStack behind a TCP proxy that severs connections mid-login) is what got built;“no LDAP test fixture exists anywhere in the vault”is no longer true — the fixture now exists, though untracked. SIDE FINDING, corrects a standing claim: the long-unsourced “79 never-run customization tests” figure is now sourced —find customization -path "*/test/tests/unit/*" -name "*.test.js"⇒ 79 — and devel commitb704916a01(fkqa-356) adds an explicittestMatchforcustomization/test/tests/unit/**, which is why devel runs 426 suites vs the PR branch’s 347. ⇒ “jest.config-unit.jsmatches onlytest/tests/unit/**so customization tests never run” is now true only for branches predatingb704916a01; customization-branch-ci-pipeline-inheritance §2 corrected accordingly. — FKITDEV-9252, authentication, customization-branch-ci-pipeline-inheritance, FKITDEV-9194 - SLARAFIPI-84 re-corrected: our own post-mortem was wrong about WHY we were wrong. The note had blamed the stale worktree (HEAD
350d3e626b, an ancestor of tagraiffeisen-1.9.11.100by 6 commits) for the two answers Bihari Péter refuted. It was not the cause. Read at both refs withsubprocess.run(["/usr/bin/git","-C",repo,"show",…]):raiffeisen.customerPortrait.threshold= 0.55 at BOTH, theperfect: thresholdoverride incustomization/listeners/self-service-v2.jsis identical at both,server/service/SelfServiceCheckerService.js(the 0.5/0.6 defaults + the<= perfectladder) is byte-identical and not in the diff at all, and theface_comparewriter only moved by 19 lines; the entireconfig/docker.jsondiff ismaxRetryCount: 4,documentRecognitionVersion2→3 and two liveness labels. ⇒ staleness produced wrong LINE NUMBERS, not wrong FACTS (it did mislead three agents, so the trap callout stays — rescoped to citation accuracy). The actual causes: (1) CUSTOMIZATION LAYERING — we readSelfServiceCheckerService.js:36-38(perfect: 0.5, match: null, probable: 0.6) where the claim is TRUE in isolation, and never found the overlay atcustomization/listeners/self-service-v2.js:114-126because the claim was framed aroundprobableand nothing writesprobable— the hook changes a different rung, silently changing the ladder’s answer; (2) TABLE vs VALUE — we searched for writers of thefaceComparisonstable, correctly found only the gated one, then generalised “no row is written” into “the value is not stored”, when it is intasks.data.candidates[].recognitionDetailsand in activities. Shared shape, and the transferable lesson: both times we verified the claim where we expected the answer to be, and both times the refuting evidence was ALREADY IN OUR POSSESSION (the overlay was in the same repo we were reading; the 0.7396 was in an attachment sent with the original ticket). Added a claim-validation table classifying every reply claim as CODE FACT @ tag / DATA FACT / DEPLOYMENT ASSUMPTION / INFERENCE — all VERIFIED, except that the retention claim is a NOT-FINDING (Activity.destroy, cascade deletes, crypto-shredding all searched, all empty) which is the same fallacy as Error 2, compounded byconfig.js:103springCloudConfigServerbeing able to override any key at boot ⇒features.archive=falseat the tag proves nothing about their runtime, so the reply now promises June coverage only after confirming archival against their environment. Also corrected: an earlier draft calledconfig/local.jsonthe only override mechanism —springCloudConfigServeris a second path, so the reply says “the practical override point”. The final Hungarian reply is now stored verbatim in the note (previous draft removed): the 0.55 concession explains the base-vs-overlay mechanism instead of apologising, every figure is attributed to his own attachment (807 rows’Threshold perfect, room 11651’sselfService:v2:config:state, the 0.5394541 max, the 11 rows in[0.50,0.55)) so he can check rather than trust, the four storage locations are listed for self-verification, room 11651’s five attempts are a table with attachment ids, and the retention promise is scoped to “no deletion path found + archival off in the release config + will confirm in your environment”. — SLARAFIPI-84 - THE JANUS MEMORY LEAK IS NOW MEASURED ON REAL CALLS — and the measurement CORRECTS the RCA: BOTH clean and abandoned calls leak. Isolated full stack on fk-dev (postgres + rabbitmq + janus + vuer_oss + vuer_css, own bridge network, own DB, own TLS proxy; compose project
vuerleak2at/workspace/_leak2/, oss20443/ css20444/ janus wss18990+ admin17990), driving real browser calls with real media (verified: two<video>per side, 640×480, advancingcurrentTime= decoded remote frames), janus RSS + Admin API census after every cycle, 10 cycles per arm. ABANDONED arm (customer tab killed mid-call):sessions_delta 10,rooms_delta 10,rss_delta_kb 10064⇒ ~794–999 kB per call, monotonic, reproduced independently (rss_delta_kb 9992⇒ 999.2 kB/cycle); each abandoned call permanently costs 1 session + 1 handle + 1 populated videoroom. CLEAN arm (operator ends via[data-action="leave"]→[data-dialog-name="leave-dialog"] [data-action="confirm"]):sessions_delta 0— sessions and handles are reclaimed — butrooms_delta 10,rss_delta_kb 6872⇒ ~453 kB per properly ended call, because the videoroom is never destroyed. ⇒ the old hypothesis (“abandoned calls leak, clean calls are fine”) was only HALF RIGHT, and the inferred ~0.5–1.5 MB per stranded session is SUPERSEDED by a measured ~0.8–1.0 MB/call. In the clean arm part of the RSS may be allocator retention — quote the room count, not the kilobytes. Permanence verified well after the runs: 9 sessions still alive, 10 videorooms (9 still with participants), 10 DB rooms stuck atstatus='incall'. TWO NEW SIDE-DEFECTS: (1) an abandoned call’s Room row staysincallforever (handleVideoChatLeaveonly writes an activity row; onlyvideochat:closecloses a room;CloseExpiredSelfServiceRoomsCronJobis self-service only) ⇒videochat:createRoomthen refuses withoperator_in_open_room⇒ after ONE abandoned call the operator cannot take further calls until someone closes it manually — an availability bug, not just a memory bug; (2) role gate —videoChat.receiveCallis granted only tooperatorinconfig/roles.json, butWebServerAuth.js:934setsreq.session.role = req.user.getMainRole()andgetMainRole()(server/db/model/user.js:187) returns the FIRSTacl.roleListentry the user has ⇒adminfor multi-role users ⇒waitinglist.script.js:113never callsreceiveAvailable(true)⇒.can-receive-callnever added ⇒WaitingList.styl:16keeps.customer-item-actionsatdisplay:none(fix: POST/api/role-switchwithdocument.body.dataset.csrftoken, asdefault.layout.js:48does). CRON QUESTION ANSWERED (was an open gap):customization/cron/AutoCloseRoomsCronJob.js*/5 * * * *→queueClient.roomCron.autoClose(cron.js:139) →queue-room-cron→queue_server/RoomCron(server.js:509) →RoomService.autoClose(RoomService.js:447) →videochat.close()→roomTransport.destroy()→closeJanus()→janus.destroy(); the chain WORKS and IS a real mitigation for the abandoned path because transports leaveTransportPool.sessionsonly viadestroySession()/rpcDestroy()(nothing removes them on socket death) so the cron can still find them — BUT (a) double-gated onroomAutoCloseHourswhich has NO DEFAULT (“Nincs alapértelmezett érték”) ⇒ unset = no-op, (b) it structurally cannot clean theVuerCVListenerSessionpath (SelfServiceTransportSession.terminate()has ZERO refs tovuerCVListenerSession), (c) it iscreatedAt-based not last-activity ⇒ cannot be tuned aggressively without killing live calls. Artifacts in/Users/levander/coding/facekom/out/janus-memory/(leak-harness.js,janus-probe.js,cron-verify.sh,leakproof.js,heapdig.js,verify-claims.js,rss.sh,janus-leak.heapsnapshot,arm-clean.json,arm-abandoned.json,arm-abandoned2.json,FKITDEV-janus-leak-ticket.md); test code pushed onchore/FKITDEV-9239-e2e-janus-memleak(vuer_oss + vuer_docker). Thevuerleak2stack is still up holding the leak state as evidence — census it before anyone tears it down. — janus-memory-leak-rca, FKITDEV-9239 - Seven environment traps that make browser automation of vuer look “almost working” — all silent. Biggest:
Content-Security-Policy: upgrade-insecure-requests+Securecookies mean these apps CANNOT be driven over plain HTTP — the browser rewrites every subresource to https, hits the non-TLS nginx, every stylesheet/script failsERR_SSL_PROTOCOL_ERROR, and you get a bare skeleton whose form is never wired;curlignores CSP so curl-over-http always looks fine ⇒ curl is not a valid smoke test for anything browser-driven. Also:WebServerAuth.js:821builds the post-login redirect from config, not the request (https://${config.get('hosts.oss')}${redirectTo}) ⇒ a non-standard port must be inhosts, not just the Host header; server-side gateGET /api/pre-checkanswersunknownfor HeadlessChrome,not_compatiblefor Chrome/120,compatiblefor Chrome/141 ⇒ Playwright needs full chromium (channel: 'chromium', not the headless shell) plus a realistic UA; operator and customer need separate browser contexts (cookies are not port-scoped ⇒ one context leaks the operator session onto the customer origin); the submit handler attaches only after/api/pre-checkresolves, so clicking early falls through to a native GET form submit (URL becomes?_csrf=…&lastName=…, page just reloads);[data-action="take-call"]lives inside a<template>so a 0-lengthquerySelectorAllmeans no customer row rendered, not “button hidden”; andfirstNameis letters-only (^[a-zA-Z…]{2,25}$). — vuer-browser-e2e-real-call-gotchas - SLARAFIPI-84 closed out — and BOTH of our first-reply claims were wrong; the export’s “missing rows” are a STRUCTURAL DEFECT, not a script bug. Raiffeisen (Bihari Péter) tested the FKITDEV-8827 face-comparison export and reported (1a) no above-threshold differences, (1b) no liveness comparisons, (2)
-c/csv throws, (3) wants 644 instead of 600. Root cause: the myra customer-portrait comparison is computed in TWO places and only the second persists — the handler’s_isSameFacecomputes the cosine score itself and never writesfaceComparisons, while the only writer (FlowService.submitTaskPhoto→handleTaskRecognitionOptions) sits behind a server-side gate: a mismatch setsrecognitionValid=false→actions.submitEnabled=actions.recognitionValid→SelfServiceV2Service.photoFinalizethrows'Submit was not enabled for this photo candidate!'. ⇒ the export can only ever contain ACCEPTED comparisons; everydifferent_facecase — exactly what ASSRAFIPI-119 asked for — is structurally absent, and the observed ceiling (807 rows, max 0.5395, zero ≥ 0.55, 11 in [0.50,0.55), 395 of 1202 room-ids absent) follows from it. No bypass exists (the ungatedscreenshot-saveRPC needstask.data.attachmentIds, never set on the portrait candidate path;test.selfService.recognition.submitEnabledis inert — notestkey at the tag). REFUTED #1: 0.55 IS the boundary —raiffeisen.customerPortrait.threshold=0.55 applies toperfectand the flow accepts only<= perfect, so the 0.55–0.6probableband can never appear; our “the boundary is 0.6” was wrong. REFUTED #2: room 11651 was NOT a recognition failure — his own room export shows 5 candidates in 2 minutes, 4 dead on sharpness (37 and 33 vs 40), #2 on geometry, and 5 RAN, scoring 0.7396 and 0.6507 withFACE_MISSMATCH:true(both selfie↔eMRTD chip, attachment 148700 md5-identical toapi/emrtd-photo/11651/8631/face), endingno-more-photo-candidate-allowed; numeric scores prove descriptors on both sides. The rejected score IS recoverable: it lives inActivity selfService:attachment, inFlow.tasks[].data.candidates[].recognitionDetails.face_compare(most reliable — the activity path has acreateActivityLogfinal-state drop + unawaited-vs-fail()race), and inFlowActivity; only theCVTask:failedcopy israiffeisen.debug.cv-gated. Field isscore, notdistance(zero occurrences of"distance"), and nothing prunesActivity/FlowActivity(features.archivefalse;AttachmentArchiveServiceonly nulls attachment bytes) ⇒ June data is still there. Liveness reframed: the myra proto at the tag carries BOTH liveness steps (v2 added only 2026-08-17 by1c05206ccb, absent from proto v12/v14/v15) and picks one vialivenessCheckCompatibilityonly whenenvData.supportedSteps.length===0— but neither task hasrecognitionOptions, so neither v1 nor v2 writes a row; the cheap fix is a proto change, and livenessdistanceis dropped bymergeRecognitionsso full retroactive coverage is impossible. CSV = missing config key: underNODE_ENV=dockerdev.jsonis never read,docker.json’sreportingblock has noenabledExportFormats⇒ fallback['xlsx']; onlyconfig/local.jsoncan override (env vars can’t —getconfigneeds an existing$VARplaceholder), and ⚠️ an empty/malformedlocal.jsonkills startup (process.exit(2)). NEW, UNDISCLOSED SECURITY FINDING:_isSameFacefails OPEN —compareTo.scorestarts at0, only raised insideif (recognitionTo?.getFaceCount()), so zero resolved targets →0 <= perfect→ CHECK_SUCCESS, silently (no row, and_logCVErroronly fires on failure); three reachable paths (webSDK session whereemrtdis filtered out as[mobileSDK]-only whilesupportedStepsis client-supplied, null eMRTDdata.attachmentIdper CRRAFIPI-106, non-success eMRTD recognition). The core path fails SAFE — only the Raiffeisen customization fails open, likely a second population among the 395 absent rooms that recovery will NOT restore. Awaiting András’s call on disclosure. ⚠️ Three verification traps, all silent: thevuer_oss-rel100worktree HEAD350d3e626bis an ancestor of tagraiffeisen-1.9.11.100by 6 commits touching exactly the files the conclusions rest on (alwaysgit show <tag>:<path>);git log -1 --format=%adreturned the rebase-preserved author date 2026-05-12 instead of committer date 2026-08-10 (use%cd); andrtkdropped three comment lines out of the extracted handler, shifting all line numbers by 3. — SLARAFIPI-84 - Corrected the stale face-comparison-persistence-paths reference note — its §3 was the framing that produced the wrong first SLARAFIPI-84 diagnosis, and its
customization/line numbers were all wrong. Provenance failure: the note’s own stated verification basis,git describe=raiffeisen-1.9.11.99-7-g350d3e626b, was the worktree HEAD — an ancestor of tagraiffeisen-1.9.11.100by 6 commits that touch the myra proto, the myra handler,customization/listeners/self-service-v2.jsandconfig/docker.json, i.e. exactly the files it cites. Re-derived everycustomization/citation from the tag with/usr/bin/git: the handler numbers were off by 19 (_isSameFaceis:309-380, not:290-361;compareToinit:338-341;getFaceCount()guard:356;getFaceComparisonResult:366; the no-faceEncodingfail-closed branch:322-324;_logCVErrorcalled:376, defined:416, gate:418) and the proto numbers by 1-2 (emrtd:81-98,customer-portrait:99-122);server/numbers were unaffected and re-confirmed. A different offset from a different cause than the rtk 3-line drop — do not assume one constant correction. §3 rewritten: the myra phase-1 proto at the tag (version 16, taskCount 9) carries BOTH liveness steps — v1 at order 6 (:123-133), v2 at order 7 (:134-145,screenshotCategory:'liveness-reference-face') — exactly one surviving per session viaonBeforeCreateTasks→livenessCheckCompatibility(envData), which only runs in theenvData.supportedSteps.length === 0branch (otherwise the client’s declaredsupportedStepsdecides); and the operative reason neither branch persists is that NEITHER task declaresrecognitionOptionsat all, so the v2 gatetask.options?.recognitionOptions?.compareFaceWithcan never open, meaning the fix is a customization PROTO change, not a flow migration and not core-handler work (the note previously claimed feature work). Two former UNVERIFIED rows settled: the NFC question is YES, three reachable paths (webSDK step-filtering whereemrtdis[mobileSDK]-only whilesupportedStepsis client-supplied, null eMRTDdata.attachmentIdper CRRAFIPI-106, non-success recognition) — andrequired: trueon theemrtdstep is a weak mitigation because filtering happens before the flow is built; andperfect = 0.55IS a repo fact after all (config/docker.json:59-61at the tag, applied atlisteners/self-service-v2.js:124), so the note’s “not in the repo” reading was itself an artefact of the pre-tag working tree. Also corrected: thevuer_cvLivenessTaskrow now reads as a real mechanism but NOT the reason there is no row (and records that both v1:1208and v2:1281have an init hook, so it does not distinguish the branches),DebugLivenessTaskcitations added (:105createLog,:117type,:13-14gate), and all three TOPICS entries reworded so none still reads as a live warning that this note’s advice caused a wrong diagnosis. ⚠️rtkmangledgit show <rev>:<path>again during this pass — it ate the:cand producedraiffeisen-1.9.11.100onfig/docker.json; thepython3subprocess.run([...])argv bypass worked. — face-comparison-persistence-paths · SLARAFIPI-84
2026-09-04
-
CIB’s FIRST-EVER
vuer-releasecutcib@1was made — and it FAILED at the Harbor publish step. Delivery is BLOCKED. Commitac8aa5cc55onTechTeamer/vuer-releasemaster(chore: [asscib-166] cib 1.9.11.102 release/1, solo-author, addsprojects/cib/release/1/release.jsononly), tagcib@1, autobuild run 33855979398.COMPONENT_LIST=vuer_oss+vuer_css, bothVERSION 1.9.11.102/TAG cib-1.9.11.102/BUILD_NUMBER 1;NODE_VERSION 24.15.0,SECURITY_NUMBER 20221206,UID/GID 1000,BUNDLE_IMAGE false,PROJECT_NAME cib-facekom.parse_taggreen;buildbuilt the images successfully and Harbor login SUCCEEDED, then died at “Project images publish to Registry”:CalledProcessError: Command '['docker','push','harbor.techteamer.com/cib-facekom/vuer_css:1.9.11.102.1-20221206']' returned non-zero exit status 1. Root cause NOT confirmed (no Harbor credentials locally) — hypothesis (record as such): thecib-facekomHarbor project does not exist, or the robot account lacks push rights on it, because login worked, the same runner pushednusz@18fine on 2026-09-03, and this is CIB’s first-ever push to that project (.101was built on legacyvuer_build). NEEDS A HARBOR ADMIN. CORRECTION — image tag anatomy is<VERSION>.<BUILD_NUMBER>-<SECURITY_NUMBER>(1.9.11.102.1-20221206), a dot before the build number and a hyphen only before the security number — NOT the all-hyphen form. TOOLCHAIN TRAPS (.cliversion), all source-verified: the pin is exact equality (release_tool/pkg/util.py:validate_cli_versiondoesVersion(current) != Version(required)), currently1.0.3; the runner’s.github/scripts/download-release-cli.shselects the asset namedrelease_toolbut current-latest 1.1.1 renamed its asset torelease-tool⇒ bumping.cliversionto 1.1.1 breaks CI withERROR: Asset 'release_tool' not found; 1.0.3’s ownpyproject.tomlis invalid TOML (pyyaml/typing_extensionsunquoted ⇒pip install -e .dies withtomllib.TOMLDecodeErrorat line 16) and it has no[project.scripts]⇒ invoke aspython run.py, notrelease-tool; 1.1.1’srequirements.txtomitspackaging; the two versions emit differentrelease.jsonkey sets (1.0.3REQUIRED_ENV_VALUES = {"VERSION":"", "BUILD_NUMBER":""}vs 1.1.1{"VERSION":…, "TAG":…}with a required-flag dict) and read incompatible schemas from the same~/.release-tool/config.json(1.0.3 flat keys vs 1.1.1current_context/contexts); commit message changedRelease: <t>, version: <N>→chore(release): <t>, release version: <N>;repository.create()gained acfgarg. CORRECTION —COMPONENT_LISTis NOT “a complete manifest of what the customer runs” (measured across all 18 partners’ latest releases):janushas a component dir in 12 partners but ships in only 3 (barion, cofidis, kh);mkb-instanthasrabbitmq+turndirs and ships neither;demo-facekom@6ships ONLYreport-engine; 12 of 18 latest cuts are exactlyvuer_oss+vuer_css. BUTrelease-tool genbuilds the delivered docker-compose FROMCOMPONENT_LIST, so an omission is a silent delivery gap — the same shape as SLARAFIPI-83’s janus-never-shipped. Decision:cib@2addsportal_cssat1.4.0.74(CIB runs a portal); descriptor prepared atprojects/cib/release/2/release.jsonUNCOMMITTED, held for the Harbor fix.vuer-releasehas essentially NO branch protection — ruleset 12260273 “main-protect”, target ~ALL, one rule:non_fast_forward; direct push tomasteris the norm and the TechTeamer bracketed-ticket regex does not apply here. The1.9.11.102changelog was NEVER written —customization/RELEASE.MDstill tops out at## [1.9.11.101] - 2026-05-29in BOTH repos (GitHub API, today); since the source tags already point at the branch tips, any changelog commit now lands after the tag ⇒ decision: FLAG ONLY, do not touch. Unresolved: how the base release version is selected (Dockerfiles takeARG BASE_COMPONENT_IMAGE_TAG, injected by release-tool, not named inrelease.json). client-registry’s “CIB = legacy vuer_build” row is now stale/corrected — CIB is modern as of.102. — cib-1.9.11.102 · vuer-release-cli-pinning · component-list-is-not-a-full-manifest · vuer-release-cut-recipe -
Follow-up the same day — the
COMPONENT_LISTcounts were re-verified, and CIB’s own PROD compose now grounds thecib@2decision. Corrected counts (Python over parsed JSON, not a shell pipe —rtkzeroes| wc -land produced a wrong intermediate figure of 93): 91projects/*/release/*/release.jsonfiles, 90 with aCOMPONENT_LIST, 88 excluding the two new cib cuts; component ENTRY counts over those 88 =vuer_oss84,vuer_css84,portal_css8,janus5,resource-manager3,report-engine1 (including the cib cuts: 86/86/9, a clean +1/+1/+1 ⇒ self-consistent). The earlier “85” was an entry count mislabelled as a file count. No contradiction after all, and the finding is STRONGER: the four manifests with novuer_oss/vuer_cssare all single-component bundles —demo-facekom/release/6→['report-engine']anddemo-project/release/{1,2,3}→['resource-manager']— sodemo-facekom@6is not an isolated oddity. NEW: not everyrelease.jsoneven HAS aCOMPONENT_LIST—projects/equilor/release/1/release.jsonuses an older, entirely lowercase legacy schema (default_args,docker_registry,git_remote,project,project_args,services,timestamp); equilor has exactly one release, so it is easy to miss, and any script iterating all manifests must guard for it orKeyError(hit for real). DECISIVE new evidence forcib@2, read from the localvuer_buildclone:partner/cib/docker-compose.yml— what CIB PROD actually pulls — has exactly threeimage:lines,vuer_css,vuer_oss,portal_css, allharbor.techteamer.com/${PROJECT_NAME}/…, withportal_csson its own${PORTAL_VERSION}.${PORTAL_BUILD_NUMBER}vars ⇒portal_cssis REQUIRED in the bundle (cib@1 without it cannot deploy a complete stack) andjanusis CORRECTLY excluded (no janus image line; it rides asJANUS_VERSION_COMMITon the vuer_oss entry) — this grounds the decision on CIB’s own production compose rather than unicredit-srb precedent. Generalisable check: count theimage:lines invuer_build/partner/<client>/docker-compose.yml. Also confirmed by direct grep:vuer_buildcontains NOdocker pushand NOdocker loginanywhere ⇒ the legacy toolchain cannot publish to Harbor at all, so nothing in the repo establishes the CI robot has ever had write access tocib-facekom— recorded alongside the hypothesis. And the hypothesis stays a hypothesis: Harbor’s API returns[]unauthenticated for EVERY project, including ones that certainly exist, so an empty response is not evidence of non-existence. — component-list-is-not-a-full-manifest · cib-1.9.11.102
2026-09-03
- CIB release cib-1.9.11.102 TAGGED — and the cut carried a finding bigger than the release: both PRs were SQUASH-merged, so
develis no longer an ancestor ofcustomization/cib. All live-verified via the GitHub API on 2026-09-03. Merged: vuer_oss #8126 at13:10:49Z, vuer_css #3152 at12:55:36Z; portal_css #712 left OPEN on purpose — components are vuer_oss + vuer_css only per ASSCIB-166, which finally answers the standing “does portal_css ship in .102?” question with no. Tags: annotated, tagger Andras Lederer, message the bare1.9.11.102\n—vuer_oss12a8a9e328221829ae6d383fd5e23eda9cf81a38,vuer_cssca60fac34ac95b661336587b455924ab55e52def; created through the GitHub API rather than a local push to sidestep thevuer_cssnarrowed-fetch-refspec stale-ref trap (narrowed-fetch-refspec-stale-devel-merge). Convention matchescib-1.9.11.101exactly (annotated,1.9.11.101\n, Szabó Márton, 2026-05-29) — butcib-1.9.11.100was LIGHTWEIGHT, so the convention changed at.101and.100is not the pattern. The squash: each result has exactly ONE parent (12a8a9e3→8abcc4c733;ca60fac3→b043527c72, itself the.101css target), so the 334 commits / ~11 months of devel drift collapsed into one commit per repo and git has no record they were merged — the next devel→CIB update will re-present all of it as new changes with heavy conflicts. Content is safe: squash trees are byte-identical to the reviewed PR heads (df853239b1…oss,12a8a9e3== head86f7dab01d;38079f89c7…css,ca60fac3== head83e4adbd2c) — tagged bits are exactly what was reviewed and tested, only history shape differs. NOT verified: whether earlier CIB releases used real merge commits — flagged as an open question, not asserted. Generalised with detection commands (git cat-file -p <sha> | grep -c '^parent ',git merge-base --is-ancestor) and three mitigations into squash-merge-erases-partner-devel-ancestry. Second finding: CIB’s/reports-advancedhas no chart and no on-screen table — source-verified invuer_oss/customization/ui/pages/reports-advanced/(template renders only the filter form;handleDownload()always sendsdownload:'true'and its only success path iswindow.location = /download/${res}), so the xlsx export is the page’s ONLY output. ASSCIB-166’s “a riport számai, a diagram adatai, valamint a XLSX export” names three places the FKITDEV-9230 async-filterbug surfaced in the computed data, all landing in the workbook — NOT three UI surfaces → FKITDEV-9230 test evidence can only ever be the spreadsheet, never an app screenshot (cib-reports-advanced-is-export-only). Still open after tagging: Docker image builds (./build.sh -b cib-1.9.11.102 -i vuer_ossfromvuer_buildmain) and a TjK with blank tester/verifier name fields plus a date mismatch (document 2026.08.13 vs evidence 2026.08.17). — cib-1.9.11.102 · FKITDEV-9197 · squash-merge-erases-partner-devel-ancestry · cib-reports-advanced-is-export-only
2026-09-02
- FKITDEV-9305 / ASSMKB-113 root-caused — the customer bundled TWO UNRELATED problems into one “rabbitmq hiba” question, and the answer to “does the queue error cause the compat-test failure?” is NO. Verified from source at the exact deployed tag
mkb-instant-1.9.11.67(commit92e235bfd9, 2026-07-14, tagged bencelaszlo, ASSMKB-104) — MKB UAT was two tags behind on 2026-08-28 (.68= 07-29,.69= 08-14). Problem 1 (root-caused):no queue 'integration-log' in vhost '/'every 5 s =runDiagnosticTick()invuer_oss/server/diagnostic.jscallingch.checkQueue(key)— amqplib’s passivequeue.declare, which on a missing queue raises a channel-levelnot_foundand kills the channel (hence a new Erlang channel pid per tick on one connection); cadencediagnostic.rpcRoundTripIntervalMs= 5000 (config/docker.json:736,config/dev.json:985) started unconditionally atserver.js:606; the failure is swallowed (catch→ push{0,0}→continue) so vuer_oss logs nothing and only the broker sees it. The queue is missing becauseintegration-logis an RPC client (server.js:442-444, gated onintegrationLog.enabled— verifiedtrueand committed in the partner branch atconfig/docker.json:808-809, not a runtime override) and@techteamer/mqv7.2.0RPCClient.initialize()asserts only its reply queue (mq/src/RPCClient.ts:174), never its target — unlikeQueueClient(mq/src/QueueClient.ts:34) — so the queue exists only whileintegrationLog.jsruns. ROOT CAUSE: MKB’s partner supervisor overlay ships 7[program:]blocks;vuer_integration_logandvuer_oss_storageare absent (canonical has 9 — lines 50 and 155). The mechanism is TWO SEQUENCED IMAGE BUILDS, not last-write-wins layering: the base image links the canonical conf intoconf.d/and is tagged+pushed to harbor first (vuer-release:install/configure-app.sh:16-19frombase/components/vuer_oss/Dockerfile:106; legacyvuer_build:base/vuer_oss/Dockerfile:241), then the partner image buildsFROMthat sealed base andCOPYs its own file to the same path (projects/mkb-instant/components/vuer_oss/Dockerfile:1-2→COPY :18; legacypartner/mkb-instant/vuer_oss/Dockerfile:6→COPY :31, plussed -i "/user=/d"at:25) — the COPY structurally cannot lose; legacy partner selection comes from the git tag (build.sh:365stripsmkb-instant-1.9.11.67→mkb-instant, sourcessettings.cfg). CORRECTION recorded in the note — an earlier pass claimed MKB still builds from legacyvuer_build; that is WRONG, caused by a localvuer-releasecheckout stale at 2026-05-14. MKB has migrated:projects/mkb-instant/is onorigin/master(verified atfb78901, 2026-09-01) carrying the same stale 116-line / 7-program file, added by4bf534e(2026-07-08, “migrate mkb-instant project (#36)”) and released as939a189(2026-07-09) — five days before themkb-instant-1.9.11.67tag, so the running image was built through vuer-release; the legacy file has been frozen sincec78e02a(2023-01-13). The spam needs all three legs and therefore starts at the LATEST of them — themkb-instant-1.9.11.54tag of 2025-07-01, the first shipped tag carrying"integrationLog": { "enabled": true }(.53of 2025-06-11 has nointegrationLogkey at all; stilltrueat.55,.60and the deployed.67); thecheckQueueloop itself landed 2023-01-19 (76a06e1970) and the overlay froze 2023-01-13 (c78e02a) ⇒ ~14 months of continuous spam — chronic, not new, independent evidence it cannot explain a recently-appearing compat-test failure; the ordering also rules out “queue existed and was lost” (the program was already absent before the feature was switched on, so the durable queue was never created). (Two earlier drafts got this wrong — “~3.5 years”, then “~2 y 10 m”.git log -Sis unreliable oncustomization/mkb-instant: its history is non-linear with periodic devel merges, so the key’s presence oscillates across parent paths —a73e993630(2024-01-26) has nointegrationLogat all. Read the value at release tags instead.) Positive confirmation from the customer’s own log: the overlay’sstdout_events_enabled=truewiring feeds asupervisor_stdouteventlistener, which is what emits theINFO nginx | …prefixes — the 887-line export contains zeroINFO vuer_integration_log |lines. Fleet scope: 32 of 35 partner overlays omit it; onlygranit,mvm,vktakeep it — and since thevuer_oss_storageomission IS a documented convention while MVM keeps integration-log and drops storage, this reads as drift, not design. DO NOT DELETE THE OVERLAY — the mbh fix does not transfer.projects/mbh/components/vuer_oss/has no supervisor conf (deleted in #35 /d7ebb37) so mbh inherits canonical, but MKB’s overlay is not “canonical minus 2 blocks”: every functional directive across the 7 shared blocks is identical (command,directory,environment,process_name,numprocs,umask,priority,autostart,autorestart,startsecs,exitcodes,stopsignal,stopwaitsecs), and the only deltas are droppeduser=techteamerand file-logging (redirect_stderr+stdout_logfile=/var/log/<prog>.log+ rotation) replaced bystdout_events_enabled=true/stderr_events_enabled=true/stdout_logfile=NONE/stderr_logfile=NONE— the container-stdout wiring MKB’s OpenShift log collection depends on. Correct minimal fix: add one[program:vuer_integration_log]block tovuer-release→projects/mkb-instant/components/vuer_oss/supervisor_vuer_oss_docker.confin the overlay’s own logging style (canonical block, minususer=, minus rotation/logfile keys, plus the four events/NONE keys); only integration-log —vuer_oss_storage’s omission is the deliberate convention. Deployment note:integrationLog.jscallscreateEncryption()on startup, so the worker’s first successful start creates an integration-log encryption key — a one-time state change the release/test plan must expect. Consequence A — a latent defect, but GATED OFF in MKB’s committed config (do not cite as confirmed impact):DeviceIntegrityCheckService.checkDeviceIntegrity()returns{isValid:true}early unlessintegrityCheck.apple.enable/play.enableis truthy, and anintegrityCheckblock exists only inconfig/dev.json:367— absent fromdocker.jsonanddefault.json, andconfig.get()returns itsdefaultValuefor missing keys rather than throwing (config.js:139-151), socheckIntegrityToken()is never reached in the docker deployment unless MKB’s runtimelocal.jsonenables it. The defect itself:GooglePlayIntegrityCheckService.js(+ Apple twin) callrpcClient.integrationLog.createLog()insidetryANDfinally, withDeviceIntegrityCheckService.js:38,40passingsave=truehardcoded; each call waitsrpcTimeoutMs= 10000 (config/docker.json:688) → ~10 s stall →catchreturn false(Google/Apple never contacted) →finallystalls another ~10 s → the throw fromfinallyoverrides thereturn false, so the caller gets a rejection after ~20 s. Mobile SDK app-integrity verification is effectively broken while the worker is missing. Latent smell alongside it:checkIntegrityToken’ssetTimeout(() => { throw … })throws from a timer callback the surroundingtrycannot catch (→ uncaughtException), and its 10000 ms default races the identical 10000 ms RPC timeout. Consequence B — monitoring blind spot (core bug, every affected partner): the loop keeps using the dead channel, so every queue iterated after the missing one reports{messageCount: 0, consumerCount: 0};channelNamesiteratesrpcClientslast and integration-log is registered atserver.js:442, silently zeroingbackground-recognition,rpc-esign:external,cronManager,rpc-xml-report,rpc-xlsx-report,rpc-transport-css⇒ theQUEUE COUNT WARNINGoverload alert can never fire for them, the admin System Settings queue table is wrong, and any further missing queue stays invisible (only the first ever reaches the broker). Minimal fix ≈ 2 lines: re-fetch the channel inside the inner loop +this.diagnosticChannels.delete(name)in the catch. This also corrects cli-system-check-enhancement, whose 2026-04 freshness caveat said the tick may not have started without an admin on System Settings. Problem 2 (unrelated — TURN, and it isvuer_ossNOTvuer_css): the customer’s stack frameConnectionCheck.startCheckingmatchesvuer_oss/client/features/system-check/check-steps/connection-check/connection-check.js(throw instartChecking()); the vuer_css twin throws fromcheckConnection()and is the wrong repo — route isvuer_oss/server/web/routes/compat-test.endpoint.js, registeredserver/web/routes.js:109. Log evidence for 12:40–12:43 UTC: 384 nginx requests, every one 2xx/3xx/101 — zero errors, zero 5xx (/compat-test200, 8×/socket.io/101 ⇒ socket path healthy, 366×/diagnostics/monitoring200) and zero mentions of turn/stun/janus/media anywhere; the111 Connection refused → 127.0.0.1:10081lines the customer quoted are from 11:58, during their own restart, and that endpoint returns 200 by 12:40. Why it cannot be the queue: the check needs a real relay candidate (srflx is not enough); the ICE list is server-rendered into the page (TurnPasswordService.getPeerConnectionConfig(...)behind that route) with no queue and no RPC; a specifically-TURN error rather than a JSON parse error proves the config arrived and parsed; Janus is architecturally ruled out (browser never talks to Janus); and the RabbitMQ noise predates the failure by ~14 months. THE TRAP that reversed my first draft —vuer_osshas NO working differential diagnosis: invuer_oss/client/features/webrtc/iceTest.js,AUTH_FAILED = 2(:44) andNOT_REACHABLE = 3(:45) are DEAD CONSTANTS — defined and read (isAuthFailed():74,isUnreachable():78) butsetResultCode()is only ever called withDONE(:136,:153) andCONNECTION_TIMED_OUT(:172), and there is noonicecandidateerrorhandler ⇒ credentials rejected, TURN unreachable and no iceServers configured all collapse into the same message; the working classifier exists only in the vuer_css twin, so the earlier “ask MKB to read the AUTH_FAILED/NOT_REACHABLE classification” advice was wrong and is retracted. Compounding it,this.result.iceis assigned (connection-check.js:66) but never emitted or reported anywhere in vuer_oss (vuer_css emits a'report'event), and the pass/fail logicif (isTimedOut() || isAuthFailed() || isUnreachable() || !(hasRelay || hasReflex)) passed = false; else if (hasRelay) passed = trueleaves srflx-only (STUN works, relay doesn’t) in NEITHER branch →passedstaysundefined→ falsy → fails silently;TIMEOUT_PERIOD = 60000(iceTest.js:41). ⇒ diagnosis must happen outside the product:chrome://webrtc-internalson the failing client, a Trickle-ICE test against the same TURN URL+credentials, or coturn’s own server-side logs. Three indistinguishable candidates, all config/network-side: TURN secret mismatch (coturnstatic-auth-secretmust equalwebrtc.turn.secret;TurnPasswordService.generateCredentials()=username <unixExpiry>:<name>,password base64(HMAC-SHA1(secret, username)); also clock skew pastwebrtc.turn.validityInSec), UDP/3478 or TLS/5349 blocked in the bank network / coturn down, andfilterByJanusServer()leavingiceServersempty — identical error, no server-side log. Open: which tag UAT actually ran (.67taken from a UI screenshot), which of the three TURN causes applies, MKB’s undocumented “szokásos” media-failure history, and the broker showinguser: 'guest'on 5671 against the vault’s documented client-certificate RabbitMQ auth. No prior art anywhere — no ticket, note or session at ANY partner describes this queue missing; first recorded occurrence. Tooling:rtkagain mangledgit show | grepinto a false “no match” and rewrotegit show <tag>:<file>into a tag summary (all git reads went throughrtk proxy), and a localvuer-releasecheckout stale by 3.5 months produced the wrong-pipeline claim corrected above ⇒ verify partner-pipeline facts againstorigin/master, never a local tree (rtk-mangles-curl-and-pipes, narrowed-fetch-refspec-stale-devel-merge). — FKITDEV-9305-rca - THE JANUS MEMORY LEAK IS ROOT-CAUSED, AND IT IS A
vuer_ossBUG — NOT AN UPSTREAM JANUS BUG. Four years of tickets (ASSRAFIPI-38 2024 → SLARAFIPI-83 2026, FKITSYS-2994→FKITSYS-9871 at Cofidis, DAP-1141/FKITDEV-8570/FKITDEV-8573 at DÁP) were closed on the premise “Janus leaks, it’s third-party, upgrade it.” That premise is wrong. MECHANISM (all verified from code):janus-api/src/Janus.js:407-425keepAlive()reschedules itself with asetTimeoutclosure capturingthis⇒ a “leaked”Janusobject is immortal AND actively pinging — V8 cannot collect it, its websocket stays open, so janus never times the session out (keepAliveIntervalMs: 30000vs janus’s defaultsession_timeout60 s = 2× margin;session_timeoutis set in NO FaceKom janus config — checked vuer_docker, vuer_build, vuer-release). MEASURED on fk-dev: janus destroys sessions in UNDER 5 SECONDS when the websocket dies — 40 sessions opened, sockets terminated with no destroy and no keepalive, count went 44 → 4 within 5 s ⇒ a crash/disconnect leaks NOTHING; the only way to strand a session is a live, pinging JS object.Janus.destroy()itself is CORRECT — idempotent, clears the keepalive on the success, rejection and 5 s-timeout paths; the clean end-of-call flow is correct on both operator and customer side ⇒ the bug is always “destroy was never called”, never “destroy is broken”. LEAK PATHS, RANKED: (1)server/cv/VuerCVListenerSession.js:62leaks on EVERY invocation, success path included — the class has nodestroy()/close()and_janus.destroy()exists nowhere in either repo; ownerSelfServiceTransportSession.terminate()(server/transport/session/SelfServiceTransportSession.js:392-404) closes onlythis.janus, but the listener’s Janus is a second independent session; cost = 1 session + 2 handles + recorder (record: trueat:150) + up to 2 PeerConnections. (2)RoomTransportSessionleaks on any call not ended viaVideoChatService.close()(server/service/VideoChatService.js:201-233) — operator closing the tab emitsvideochat:leave→handleVideoChatLeave()writes an activity row and notifies CSS but never closes the room or touches the transport; vuer_cssterminate()isreturn Promise.resolve()(a no-op),TransportPool.sessionsis aMapwith no TTL/sweep, and no base-install cron reclaims videochat rooms (only theAutoCloseRoomsCronJobcustomization, gated onroomAutoCloseHours). (3)RoomInspector.connect()failure strands a session with ZERO references —client.roomInspector = inspectoris assigned after the await (server/socket/events/videochat.js:348-357), so the disconnect handler cannot see it; triggered normally byfindRoom()throwing “Video room not found” for rooms nobody published into yet. (4)VuerCVSessionregisters teardown (task.result…finally) at line 87, AFTER_connectJanus()at line 58 — a throw in between strands it; adjacent defect:CVTask(server/cv/CVTask.js:6-28) never arms its timeout becausethis.timeoutis undefined whensuper()runs, for LivenessTask/LivenessV2Task/ActionTask/DocumentTask/HoloV2Task/SpeechTask/PadTask/MRZTask. (5) concurrentvideochat:senderPeer:initorphans HANDLES (not sessions) —VideoRoomPublisherJanusPlugindoes not overridehangup(), unlike the listener. SECONDARY FaceKom DEFECT — videoroom rooms are NEVER destroyed: janus-api’s videoroom plugins send only join/start/rtp_forward/stop_rtp_forward/edit/list/create/configure/listparticipants — nodestroy; vuer_oss sends none either, andRoomTransportSession.closeJanus()ends atjanus.destroy()= a SESSION destroy. One janus room per vuer Room DB id (id: this.getRoomId()),record: true. Present since janus-api’s first commit, 2018-01-12 — an 8-year-old design gap, not a regression (which is exactly why no upgrade or bisect ever found it). MEASURED ~6.0 kB retained per abandoned room — too small to dominate (100 MB/day would need ~17–21k rooms/day) — but the compounding bug is not small:findRoom()pulls the ENTIRE room list and linear-scans by description on every publisher connect AND every inspector connect, MEASURED 483 bytes/room, linear across 6 points: 3.0 KB @ 6 rooms → 969 KB / 69 ms @ 2006 rooms, extrapolating to ~9.7 MB per call setup at 20k rooms. Destroying rooms works (2000 destroyed, list back to baseline) but RSS does not return to the OS (glibc arena) ⇒ destroy CAPS growth, does not reclaim. Also MEASURED: 400 signalling-only sessions+handles ≈ 31.7 kB each. UPSTREAM/FORK FACTS: the TechTeamer/janus-gateway fork changes ZERO lines of janus C source —*.c,*.h,src/,configure.ac,Makefile.ambyte-identical to upstream; it is a pure CI/packaging wrapper (.travis.yml, test/check_janus.sh, npm demo tooling). Commit→version fromconfigure.acAC_INIT:b8bebd94=0.13.4,08f25c9b=1.2.4 (actually a pre-release 1.2.4-dev snapshot, upstream master @bad60d702024-08-02,git describe=v1.2.3-11-gbad60d70),cc0fdca8=1.4.1 (exactly upstream v1.4.1),af80f7ef=0.16.1. GOTCHA: the fork ships its OWN tags named v1.2.4/v1.3.0/v1.4.0/v1.4.1 pointing at FORK commits, andgit fetch upstream --tagssilently refuses to overwrite them (exit 0) ⇒ anygit diff v1.2.4..v1.4.1in a fresh clone is WRONG; refetch via+refs/tags/*:refs/tags/up/*(same family as narrowed-fetch-refspec-stale-devel-merge). DEBUNK: upstream issue #3408 — cited in ASSRAFIPI-38 since 2024 as the relevant leak — DOES NOT APPLY: closed 2024-10-23, root cause was the Lua plugin, fixed by PR #3409 whose entire diff isg_thread_unref(g_thread_self())injanus_lua.candjanus_duktape.c, and both plugins are excluded by--disable-all-plugins⇒ the most-quoted evidence in the whole four-year chain is about code we do not compile. Upgrading 1.2.4-dev → v1.4.1 gains exactly ONE unconditionally-applicable leak fix:4419baf0(2024-12-10),janus_recorder_free()never freedrecorder->description; four others are conditional and do not apply (SVC, dummy publishers, RTP forwarders, remote publishers).4fc066ff(videoroom subscriber refcount leak inslow_link) is gated onslowlink_threshold > 0andslowlink_thresholdappears in NO FaceKom config ⇒ default 0 ⇒ disabled (caveat: Raiffeisen ships its own.jcfgvia its own Dockerfile layer — confirm on their box). No OPEN upstream leak issues affect videoroom+websockets; 14 upstream commits exist after v1.4.1, none a leak fix. Build flags--enable-post-processing --disable-data-channels --disable-all-plugins --enable-plugin-echotest --enable-plugin-videoroom --disable-all-transports --enable-websockets— the legacyvuer_build/base/janus/DockerfileALSO passes--enable-rest(HTTP transport compiled) while the newer vuer-release base does not; latent build bug in the vuer-release base janus Dockerfile: copieslibwebsockets.so.19but symlinkslibwebsockets.so→libwebsockets.so.16, which does not exist (dangling; harmless at runtime via SONAME); pinned deps aging — libnice 0.1.17 (2020), libsrtp 2.5.0, libwebsockets 4.3.2. CROSS-PARTNER: it is per-CALL, not per-unit-time — two independent confirmations: fk-dev janus idle 16 days = 20 MB RSS, and DÁP Grafana shows RSS FLAT across the whole weekend then stepping up during business hours. This finally answers the question ASSRAFIPI-38 asked in 2024 and never got answered. Raiffeisen: janus 0.13.4, AWS t3.large,maxmemory7168 MB, ~126 MB/day (longest clean run 03/05→04/28, 2%→97%), ~8 weeks to exhaustion, mitigation = manual restart only. DÁP/NISZ: janus 1.2.4, Kubernetes, 4 pods, 8 GiB limit, OOMKilled after 13 days, ~0.7 GiB/day/pod; DAP-1141 was closed on “the upgrade process has started”, never verified. Cofidis: still pinned to 0.13.4; 1 GB (2022) → 2.7 GB (2024-06) → 5 GB+ (2024-11); container once “Up 8 months”. UniCredit: build def says 1.4.1 but the running image on 2026-08-26 wasjanus:1.2.4.1-20220513⇒ build definition ≠ deployed reality. DÁP on the NEWER janus (1.2.4) leaks ~5× FASTER than Raiffeisen on the older 0.13.4 — different workloads so not a clean comparison, but the opposite of what “newer is fixed” predicts. No partner has EVER had a post-upgrade memory measurement; “upgrade will fix it” has closed multiple tickets over 4 years and has never once been verified. Fleet build defs: 1.4.1 = cib, generali-atvilagitas, instacash, magnet, microsec, nusz, raiffeisen; 0.16.1 = barion, fundamenta, granit, kh, mbh, mkb-instant, szerencsejatek; 0.13.4 = cofidis alone. RELEASE BLOCKER (actionable): janus is absent fromCOMPONENT_LISTin ALL TEN Raiffeisen release manifests (vuer-release/projects/raiffeisen/release/1..10/release.json— every one is[vuer_oss, vuer_css]); theJANUS_VERSION_COMMITfield that flips08f25c9b→cc0fdca8at rel6 (1.9.11.94) is an attribute ON the vuer_oss component (what it is built against), NOT a janus image ⇒ no janus image has ever been built or shipped to Raiffeisen; they remain on 0.13.4 — confirmed by Szabó Márton in FKITDEV-9239. Janus must be added to the build for.101or nothing changes (and even then, the upgrade alone will not stop the growth — the two are separate asks). KEEP SEPARATE: FKITDEV-9193 is a distinct, confirmed Node.js leak in vuer_ossStorageService._getInFlightCache/stream(), likely driving FKITSYS-9902 (UniCredit, OSS alone at 17.6 GB) — do not fold it into the janus story. TOOLING: validated read-only diagnostics at/Users/levander/coding/facekom/out/janus-memory/—janus-probe.js(census via the already-enabled Admin APIwss://janus:7989, adminSecretjanusoverlord,JanusAdminalready in janus-api withlistSessions/listHandles/handleInfo),roomleak.js,sessleak.js; run pattern =scpto fk-dev →docker cpinto thevuer_osscontainer →docker exec vuer_oss node /tmp/<script>.js. Decision rule for a prod census: rooms high + sessions low → rooms never destroyed; sessions ≫ concurrent calls → stranded keepalive’d sessions (expected); both low but RSS high → the leak really is inside janus. ⚠️ HONEST CAVEAT: the per-stranded-session cost (~0.5–1.5 MB) is INFERRED, not measured — real ICE/DTLS/SRTP/recorder state could not be allocated from a script (only signalling-only sessions, 31.7 kB, were measured); confirm with the prod census before quoting numbers to the customer. — janus-memory-leak-rca
2026-08-31
- FKITDEV-8279 dossier de-staled — the sequelize-fork retirement branch is PUSHED (
7664b784d0, 11 ahead / 16 behinddevel, still NO PR) and has since been validated on Oracle 19c EE, the engine partners actually run. Corrected three stale/wrong claims in the note:status: branch-complete-not-pushed@b0303af227, and the flatly false “fk-dev is reachable but the tailnet policy refuses SSH for this user” — access was obtained asops@fk-dev.taild4189d.ts.netand used for the 2026-08-09 native x86_64 run with real partner driver pins read off the partner branches (oracledb5.5.0 thick + Instant Client 23.26.2.0.0 forbb/mkb-instant, 6.10.0 forkh,tedious14.2.0 forotp/unicredit-srb,mysql23.11.3), alongside rounds on PG 16.14 + MySQL 8.4.11 (proving patches 2 and 3 are dialect-agnostic, running on every insert/update/sync()), Oracle 23ai 128-migration replay @e1603840c5, and Oracle 19c EE 19.3.0.0.0 @7664b784d0. 19c replay is numerically identical to 23ai (25+128 migrations, 0 errored, 0 skipped, 62 tables / 204 indexes, row-identical index inventory),ORA-00904reproduces in both directions ⇒ patch 1 is load-bearing on the real engine; patch 3 is inert over a repo-built schema but NOT cosmetic — reversing it over one renamed index makesModel.sync()abort withORA-01408, i.e. a failed startup for anysyncOnStart: truepartner. Two myth-busters: Oracle’s 30-char identifier limit does not apply on 19c (19 names >30, max 58, zeroORA-00972), and an engine inversion — 19c emits a bareORA-00942while 23ai interpolates the object name, so devel’s original whitelist regex already matches on 19c and commit7664b784d0is 21c+ forward-compatibility, not a live-defect repair. Recorded findings A–D with dispositions: (A) latent MSSQLTypeErroron rawsequelize.query(sql, {bind:[…]})(controlled inverse: passes upstream, fails patched; 0 of 21 raw call sites usebind:) → prevented at source via ano-restricted-syntaxESLint ban (47142d9156) instead of touching the fidelity-mandated hunk; (B)oracledb@5.5.0is broken on Node 24 (util.isDateremoved in Node 23) independently of this change, withbb/mkb-instanton^5.5.0andengines.node: ">=22.18.0"admitting Node 24 → separate ticket (6.10.0 thick verified 4/4 green); (C)bin/db/migrate-rdbms.jscannot migrate an Oracle partner —--url=makes sequelize-cli skip the config and dropquoteIdentifiers:false,sync()at:89-90repeats it, and the naivedb.optionsmerge is a trap (foldscreatedAt→createdaton Postgres, tested) → pre-existing, separate ticket; (D) 170 DDL failures silently swallowed by the migration tooling (31/0/139 across 104 of 128 migrations, identical on both engines ⇒ tooling property) → own ticket. Landing shape recorded:refs/heads/develis under ruleset #1, so this must squash-merge with afix: [fkitdev-8279] …PR title;bb/kh/otp/unicredit-srbmerge clean, onlymkb-instantconflicts and must resolve to^6.37.8(a wrong resolution fails loudly — 6.37.8 hunks can’t apply to 6.32.2 under--error-on-fail); the org-wide payoff is that the redAuditjob skipsbuildon every partner PR and this branch turns it green;patch-packagemust stay a runtime dependency (yarn install --productionprunes devDeps but still runspostinstall). Still gating: no partnerUSER_INDEXESdump, patch 3 unproven outside a synthetic case, 109 of 128 migrations were no-ops, partner data + customization migrations untested — and Szabó Márton, the recorded lead with a bb Oracle environment, was never actually asked for his run’s effective config (also the likeliest route to that index dump); FKITDEV-1208 namesmkb-instant, notbb, as the org’s validation target. Three live-verified repo facts corrected against other notes:vuer_ossDOES havePULL_REQUEST_TEMPLATE.mdat the repo ROOT (not.github/), plain LF UTF-8 (### Summary:/TÖLTSD KI/### References:/ …) — not the “CRLF de-facto template with no file” other notes claim;.github/CODEOWNERSexists but only coversclient/,customization/ui/,customization/email/(@TechTeamer/frontend) + CODEOWNERS itself (@tunderdomb), so nothing in this diff has a code owner ⇒ no auto-assigned reviewer; and PR #7710’s author isszollarp(still open, basedevel, headFKITDEV-8279, untouched since 2026-08-06). — FKITDEV-8279
2026-08-28
- Face-comparison persistence mechanism extracted as durable cross-cutting knowledge, correcting a vault half-truth that caused a wrong first diagnosis on SLARAFIPI-84 today. Verified against
vuer_oss@ tagraiffeisen-1.9.11.100. The old claim — liveness comparisons “only persist if the proto setscompareFaceWith” — holds only forstep.type: 'liveness-check-v2'. Liveness dispatches (server/queue/rpc_server/SelfServiceV2.js:208-219) into three handlers and onlyhandleLivenessCheckV2:2114→saveLivenessCheckV2Messages:1349contains persistence;handleLivenessCheck:1199andhandleLivenessCheckV1:1459never write a comparison, socompareFaceWithis inert there. Raiffeisen/myra runs v1 ⇒ the “just setcompareFaceWith” advice is a no-op and the ask is feature work. Also captured: one writer (FaceRecognitionService.createFaceComparisonModel→FaceComparison.create:152), 3 call sites not 4,statusis always'success'so failed comparisons are structurally unrepresentable (every guard failure = no row), 3 mechanisms that compute a match without persisting (CV-internal liveness, myra_isSameFacein-memory, silent guard skips),imageCategoryis not a setting but a copy ofscreenshotCategory(myra sets it tocustomer-portraiton both sides ⇒ rows mislabelled, reports keyed on it can’t tell the sides apart), and the_isSameFacefail-open (max-reduction from identity0, but0is the best value in a distance metric ⇒ missing data reads as a perfect match, silently). Marked UNVERIFIED: whether a failed/skipped NFC read can reach_isSameFacewith no target, and theperfect = 0.55figure (deployment configraiffeisen.customerPortrait.threshold, not a repo fact; code default0.5). Corrected in place: face-comparison-different-face-db-query (call-site table, mermaid, the false “status='failed'rows” claim, caveat 1), face-comparison-data-verdict-threshold-model (§3 call-site table), SLARAFIPI-84 (sharpened F3 mechanism,imageCategorycitation, 0.55 provenance) — face-comparison-persistence-paths
2026-08-25
- Documented the durable release-cut git/GitHub mechanics from executing the NÚSZ 1.9.11.48 cut: devel-update PRs land on
customization/<partner>by SQUASH merge (not bypass override) — ruleset-compliant PR title +--adminskips only red checks; changelog = direct compliant commit; source tags via API don’t build;vuer-releasedefault branch ismaster,nusz@Ntag fires Harbor. — release-cut-mechanics
2026-08-18
- FKITDEV-8931 browser-tested — one pass, one bigger finding, and three config values in my earlier entry today were WRONG. PASSES: on
mbh-servicesunderdefault.layout, a ~1.4s drop reconnected with no reload — in-memory marker survived,sessionStorageload counter stayed at 1, console loggedsocket disconnectedthen[socket] re-authenticated after reconnect, both snackbars stayed hidden. THE BIGGER FINDING — the fix does not stop the reload for longer outages: a genuine 40s outage (supervisorctl stop vuer_css) hard-reloaded the page 4× against a 502. Cause is pre-existing and untouched by the patch —onConnectionDisconnected()fires 2s afterdisconnectand starts a 1s-interval countdown ending inwindow.location.reload(); 8931 only cancels it ifconnectarrives first. The countdown length is RANDOMIZED per page load:client/ui/regions/snackbar-container/snackbar-container.twig:6→hideDelay: 10 + random(50)⇒ 10–60s (sampled live: 19, 23, 43, 54, 56, 57), effective tolerance ≈12–62s of continuous disconnection, different every load. So for DÁP the fix removes the instant reload-on-return, but a user who lingers in the DÁP app longer than the random window still gets reloaded and the flow still breaks — intermittently, the classic “works for me” profile. Open question raised for vencelvarga: suppress or extend the countdown forSILENT_REAUTH_LABELSpages rather than merely cancelling it on reconnect. CORRECTIONS to my earlier 8931 entry today (livedata-socketioSettingsbeats thedev.jsonreading):transportsis["websocket","polling"]— polling fallback IS available, not websocket-only;reconnectionAttemptsis 20, not 5, so the “after 5 it gives up and the fix never runs” caveat was overstated; andconnectionStateRecoveryNEVER ENGAGES on this deployment —socket.recoveredwasfalseon every reconnect including the 1.4s one, with a fresh socket id each time ⇒ the 30smaxDisconnectionDurationis NOT the behavioural cliff and must not be used as the test framing; the real boundary is the randomized countdown above. Method (Playwright,socketio.io.engine.close(), marker +sessionStoragecounter as the reload detector; long outages viasupervisorctl stop) plus one artifact worth not repeating: reconnecting withsocket.connect()after disabling reconnection does not fire socket.io’sreconnectevent, so the silent re-auth never runs and you end up connected-but-unauthenticated while the snackbar still clears — a test artifact, not a production path, but any manual-reconnect code would hit the same gap. — FKITDEV-8931, fk-dev-partner-branch-deploy-runbook - FKITDEV-8931 written up as its own investigation note, and Trap 1 in the fk-dev runbook tightened to the literal commands. 8931 (MKB,
vuer_cssonly — no oss side; owner vencelvarga, approved chrismakaay; YouTrack title “MKB - prodvideobankdap.mbhbank.hu SNAT teszt”): on mobile, backgrounding the browser drops the socket and the old client answered the reconnect withwindow.location.reload()— which is fatal for DÁP (Digitális Állampolgárság) login, where backgrounding is MANDATORY (you must switch to the DÁP app), so the reload fired on the happy path every time. Fix, 2 files +38/−4:client/features/auth.jsgainsSILENT_REAUTH_LABELS = ['default.layout']— matching labels callauth(socketLabel)and log[socket] re-authenticated after reconnect, falling back to reload only on failure;client/ui/regions/snackbar-container/snackbar-container.jscaptures the 2s disconnect timer asthis.disconnectTimeoutand addsconnection.on('connect')→onConnectionRestored()clearing it plusreloadCountdownIntervaland hiding both disconnect snackbars. PR #3153 (fix/FKITDEV-8931-websocket-reconnect-fix@d53612780207) open against devel, approved, 7/7 green, mergeable;fix/FKITDEV-8931-socket-test@3f32334aeiscustomization/mkb-instant+ one byte-identical commit (the deploy branch);fix/FKITDEV-8931-websocket-auth-reconnectabandoned. THE load-bearing fact: the fix fires only for socketLabeldefault.layout(default.layout.ui.js:22) —kiosk.layout(kiosk.layout.ui.js:43) and videochat still hard-reload by design, and mkb-instant is heavily kiosk-based, so a kiosk-page test shows a reload that reads as a failed fix but is out of scope → correct target ishttps://css-fk-dev.taild4189d.ts.net/→mbh-services(“MBH Bank - Szolgáltatások oldal”), which extendsdefault.layoutand is the non-kiosk DÁP path. Reconnect timing shapes the test:transports: ["websocket"](no polling fallback),reconnectionAttempts: 5(after 5 failures the client gives up and the fix never runs),connectionStateRecovery.maxDisconnectionDuration: 30000= the behavioural cliff, test both sides of 30s; css pingInterval 2000/pingTimeout 30000, oss pingTimeout 10000. Do NOT cherry-pick the FKITDEV-9199 kebab fix (cda6c80b97, PR #3146) onto this branch — not an ancestor, and the branch is internally consistent under the older convention (twigs emitdata-socketToken,auth.jsreads it case-insensitively viagetAttribute, snackbar readsdataset.sockettoken); adding kebab twigs without thedataset.socketTokenreaders breaks it — same trap as the supersededfix/FKITDEV-9194-socket-token-attribute-read(FKITDEV-9194). Deployment verified on the bundle served over HTTPS (/js/default/default.layout.js, 623 KB, HTTP 200) containingSILENT_REAUTH_LABELS = ["default.layout"]andonConnectionRestored×2. Runbook Trap 1 now carries the literal command pair —chown -R ops:ops /workspace/vuer_<svc> && chown -R 1000:1000 /workspace/vuer_<svc>/logs, per repo, plus the observed failure ordering (running only the first half put vuer_oss into a restart loop:EACCES … open 'logs/server.log'+Process exited with code 0, pid climbing,supervisorctl statusshowingRUNNING uptime 0:00:00; the second chown fixed it) and the reference techniquels -ldthe untouched sibling repo (/workspace/vuer_css/logswasubuntu ubuntu= 1000). Checklist tell sharpened:RUNNINGis not the signal, uptime is — runsupervisorctl statustwice and compare the pid. — FKITDEV-8931, fk-dev-partner-branch-deploy-runbook - fk-dev runbook round 2 — one correction and five additions, all verified live on the box after the first pass. CORRECTION (cost a restart loop): any claim that repo ownership “moved to uid 1001, the uid-1000 guidance is stale” is WRONG — the app process genuinely runs as uid 1000 (
techteamerin-container =ubuntuon host),logs/must be 1000, the rest of the tree isops/1001. PROVENANCE TRACED (corrected 2026-08-18): not doc rot, an agent artefact. The two uids coexist — tree1001:1002(hostops) AND process/logs/1000 (techteamer= hostubuntu) — they never contradicted. A vault-wide search found the stale claim in no note; it was generated by ahistoriansubagent that observed the tree live as1001:1002(correct) and over-generalised it into “this contradicts the FKITDEV-9059 note, ownership has since changed”, then carried across an agent hand-off. FKITDEV-9059:78was accurate the whole time and is vindicated, as is release-pipeline-automation-spec. The runbook[!danger]callout now names the mechanism — an agent promoting a partial live observation into “the docs are stale” — so the reader guards against that, not against the notes. SSH settled:rootANDopsboth work (rootused for the whole deploy);levander/ubuntu/admin/facekom/vuer/dev/techteamerrefused;opshas no sudo so root-owned work goes throughdocker exec -u 0:0. NEW Trap 4 —db.syncOnStartordering hazard:server/bootstrap/connection/db.jsrunsmigrate → sync → migrateon EVERY boot, so booting with the new partner’s code but the old partner’sdb.urlsilently migrates the wrong database, and supervisorautorestart=truemeans a crash during the checkout window is enough to trigger it → create the DB and rewritelocal.jsonBEFORE anything restarts. Verified clean after the fact:vuer_oss_cibhas 158 migrations, 5 CIB-only, zero mkb-only entries leaked (migration-count comparison is the isolation check on this box). NEW —local.jsonis inode-bound: it is a single-file bind mount, sosed -i/mv/git checkout --swap the inode and the container silently keeps reading the OLD file (has burned two prior sessions) → rewrite withcat >/ heredoc only. NEW — existing automation/workspace/vuer_docker/bin/vuer.sh: itscheckoutorder (git_status → server_stop → git_checkout → dev_install → server_start → dev_build) is a good ordering reference but do not use verbatim — no explicit fetch, stale hardcoded branch list (offerscustomization/mkb, notmkb-instant), nodb.urlhandling at all, and it builds AFTER starting so it serves stale assets briefly;vuer.sh db initseedsadmin/operatorwith password = username. The runbook’s recipe was reordered to stop → create DB → rewrite config → checkout → install → build → start → users. NEW verification steps: grep the bundle as served over HTTPS (curl -sk https://css-fk-dev.taild4189d.ts.net/js/default/default.layout.js | grep SILENT_REAUTH_LABELS), assert referenced assets return 200 not just the HTML (a prior session had HTML 200 with every stylesheet 404 because the build wrote nothing yet exited 0 — FKITDEV-9059), and login viacurl -sk -o /dev/null -w '%{redirect_url}' -X POST …/login→/= success,/login= failure. NEW two false alarms named so nobody re-chases them: (a) an old mtime onweb/branding/layoutsis meaningless — the.branding.cssfiles inside are overwritten in place and carry the real build time (all Aug 18 08:57); (b) mkb-instant’scustomization/listeners/verify-password-test.jsrejects only the literal stringincorrectAccordingToPasswordPolicyso it is NOT a login blocker, unlike cofidis’sverifypassword.jswhich pins a fixed password. FKITDEV-8931 scope (folded into the runbook’s box-state section): the fix fires only for socketLabeldefault.layout—kiosk.layoutand videochat still hard-reload, which is out of scope, not a regression; mkb-instant is heavily kiosk-based so a kiosk page looks like a failure — correct test target ishttps://css-fk-dev.taild4189d.ts.net/→mbh-services(usesdefault.layout, the non-kiosk DÁP path). — fk-dev-partner-branch-deploy-runbook - fk-dev partner-branch deploy runbook written — three ownership/config traps that each cost a real failure, plus the partner-swap steps the existing smoke runbook never covered. Source-verified live on fk-dev while deploying vuer_css
fix/FKITDEV-8931-socket-test@3f32334ae+ vuer_osscustomization/mkb-instant@c7ceaac2daagainst a freshvuer_oss_mkb_instantDB (box was previously oncib-9197/vuer_oss_cib, restorable from/workspace/_restore/). Trap 1 — UID mismatch: hostopsis uid 1001, in-containertechteameris uid 1000 (= hostubuntu); a blanketchown -R ops:ops /workspace/vuer_ossputs the app into a restart loop withEACCES: permission denied, open 'logs/server.log'(log4js/streamroller) → always follow withchown -R 1000:1000 <repo>/logs. Trap 2 —yarn installas uid 1001 fails with EACCES on pre-existing node_modules paths (unlink '.../csurf/node_modules/cookie/LICENSE') → run it as root inside the container then restore ownership; and piping yarn totailmasks its exit code (shell reported exit 0 while yarn had errored) → redirect to a logfile andecho $?. Trap 3 — stale partner config:config/local.jsonis bind-mounted read-only from/workspace/vuer_docker/tailscale/config/vuer_<svc>-local.json, one file per service NOT per partner, and it survives branch switches — it still held CIB’sdb.url+ a 30-entryflow.flowslist; but you can’t just delete it becauseconfig/dev.jsonshipshostsas empty strings and janus aswss://localhost:8989while fk-dev’s janus isws://localhost:8188/ adminws://localhost:7188→hosts+webrtc.janusServersare mandatory box infra, drop only the partner-specific keys. Also newly recorded: SSH asrootworks (levander/facekom/vuer/ubuntu/dev/techteamer/adminall refused by tailnet policy) — reconciles the “ops only” claim in fk-dev-deploy-smoke-runbook against the “ops+root” table in dev-build-host; the per-service tailnet names are sidecar containers, not SSH hosts (port 22 refused); box has no GitHub credentials →ssh-add --apple-load-keychain+command ssh -A root@fk-dev+GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=accept-new"(a prior session instead scp’d agit bundle— reflog still shows the removedbundleremote); repos are ops-owned while you’re root → every git command needs-c safe.directory=/workspace/<repo>; host has no node/yarn (containers: node v24.12.0 / yarn 1.22.22); vuer_css assets are gitignored underweb/{js,css,branding,polyfills,libs/pdfjs/wasm}and any client-side change is invisible untilyarn build(bin/build/build.js, ~10s); Postgres per-partner conventionvuer_oss_<partner>(existing:vuer_oss,vuer_oss_cib,vuer_oss_cofidis,vuer_oss_test) withpsql -h localhost+PGPASSWORD=dev -U dev(without-hpeer auth fails) anddb.syncOnStart: trueauto-runs the full migration chain on first boot — no manualbin/db/sync; user creationdocker exec -u 1000:1000 -w /workspace/vuer_oss -e NODE_ENV=dev vuer_oss node bin/db/create_user <role> <user> <pw> …with roles fromconfig/roles.json, the CLI takes only ONE role so the house convention isupdate users set rights='["admin","supervisor","operator"]'— the column isrights(a JSON string), there is norole/typecolumn. Verification checklist:supervisorctl statusall RUNNING with non-zero uptime (0:00:00+ climbing pid = restart loop),Web server is listening on 1008x+Socket server is listening on 1008x,curlthe sidecar → 200 (first hit ~16s while it warms), socket.io polling handshake →0{"sid":…}, and grep the built bundle for a string unique to the change. Rollback precedent/workspace/_restore/extended withcib-state-20260818-0852.txt+vuer_{oss,css}-local.json.cib.bak. — fk-dev-partner-branch-deploy-runbook, cross-linked from fk-dev-deploy-smoke-runbook + dev-build-host
2026-08-13
- Three post-Janus videochat-smoke gotchas appended to the fk-dev runbook — and the NÚSZ 1.9.11.48 smoke went GREEN (first confirmed green video on fk-dev). Discovered after signaling was fixed, these are the gap between “signaling connects” and “a real recorded call completes”. (1) Janus record-dir permission: a live call fails to record with
mkdir (/workspace/records/<roomId>/) error: 13 (Permission denied)in/var/log/janus.log— the janus PROCESS runs as non-root (techtea…= techteamer) but/workspace/recordswasroot:root 0755; fixdocker exec -u 0:0 janus sh -lc 'mkdir -p /workspace/records && chmod -R 0777 /workspace/records'; dir comes fromwebrtc.janusConfig.recordDirectory; without it recording (and room-export/conversion evidence) is broken even though the call may connect. (2) “Taking a while to load” = slow ICE gathering, NOT a hang:[WARN] Waiting for candidates-done callback... (slow gathering …)— the call DOES connect (The DTLS handshake has been completedfollows), video renders after a few seconds; optional speedupfull_trickle = trueand/or drop Janus’s own STUN/nat_1_1injanus.jcfg; TURN (turnserver.facekomtest.net:3478) reachable, DTLS completed → media flows; a raw TCP connect to :3478 returns ECONNRESET which is NORMAL (TURN isn’t plain TCP) — port-open is the signal, not a clean session. (3) Resetting oss operator passwords (dev): seeded accountsadmin/operator/supervisor(@vuer.test,isEnabled=true); login is BY USERNAME (WebServerAuth.jsUser.findOne({where:{username}}), POST/login), plaintext password, no 2FA/webAuthn/totp; the bcrypt worker (workers/bcrypt) is plainbcryptjswith NO pepper/pre-hash so a directbcrypt.hash(pw,10)verifies; reset via a node script inside vuer_oss usingrequire('bcryptjs')+require('./server/db/sequelize.js'),update users set "password"=<hash>,"passwordExpiry"=<future> where username in ('admin','operator'); gotchas — table usesisEnabled(not isActive) andpasswordExpiry(login rejected if< now), a SUCCESS login is302 → /with avuersidcookie (failure → back to/login), verifycurl -sk -X POST https://oss-fk-dev.taild4189d.ts.net/login --data-urlencode username=admin --data-urlencode password=<pw>expecting302 → https://…/, and browser autofill of a stale saved password is a common “password broken” false alarm. Smoke result: NÚSZ 1.9.11.48 videochat went GREEN 2026-08-13 — identification flow finished “Sikeres”, both operator and customer video rendered (record-only, not re-verified live) — fk-dev-deploy-smoke-runbook, facekom-build-host-fk-dev - Janus / media-server fix appended to the fk-dev runbook (verified live during the NÚSZ 1.9.11.48 videochat smoke). Symptom: browser “media server connection errored”, camera never renders. Root cause: the
januscontainer was supervisord-FATAL since fk-dev’s first boot (2026-06-30) —janus_websocketscouldn’t create the Secure WebSocket (wss) vhost (Error creating vhost for Secure Websockets server), and it kept failing even after adding certs/workspace/cert/dev.{crt,key}because the in-image libwebsockets was built without working TLS (janus built with only--enable-websockets). Ports: wss 8989 / ws 8188 (signaling), wss 7989 / ws 7188 (admin). Architecture fact that dissolves the problem: the browser NEVER connects to Janus — signaling is server-to-server (browser → vuer_css Socket.IO(wss) → RabbitMQ → vuer_oss → Janus over PLAIN ws,@techteamer/janus-apiisomorphic-ws), and media flows browser↔operator via TURN/coturn (turnserver.facekomtest.net,webrtc.turn.secret), not through the Janus WS ⇒ no browser mixed-content constraint, no need for wss on the oss→Janus hop; plainws://localhost:8188is correct/intended for dev. Fix (2 edits + restart): (1) enablews/disablewssin/usr/local/etc/janus/janus.transport.websockets.jcfg— it’s a BIND MOUNT so edit in-place inside the container (docker exec -u 0:0 janus … sed … > "$f"; a hostsed -iswaps the inode and the container keeps reading the old file — wasted a cycle), thensupervisorctl start janus, verifyWebsockets server started (port 8188)in/var/log/janus.log. (2) repointvuer_oss/config/dev.jsonkeywebrtc.janusServers.janus(NOT top-leveljanusServers— that key doesn’t exist, henceconfig.get('janusServers')=null):url→ws://localhost:8188,adminUrl→ws://localhost:7188, keepadminSecret: janusoverlord(must matchadmin_secretinjanus.jcfg); vuer_oss isnetwork_mode: hostsolocalhostis correct (janus:8188=ENOTFOUND), thensupervisorctl restart vuer_oss. Verify: WS handshake tows://localhost:8188subprotocoljanus-protocol{janus:"info"}returnsserver_info version=0.12.4; no newError connecting to the Janus WebSockets serverin/var/log/vuer_oss.log. Remaining dep: real media needs TURN/coturn reachable from the test browser. This box had never had a confirmed green videochat before; seeded operator accountsadmin/operator/supervisor@vuer.test (bcrypt-hashed, reset via bcryptjs + direct users-table update) — fk-dev-deploy-smoke-runbook, facekom-build-host-fk-dev - General fk-dev deploy + smoke runbook captured (NÚSZ 1.9.11.48 smoke, branch
chore/FKITDEV-9217-nusz-devel-update, ossd09274cb30/ css828846cc0). SSH policy:opsis the ONLY tailnet-permitted user (levander/lederera/facekom/ubuntu/dev/deploy/adminall refused);command sshmandatory (baressh=_kaku_wrapped_ssh, which injects NO user/identity — red herring). GitHub fetch on the box needscommand ssh -A+ssh-add ~/.ssh/id_ed25519(auths GitHub aswowjeeez); empty agent →Permission denied (publickey). Stack =vuer_dockercompose, source bind-mounted at/workspace/<repo>, supervisord per container, node 24.12 / yarn 1.22.22 inside as root (uid 0), no node/yarn on host. Deploy recipe: explicit-refspec fetch, reset/clean/checkout — vuer_css tree is root-owned so its git ops must rundocker exec -u 0:0(ops has no sudo);yarn install --frozen-lockfile+npx sequelize-cli db:migrate(app also auto-migrates) +supervisorctl restart; verify HTTP from the Mac (curl -sk https://{oss,css}-fk-dev.taild4189d.ts.net), fk-dev can’t resolve its own sidecars non-interactively. OpenHours is load-bearing for videochat smokes — tableopenhourstandards, default calendar =calendarName IS NULL; open withupdate openhourstandards set "from"='00:00',"to"='24:00',"isOpen"=true where "calendarName" is nullvia the app’s ownrequire('./server/db/sequelize.js')(no raw creds), thensupervisorctl restart vuer_ossto clear the cache. fk-dev was mid-FKITDEV-9059 with uncommitted WIP (MJML + FKITDEV-9200 k6) overwritten per instruction — fk-dev-deploy-smoke-runbook, dev-build-host, nusz-1.9.11.48-test-runbook
2026-08-12
-
FKITDEV-9197 CIB devel update, second half: pushed, three PRs open, CI driven to green — and two methodology corrections that are the most valuable output of the round. PRs vuer_oss #8126 · vuer_css #3152 · portal_css #712, all targeting
customization/cib. GitHub’s branch-derived default PR title fails BOTH TechTeamer ruleset regexes —Chore/fkitdev 9197 cib devel updatehas no lowercasetype:prefix and no bracketed ticket; all three had to be edited tochore: [fkitdev-9197] merge devel into customization/cib. This is structural (the branch shape the rulesets require generates a title they reject) ⇒ new checklist item, recorded in techteamer-commit-message-ruleset as trap 3; alsogh pr editresolves the repo from cwd, always pass-R org/repo. Phase 2.5 executed for real: all three repos validated inside the shipped product images (harbor.techteamer.com/facekom-devel/{vuer_oss,vuer_css,portal_css}:2026.1.UBI9.1-20220315, Node v24.12.0) in throwaway containers on fk-dev, source shipped withgit archiveand mounted, running NÚSZ stack untouched —yarn install --frozen-lockfile/yarn lint/yarn buildgreen in all three. But the product image setsNODE_ENV=devwhile jest defaults toNODE_ENV=test, which MASKS an entire class of config-loading failure —portal-client.test.jspassed in-image and failed in CI for exactly that reason ⇒ in-image results read greener than CI, treat both “passes locally” and “passes in-image” as weak evidence. fk-dev access, retested 2026-08-12:opsandrootBOTH work — the canonicalcommand ssh ops@fk-dev.taild4189d.ts.netin dev-build-host stands;levander/ubuntu/admin/facekomare refused withtailnet policy does not permit you to SSH as user "<u>"; and connect by name not IP (fk-dev+fk-dev.taild4189d.ts.netare inknown_hosts,100.91.108.61is not →Host key verification failed). Correction: this entry first recorded “root is the only permitted user”, which was an inference from four refusals withopsnever tested, not an observation. That makes THREE asserted-then-withdrawn claims in this one ticket, all the same failure mode — generalising from an experiment whose failure was never identified (four users refused → “only root works”;NODE_ENV=devstill failed → “NODE_ENV isn’t the variable”, when it failed on a missing/etc/hostname;git log -Sempty → “400 never existed”, when the pathspec didn’t follow the rename). Each was caught only because something INDEPENDENT contradicted it — a retest, a Linux container, agit log -L— none by looking harder at the original evidence ⇒ the reusable rule is not “be more careful” but “when a negative result is about to carry weight, change instrument”; collected as a callout at the end of FKITDEV-9197 §15. CI outcome: portal_css 7/7 green first run; vuer_css 6/6 green after two fixes; vuer_oss Unit Tests/Lint/Depcheck/SonarQube green after one fix, with Audit red (npm advisory 1114318 “Sequelize: SQL Injection (Oracle DB)”, the FKITDEV-8279 fork) and the SonarCloud quality gate red (an 11-month devel merge graded as “New Code” — note the split: the workflow’s own SonarQube job passed) ⇒ both are human-override cases, never fix them on a partner branch, andbuild needs: auditmeans Build was skipped. “Skipped” is not “passed” — on vuer_css’s first runBuildandSonarQubewere skipped, not failed, because bothneeds:the redtestjob, so a red gate hides everything downstream and re-reading theneeds:graph is mandatory before reporting a run. The three fixes: (1)f434bf9dbvuer_css —sso-login-endpoint.test.jsasserted 400 against a middleware returning 401;b6ea3b716(2024-10-18, FKITDEV-4987) created the guard returning400 {'Missing parameter'}so the test was right for ~6 weeks, thenc3256bc10(2024-12-03, FKITDEV-5777) swept all three error exits to401 {INVALID_AUTH_CREDENTIALS}, createdconstants.jsfor the enum and renamedroutes/sso/sso-login.js→routes/external/corporate-portal-login.js, updating only the test’srequireline — red for 20 months and nobody knew, becausecustomization/cibhad notestjob until this merge; fix = expectation → 401 + ares.jsonbody assertion + de-duplicating two identically-named tests. (2)83e4adbd2vuer_css —portal-client.test.jsdied at import withNo config files foundbecause CIB’sPortalClient.js(unlike devel’s and Generali’s) hasrequire('../../../config')at module scope forgetPortalRedirectUrl, andconfig/holds onlydev.json/docker.json; forking the test was impossible (blob byte-identical on devel, Generali and CIB),config/test.jsonwas rejected as a deployed-repo change to satisfy a test runner, and divergingjest.config-unit.jscosts the same as forking ⇒ fix = move therequireinto the method, safe becauseconfig.js(which is not side-effect-free: spring cloud config bootstrap, CORS default mutation, module-scopeconfig.loaded) is already required at boot byserver/web/WebServer.js:13,server/web/routes.js:2,server/bootstrap/connection/rabbitmq.js:2,customization/server/service/CIBSSOService.js:2+ fourcustomization/listeners/*, and the only caller ofgetPortalRedirectUrlis the HTTP routecustomization/server/web/routes/device-change-redirect.endpoint.js:34, necessarily post-boot ⇒ require-cache hit on the same object. (3)acaa597d83vuer_oss —translations.test.jsinvokes any callback not registered intest/tests/unit/translations.map.jsonwith ZERO arguments and CIB’s__infoText__doesproperty.split('.'); fix = register the portalinfoText/helpText/placeholderarg maps, no source change. THE TWO REUSABLE GOTCHAS, both of which produced confident wrong answers asserted to the user:git log -Sdoes NOT follow renames —git log -S "status(400)" -- <post-rename path>returned nothing and was read as “400 never existed in this middleware”, a false history corrected by an agent; usegit log --follow -Sor bettergit log -L <a>,<b>:<file>(a line’s entire history across renames), and this matters precisely in devel-update work because “was this test ever right?” decides whether you fix the test or the code. And macOS cannot load vuer_css’sconfig.jswithNODE_ENV=devunlessDEV_DOMAINis set —config.js:43doesfs.readFileSync('/etc/hostname')on the dev/travisci path and macOS has no/etc/hostname→ ENOENT; the damage was the reasoning, not the error: an agent setNODE_ENV=dev, saw the suite still fail, concluded “NODE_ENV is not the variable” and misattributed a genuine CI failure to a ‘nested worktree artefact’ ⇒ when a hypothesis test fails, read the actual error text — a failed experiment only refutes the hypothesis if it failed for the reason you were testing. The distinguishing move was running the same tree in the Linux product image. Three environments gave three different results for the same tree (macOS local / fk-dev in-image / CI), structurally rather than flakily. Still open for a human:getPortalRedirectUrlhas zero test coverage so fix (2) rests on the require-cache argument rather than an assertion (a device-change-redirect smoke on fk-dev would close it); the now-green SSO suite only exercises the dev-mock branch (mockSsoServeristrueindev.json,falseindocker.json) so production CIB’s passport/OAuth2 +jwt.verify+processIdpath has no cover at all — green ≠ meaningful; and nothing documents the 401-on-missing-credentials contract with CIB’s portal client, live since 2024-12-03 — FKITDEV-9197, devel-update-and-release-flow, customization-branch-ci-pipeline-inheritance, techteamer-commit-message-ruleset, dev-build-host, FKITDEV-8279 -
THE BROADEST FINDING OF FKITDEV-9197 IS NOT ABOUT CIB: three
devel-wide test-reliability defects mean a greenUnit Testsjob on vuer_oss is weak evidence — one shared suite registers ZERO tests, two others flake non-deterministically. New note vuer-oss-unit-tests-green-is-weak-evidence; all three affect every partner branch, none was changed on the CIB branch (deliberately — each belongs upstream). (1)test/tests/unit/translations.test.js:181is dead code:it.each(testSummary.entries(), (file, error) => {…})—it.each(table)RETURNS a function that must then be invoked with(name, fn), but the callback is passed aseach()’s second argument and the returned function is discarded, so no test is ever registered; the suite’s only registered tests are itsit.skip(...)calls. Verified in node directly and from CI output on a passing run (Test Suites: 2 skipped, 345 passed, 345 of 347 total/Tests: 147 skipped, 10 todo, 3515 passed, 3672 total). ⇒ everywrongKeys/missingLanguagefinding the suite computes is silently discarded for every partner; a probe replicating the suite’s own logic found 42 findings on the CIB branch that CI cannot see, mostlyflow_task_name/flow_task_instructions/flow_input_optionreturningundefinedacrosscustomization/flow/cib-*.flow.trans.js. Fixing theit.eachis a BREAKING CHANGE, not a cleanup — it converts those 42 into hard failures on CIB alone ⇒ deliberate upstream ticket with the fallout budgeted, never a drive-by alongside ascan()fix. Interaction with our ownacaa597d83: that fix is real (it stopped the suite throwing at import, which is what made the job runnable) but it bought no coverage, because the suite validates nothing for anyone — never let “translations green” read as “translations checked”. (2) thescan()relative-path bug is ACTIVELY FLAKY on devel, not merely latent: line 28’scwdis absolute (path.join(__dirname,'../../../'), used forrequire+ the map read) whileincludedDirectoriesentries go intoscan()relative and hitfs.existsSync(startPath)at line 77 ⇒ suite loading depends onprocess.cwd()at module-eval time. Evidence from production CI, same commit, same nightly “Checks for Long-lived branches” workflow (cron * 20 * * *),customization/mbh, 2026-08-11: run 31531810832 20:13 passed, 31533215070 20:29 FAILEDDirectory not found: client/features, 31536624080 21:10 passed — both runners (runnerd-techteamer-node-ci-1and-2) produce both outcomes ⇒ not one bad machine;client/featuresis real and git-tracked (215 files); also failed the NÚSZ devel-update PR (run 31485303651) while barion (31475164402) and generali (31489547911) passed; does not reproduce on macOS. History: develbfd1311aab(sonar code smells, PR #8000) changed line 28 fromprocess.cwd()to the__dirnameform, fixing therequirehalf and leavingscan()relative ⇒ the flake predates and survives it. Root cause of thecwdperturbation is UNPROVEN — noprocess.chdirin repo code; the only one reachable in the dependency tree isnode_modules/cross-spawn/lib/util/resolveCommand.js:18(chdirs tooptions.cwdbeforewhich.sync, restores in afinally) = a plausible leak window, not demonstrated. AND THE OBVIOUS ONE-LINER BREAKS THE SUITE SILENTLY:path.join(cwd, startPath)makes every returnedtranslationFileabsolute (becausescan()builds results fromstartPath) and three downstream consumers key off relative paths —require(path.join(cwd, abs))yields a doubled path,excludedFiles.includes(abs)goes false so exclusions stop working,argMap[abs]isundefinedso every arg map is silently lost; underneath that,path.joinconcatenates and does not resolve a leading/in a later segment — that’spath.resolve. Minimal correct fix keeps returns relative:scan(path.join(cwd, startPath), ['.trans.js','translations.js']).map((f) => path.relative(cwd, f)). (3) a second, independent flake:server/util/pdf.test.js › printImage › place sample PNG imagedoes a byte-for-byte PDF comparison and drifted by 3 bytes of stream length — failed on the first CI run after our push, passes on the parent commit and 3/3 locally, unreachable by our change (translations.map.jsonis read by exactly one file,translations.test.js:73), and a re-run with no content change went green ⇒ recorded as method: vuer_oss’s “Unit Tests green” was NOT first-attempt, and with two known flakes a single red run is not evidence of a regression while a single green run is not evidence of its absence. Umbrella lesson landed in devel-update-and-release-flow Gotchas and cross-linked from portal-css-jest-runs-zero-tests (the sibling — same disease, different mechanism, different repo) and customization-branch-ci-pipeline-inheritance (the trap that switches thistestjob on for a partner branch in the first place) — FKITDEV-9197 §16
2026-08-11
- The full partner
devel update → releaseflow written end-to-end for the first time — and the headline is the previously-undocumented Phase 3: collecting a release’s ticket scope WITH AUTHORS, for the TjK and for outreach. devel-update-verification-recipe covered only the verification half and is now a stub redirecting to the new devel-update-and-release-flow (all 6 inbound links preserved); everything after validation is new material. Phase 3 tool, verified and reusable:/Users/levander/coding/facekom/.claude/scripts/release_tickets.py <tag-prefix> <repo-path>… [--head REF]— resolves the latest release tag per repo fromls-remoteand fetches the tag explicitly (mandatory in narrowed-refspec clones where it isn’t local), then emits two markdown tables carrying YouTrack links, GitHub commit + PR links, state, assignee and commit author: bucket 1 = landed DIRECTLY on the customization branch (git log <tag>..HEAD --no-merges --not origin/devel) = what the partner paid for, always a TjK entry; bucket 2 = came via devel but modifiedcustomization/(git log <tag>..HEAD --no-merges -- customization/minus bucket 1) = core work that nonetheless changed the partner surface and is easy to miss entirely. Verified Generali 1.9.11.19 output vs baseline taggenerali-atvilagitas-1.9.11.18: direct = FKITDEV-8567 “Generali - reduceRight átírás” (Done, assignee Ferenc Jurkiewicz, committed by Szecsődi Imre, vuer_oss PR #7811) + FKITDEV-9194 devel-update fix (vuer_css, no PR); via devel = FKITDEV-9119 “EnvData supportedSteps törlése” (Done, Márton Szvetkó, PR #8083) + FKITDEV-9080 “WebSDK - AI ACT” (Pending — flag it, it ships anyway, Krisztián Makkai, PR #8054). Two things the tool deliberately leaves to a human: assignee ≠ commit author (both emitted — 8567 is assigned to Jurkiewicz but authored by Szecsődi), and it only sees tickets in commit subjects, so the release’s headline item can be a pure-core commit in NEITHER bucket — for .19 that is ASSGRALI-63 / FKITDEV-8887 (iOS audio) ⇒ always cross-check the parentASS*release ticket’s changelog. Phase 0 adds: establish which repos the partner is actually in (Generali = vuer_oss + vuer_css only), spot dead lines (customization/generali-kar, last moved 2022-01-24, 1754 behind — never update it), decide one ticket or two up front (dedicated FKITDEV-9073 vs folded-into-release-prep FKITDEV-9194; both acceptable), and checkremote.origin.fetchbefore anything else. Phase 1 semantic sweep now leads with deletions/renames (--diff-filter=D/R) as the highest-risk class becausecustomization/overrides bind core by path and go stale silently — vuer_css caught exactly one (deletedserver/util/aiActHelper.tsstill required by an override), while vuer_oss’s merge had 0 deletions and 0 renames, which makes the whole bug class structurally impossible and is worth measuring precisely because it tells you how hard to look. Phase 2 correction that invalidated a first attempt: the base-commit tree needs its OWNyarn install— never symlinknode_modulesfrom the merged tree, because the merge movedyarn.lockby 800 lines in vuer_oss and you end up testing the base against the wrong dependency tree; alsoyarn install --frozen-lockfilehard-fails on Node 22 (geoip-literequires >=24) whilepackage.jsonengines: >=22.18.0is stale (CI pins 24). Real fk-dev numbers inside the product image (Oracle Linux 9.7 / Node 24.12.0): basebfe85a4e68= 3 suites / 9 tests failed, merged = 2 suites / 3 ⇒ the merge net-fixes 6 tests; survivorsconverter+vuer-cv-serviceare pre-existing and environmental (vuer-cv-servicehardcodes the CI path/workspace/...). Remote-validation gotcha: ship the tree withgit archiveorCOPYFILE_DISABLE=1 tar --exclude='._*'— macOS AppleDouble._*files otherwise land in the tarball and jest picks them up as ~20 bogus failing suites. Phase 4 release gates (green ≠ ready):chore/branch merged intocustomization/<partner>via PR because the tag is cut from the customization branch;customization/RELEASE.mdentry (historically its own ticket — FKITDEV-9153 for .18); tag<partner>-1.9.11.NNwhilepackage.jsonversionstays1.9.11(the.NNlives only in tag + changelog); breaking-change/config sweep — real example: devel restructuredbrowsers.showOldBrowserWarning→browsers.oldBrowserWarning.{show,delay}andserver/web/Template.js:123now reads the new path, so any partner prod config still on the old key silently loses the old-browser warning, anddocs/config/was not updated to match (new-but-default-off:sftp,dataCleanupCron,transferRoomCron,documentRecognitionVersion,roomExportFilesExtendedName); functional smoke test on a real deployment; TjK with evidence. Phase 5, the hard lesson of this round: a devel regression (FKITDEV-9199 —dataset.socketTokennever resolving because the twigs emitted camelCasedata-socketToken) was diagnosed and a reader-side fix pushed, while the upstream fixcda6c80b97had already landed ~2 hours earlier taking the opposite approach (kebab-casing the twigs) — merging mine on top would have re-broken it ⇒ alwaysgit ls-remotefor the upstream fix right before pushing, not just before merging. Why 1083 green tests missed it: vuer_css jest runs in thenodeenvironment with no jsdom, so all DOM behaviour is hand-mocked and nothing parses a real HTML attribute — to verify DOM-coupled behaviour, render the real twig with the realtwigengine (autoescape: true, matchingserver/web/WebServer.js:257) and parse with a real HTML parser. Gotchas recorded as their own callouts: the narrowed fetch refspec (git fetch origin develwrites onlyFETCH_HEAD, exits 0, leavesorigin/develstale — nearly shipped .19 without its headline feature),--force-with-lease“stale info” in those same repos ⇒ keep the net withgit push '--force-with-lease=<branch>:<sha>', zsh eating refspecs ($B:ris the remove-extension modifier ⇒ use fully literal strings), vuer_css test files cannot be linted (eslint config references a missingjest-formattingplugin and exits 2 — henceyarn lintignoringtest/*), theyoutrack_guardhook re-arming/tmp/fk-ticket/.analyze-active, andnode_modulesnot being gitignored when it’s a symlink (trailing slash in.gitignore) ⇒ nevergit add .in such a worktree. Also noted:buildhasneeds: [lint, test, audit, sonar]so vuer_oss’s pre-existing red audit (FKITDEV-8279@techteamer/sequelize6.32.2 GHSA-v8fg-2rw7-q452, byte-identical on base) blocksbuildon every partner PR, and the CI-inheritance trap did not fire for Generali (branches already carried devel’s 6-job pipeline;long-lived-branches.yamlis schedule-only and its matrix lists devel/mbh/raiffeisen/kh/unicredit) — devel-update-and-release-flow, devel-update-verification-recipe, FKITDEV-9194, narrowed-fetch-refspec-stale-devel-merge, customization-branch-ci-pipeline-inheritance, release-process, tesztjegyzokonyv-generation-flow - Raiffeisen release 1.9.11.100 (ASSRAFIPI-135 / FKITDEV-9156) documented for the first time — payload MERGED to a release BRANCH, not tagged, and not merged back. Zero vault coverage existed for this release before today. Release branch
chore/FKITDEV-9156-raiffeisen-release-1.9.11.100in BOTH repos (vuer_css95b3e73416a10b563b260c96bd5699b9b294bd76, vuer_oss350d3e626b096456df722b8940871b41e3c74f92), cut from tagraiffeisen-1.9.11.99;raiffeisen-1.9.11.100is NOT a tag in either repo ⇒ nothing is publishable yet. Two payload tickets merged 2026-08-10 nine minutes apart: FKITDEV-8827 → vuer_oss PR #7971, APPROVED bym3szi, merged 06:36:09Z, merge commit297aa2fac1f69c15481e16acdc663edeb7414d75, base RETARGETED fromrelease/FKITDEV-8902-raiffeisen-1.9.11.95→ the .100 branch, its 3 files verified present; FKITDEV-8787 → vuer_css PR #3064, merged 06:45:11Z, self-heal verified atserver/socket/events/selfservice-v2.js:303-322+ abort clear:575. DELIVERY-ROUTE LESSON: thecustomization/raiffeisen-targeted PRs #3050 and #3051 were both CLOSED UNMERGED — for this partner payload lands on the release branch and the customization branch is reconciled afterwards, so “is it merged?” and “is it on the partner branch?” are different questions. Right now neither fix is oncustomization/raiffeisennordevel⇒ any new branch cut offcustomization/raiffeisensilently loses both. Changelog (9 rows, partner-side ids, = TjK section order): ASSRAFIPI-124 (CV document recognition v2→v3), ASSRAFIPI-119 (←8827), ASSRAFIPI-18, CRRAFIPI-106, ASSRAFIPI-92 (ImageId log), SLARAFIPI-59 (girinfo), SLARAFIPI-60 (←8787), SLARAFIPI-62 (logikai adategyezés), CRRAFIPI-115 (Liveness 2) — only rows 2 and 7 have a traced FKITDEV+PR. YouTrack fully stale: FKITDEV-8827 and -8787 both still StatePending/ BlockerReview Needed, SLARAFIPI-60 and ASSRAFIPI-119 both stillBlocked/Release needed— nobody moved anything after the merges, so they keep reappearing as unshipped release scope. Unanswered partner question now answerable: Bence Varga asked on SLARAFIPI-60 2026-07-30 “melyik release-be tud ez belekerülni?” and was never replied to — the answer is 1.9.11.100 / ASSRAFIPI-135. All facts verified viagh+git ls-remote+ an explicit-refspec fetch (mandatory in vuer_css, see narrowed-fetch-refspec-stale-devel-merge) — raiffeisen-1.9.11.100, FKITDEV-8827, FKITDEV-8787, client-registry - The partner-facing release TjK document structure reverse-engineered into a reusable spec — and it is a DIFFERENT artifact from
/fk-tjk’s template. [[tesztjegyzokonyv-generation-flow|/fk-tjk]]‘s pinnedtesztjegyzokonyv_sablon.docxis 19-placeholder substitution for a SINGLE dev ticket; the release TjK is hand-authored per release with oneHeading2section per shipped ticket — do not point the renderer at one. Structure:Title/Normal/Subtitle→ static TOC field →Heading2 Bevezetés→ repeated per-ticketHeading2 <ticket> - <title>→Heading3 Fejlesztés→Heading3 Teszteset→ optionalHeading4 Elvárt működés. Hard rule: sections use the PARTNER-side ticket id (ASSRAFIPI-/SLARAFIPI-/CRRAFIPI-) —FKITDEV-<n>never appears in a customer document (.100 map: ASSRAFIPI-119←8827, SLARAFIPI-60←8787); section order follows the release changelog, not ticket number. Evidence = oneNormalparagraph per line in Roboto Mono, color37474f, sz 21 (strongest), or inline<w:drawing>screenshots, or narrative (weakest); bulletsnumId=1/ilvl=0/ind left=720 hanging=360; numbered sub-cases are plain paragraphs not Word lists. Two traps: the TOC is a static Word field that does NOT refresh on programmatic append (must reopen in Word/Docs before PDF export), and the closing “telepítésre ajánlott … a tesztek mind sikeresek voltak” paragraph ofBevezetésIS the pass/fail statement — it must be rewritten if any case failed, never shipped over a red result. Working programmatic-append script/Users/levander/coding/facekom/.claude/scripts/tjk/append_sections_example.py(splices<w:p>before<w:sectPr>, rewrites the zip entry-for-entry, self-checks). Document is a Google Docs export (allw:rsid*=00000000) w/ Roboto + Roboto Mono embedded. Defects found in the 2026-08-10 .100 draft: body paras mis-styledHeading2/Heading3insideSLARAFIPI-59(pollute the TOC), 2 emptyHeading2s,SLARAFIPI-62both subsections empty,issuutypo. Full spec was on disk atdocs/tjk-raiffeisen-document-structure.md— folded into the vault note and retired later the same day (see the “loose facekom TjK knowledge moved into the vault” entry below) — tesztjegyzokonyv-partner-release-document-structure, tesztjegyzokonyv-generation-flow, youtrack-tesztjegyzokonyv-attachment-recipe - FKITDEV-8787 corrected on three counts — headline RETRACTION: the
"Already authorized"/"Already has some kind of room"strings are SERVER-SIDE in vuer_css, not in the FaceKom mobile SDK. Both literals are defined atserver/socket/events/selfservice-v2.js:30-32asEXCEPTIONS.ALREADY_AUTHORIZED/EXCEPTIONS.ALREADY_HAS_ROOM, and the"data": {"error": …}envelope the partner pasted — which read like a mobile-SDK log format — iscreateEndpoint’s own wire log viareportWireClientResponse, i.e. our own vuer_css log. The originalgit grepwasn’t wrong about what it searched (the strings genuinely are absent fromvuer_oss) but “absent from OSS” was generalised to “absent from the server”, skipping the socket layer in the OTHER repo — reusable lesson: on this platform “the server” is two repos, an OSS-only grep does not clear the server side. Knock-ons: recommendation C (“mobile Restart must callclearSession()”) was never the primary fix, the working-hypothesis mermaid’sSDK->>SDK: guard hits … never reaches OSSsteps are wrong (the request did reach the server and the server threw), and attribution to the Raiffeisen mobile team was misdirected — nothing was ever blocked on them. Also corrected: PR #3064 is MERGED (was recorded OPEN against the.95branch) and #3051 is CLOSED UNMERGED (was recorded OPEN/MERGEABLE). Still-open gap recorded: the fix deliberately preservescustomerId/authorization — asserted by testpreserves customerId after abort (only roomData is cleared)— so a re-register/auth on the same socket can still throwAlready authorized; only theALREADY_HAS_ROOMhalf was fixed, meaning that string in a future partner report is not evidence of regression but a different unaddressed path. Reusable design rule confirmed: for a duplicate-prevention guard, “RPC threw” ≠ “resource dead” → fail CLOSED (v1 was fail-open and a transient blip on a LIVE room would have spawned a second live room, re-creating the bug inverted). Evidence provenance (re-run today against merged code): vuer_cssselfservice-v2.test.js76/76 (12 = the 8787 cases), vuer_ossRaiffeisenFaceComparisonExportService.test.js23/23, and the untracked.dev-e2e/run-e2e.shharness in the 8827 worktree (throwawaypostgres:17-alpineon :5544 via OrbStack) produced a real dated CSV proving adifferent_facerow exports withstatus=success— end-to-end confirmation of the read-time-verdict model. Two gotchas: a worktree’snode_modulescan be out of sync with its branch lockfile (missing@babel/plugin-proposal-class-properties; switching a worktree onto a release branch does NOT re-install →yarn install --frozen-lockfilein the worktree), andrtkmanglesgit show <rev>:<path>args and swallows jest--verboseper-test lines → usepython3subprocess.run([...])argv-list andjest --json --outputFile— FKITDEV-8787, FKITDEV-8827, face-comparison-data-verdict-threshold-model, rtk-mangles-curl-and-pipes /fk-tjkREWRITTEN and its vault note de-staled — the flow is now ZERO-CONTEXT and produces two artifacts, not one. tesztjegyzokonyv-generation-flow described the 2026-06-26 sablon flow and had become the actively-misleading answer to “how do I make a TjK”; rewritten against the authority on disk (.claude/commands/fk-tjk.md). Headline rule: never carry a release number/ticket/partner in from conversation — release trains are PER PARTNER (Raiffeisen was on1.9.11.100while NÚSZ was on1.9.11.48, same day), so a borrowed version yields a correct-looking wrong document; a version in$ARGUMENTSis a hint and a disagreement with the partner’s release ticket STOPS the flow. Phases: 0historiansynthesis (live state beats vault notes, and beats the historian) → 1 partner/base/release → 2 gather → 3 evidence → 4 draft → 5 render → 6 runbook → 7 hand-off. All partners standardized on therelease-docshape (_meta.targetShapeinpartners.json, decision 2026-08-11); the 19-placeholdersablon+render_tjk.pyis now the legacy path, kept only for matching a partner’s history. Base document = the newest TjK in~/Downloads, matched by NAME (Tesztelési jegyzőkönyv/Tesztjegyzokonyv) — that is where the live Google-Docs export lands so it beats any ticket attachment, and never match by size or list position (Downloads holds CVs at ~765K next to the 763K TjK). New two-step build viaappend_release_sections.py(the oldappend_sections_example.pyname is gone):newdocrebases ANY partner’s TjK onto a new partner+release — drops the previous release’s ticket sections, clears the TOC cache, ordered longest-first partner rename (pass both forms,"Raiffeisen PION,Raiffeisen", elseRaiffeisen PION fejlesztés→NÚSZ PION fejlesztés),--replace OLD=NEWfor lowercase build tags + dates — then plain append adds sections from JSON (p/bullets/code/evidence); both modes self-check, never mutate input, both take--selfcheck. ⚠️ THE TOC LEAK (proven by real test, not theory): the table of contents is a static Word field that keeps the PREVIOUS document’s heading text until refreshed — rebasing Raiffeisen→NÚSZ leftASSRAFIPI-124/SLARAFIPI-59in the NÚSZ TOC, another customer’s ticket ids inside this customer’s document, invisible in the body;newdocnow clears the cache and REFUSES to write if anyASS…/SLA…/CR…/BUG…id from the source survives (so the TOC renders empty until a human refreshes it — mandatory hand-off step). Phase 6 is new: writesout/<partner>-<release>-teszt-runbook.mdwith per case előfeltételek / numbered lépések / elvárt eredmény with failure signature / bizonyíték naming what to capture and which TjK slot it fills / the arming condition where one exists (e.g. a bug that only reproduces on socket reuse — closing and reopening the app proves nothing, and a tester who doesn’t know reports a false pass). Evidence is regenerated, not quoted — run the touched suites and any.dev-e2e/harness in the ticket’s worktree; gotchas: rtk swallows jest--verboseper-test lines →--json --outputFileand parse, a worktree’snode_modulescan be out of sync with its branch lock (missing babel plugin) →yarn install --frozen-lockfile, andtextutilcannot read PDF →pdftotext -layout.fileStemstays per partner (customers file by name) even though the shape is shared;partners.jsongained anusz(ASSNUSZ) entry that was previously missing entirely — an unknown partner key halts the flow on step one by design. Also fixed two stale refs in tesztjegyzokonyv-partner-release-document-structure (deadappend_sections_example.pypath; the “single-ticket generator” description of/fk-tjk) — tesztjegyzokonyv-generation-flow, tesztjegyzokonyv-partner-release-document-structure, nusz-1.9.11.48-test-runbook, raiffeisen-1.9.11.100- Loose TjK knowledge moved out of
/Users/levander/coding/facekom/into the vault — standing policy: knowledge lives in the vault, only EXECUTABLE config stays in the working directory. Three on-disk markdown files were folded into vault notes so the sources can be deleted. (1)docs/tjk-raiffeisen-document-structure.md→ merged into tesztjegyzokonyv-partner-release-document-structure, which now carries the VERBATIM Hungarian closing recommendation paragraph ofBevezetésin full — the formal pass/fail statement to the bank (“…telepítésre ajánlott a<Partner>PROD környezetbe … A fejlesztői környezetben végrehajtott tesztek mind sikeresek voltak, nem volt hibás eredmény.”).<Partner>appears TWICE (both get swapped) and three quirks are real and must be preserved: the double space before the final sentence, no space inmegvalósítható("Feasible and Practical Testing"), and the comma ina fejlesztői, tesztek. Also folded in: the 6-step Authoring a new one checklist, the JSON block kinds (p/bullets/code/evidence), the fullerappend_release_sections.pyself-check list (every section heading present, no duplicated section, noFKITDEV-in a heading,--selfcheckalone verifies the tooling, input draft never mutated, fix the JSON and re-run rather than hand-editing the.docx), and two routing rules —render_tjk.pyandappend_release_sections.pybuild DIFFERENT production artifacts (pushing one shape through the other renderer yields nonsense;/fk-tjkdetects and routes) andpriorShape: nullmeans UNKNOWN, not “none” (it stays null until verified against that partner’s newest attachment). (2)docs/tjk-primer-prompt.md→ new tesztjegyzokonyv-primer-prompt: the/fk-tjk <partner>one-liner plus the standalone Hungarian prompt kept verbatim in a code fence for pasting into a fresh session, another agent, or another tool. (3)tjk-raiffeisen-1.9.11.100-sections-8827-8787.md→ new raiffeisen-1.9.11.100-tjk-sections underreleases/: the finished Hungarian ASSRAFIPI-119 + SLARAFIPI-60 sections with their evidence dumps (23/23FaceComparisonExportServiceunit tests, the real end-to-end export CSV showing adifferent_facerow atstatus=success, 76/76selfservice-v2incl. thestart → abort → startregression) and the Megjegyzések a jegyzőkönyv kitöltéséhez open list. The item not to lose from that list: the SLARAFIPI-60 fix addresses theALREADY_HAS_ROOMpath ONLY —Already authorizedis DELIBERATELY not fixed, because the socket’scustomerId/authorization is preserved by design, so a re-register/authon the same socket can still throw it (mobile A/B scenarios still need a real Myra client and have not been run). Every in-vault reference to the retireddocs/tjk-*.mdpaths was repointed (the tesztjegyzokonyv-generation-flow on-disk file table, TOPICS, this log). Unchanged and still referenced by real path:/Users/levander/coding/facekom/.claude/commands/fk-tjk.mdand.claude/scripts/tjk/*.py+partners.json— executable config does not move — tesztjegyzokonyv-partner-release-document-structure, tesztjegyzokonyv-primer-prompt, raiffeisen-1.9.11.100-tjk-sections, raiffeisen-1.9.11.100 - FKITDEV-9197 — CIB
develupdate on portal_css for release 1.9.11.102: merged, NOT pushed, no PR — and it surfaced a NEW conflict-free-merge break class.origin/devel56a63bd0→origin/customization/cibbf6dfbf8(= tagcib-1.4.0.74), merge basef3fb6be8(last sync 2025-09-11, ~11 months of drift), result merge commitb1a4bc94onchore/FKITDEV-9197-cib-devel-update, worktree/Users/levander/coding/facekom/portal_css-FKITDEV-9197. Portal is its own version train — release 1.9.11.102 but the repo’s tag iscib-1.4.0.74, so resolve baselines with thecib-1.4.0.prefix, never the vuer number. HEADLINE — the “remove unused libs” partner-merge trap: devel’s7a42894a chore(FKQA-304): remove unused libs (#675)deletedmulteranduuidfrompackage.jsonbecause core stopped using them, and depcheck on devel is structurally blind tocustomization/(partner code isn’t in the tree when the decision is made) ⇒ the removal merges conflict-free and breaks the partner. CIB genuinely needs both:customization/api/document-upload.js→require('multer')(multer.memoryStorage()) was NOT RESOLVABLE after the merge — a real runtime break, not a lint nit;customization/api/submit-login.js+submit-registration.js→require('uuid')/uuid.v4()resolved only transitively via a hoisteduuid@14.0.1against the declared^10.0.0, i.e. working by accident at a different major, caught only by eslintn/no-extraneous-require. Fix = restore"multer": "1.4.5-lts.2"+"uuid": "^10.0.0". The transitive half is the worse one — it passes today and breaks with zero partner-side changes the day the hoisting dependency moves; “it still resolves” is not a pass. Generalised check now Phase 1.4 (e) of devel-update-and-release-flow: diffpackage.jsonfor removed deps →git grepeach undercustomization/→node -e "require('<pkg>/package.json')"to catch the hoisted ones. Second break — devel’s eslint-9 flat-config migration kills partnereslint-disabledirectives: droppingcompat.extends('standard','plugin:n/recommended','plugin:jest-formatting/strict')forn.configs['flat/recommended']+js.configs.recommendedand turning offno-empty/no-unused-vars/no-redeclare/no-useless-assignmentmakes every partner suppression of those report “Unused eslint-disable directive” — a warning, andyarn lintruns--max-warnings 0⇒ red. 9 dead directives across 6 CIB customization files deleted. Counter-intuitive shape worth remembering: turning a rule OFF broke code that was complying with it. Trap in the fix:eslint --fixdoes NOT delete these lines, it blanks them to whitespace — delete properly. Two pre-existing devel defects recorded, deliberately NOT fixed (out of scope; do not misclassify as merge-caused): (1) portal_cssyarn jestruns ZERO tests and would even if you wrote some —test/tests/is empty and the custom sequencertest/lib/jest/test.sequencer.js(viatestSequencerintest/jest.config.js) has an emptyCORE_TEST_ORDERwithprepareTestsfiltering onorder.includes(relativePath); jest callssequencer.sort()before its “no tests found” check, so new files are discarded too (proven by a scratch test, then by--testSequencer=@jest/test-sequencermaking it run). A.tstest can’t even compile — no@types/jest,tsconfig.jsonincludecovers onlyserver/**/client/**/customization/**, notypes:["jest"]. Thejestscript lacks--passWithNoTestsso bare runs are hard-red; CI is green only because the workflow appends the flag ⇒ the repo has no unit-test signal, validate withlint+build. (2)eslint.config.mjsstill references'jest-formatting/padding-around-all': 'warn'after65ac214c feat: eslint 9 FKITDEV-6045removed the plugin — inert only because that block isfiles: ['test/*','test/**/*']and lint runs--ignore-pattern "test/*"; same abandoned-plugin residue as vuer_css. RTK escalation — five new silently-wrong modes, all plausible answers rather than errors:git show <ref>:<file> | grepgarbled so real matches read as absent (nearly caused a wrong conflict-resolution decision),diff -ureformatted into a line-offset view with a wrong exit code,git diff --no-indexrendered as if the whole file were new,git log -1immediately after committing showed devel’s tip56a63bd0instead of the new merge commitb1a4bc94(the merge-filtering behaviour of rtk-git-log-hides-merge-commits hitting the exact moment you check “did my commit land?”), and${PIPESTATUS[0]}blanked. Workarounds that worked:rtk proxy,git grep <pat> <ref> -- <path>instead ofgit show | grep,shasum -a 256for same-vs-different, pythondifflibfor diffs. Rule: never trust RTK-rendered git output for a verification claim — FKITDEV-9197, devel-dependency-removal-breaks-partner-customization, eslint9-flat-config-dead-disable-directives, portal-css-jest-runs-zero-tests, devel-update-and-release-flow, portal_css, rtk-mangles-curl-and-pipes, rtk-git-log-hides-merge-commits, client-registry - Two standalone release-readiness gaps split out of the release-pipeline spec as findable atomic notes. (1)
vuer_build/build.shnever publishes — verifiedgrep -n push build.sh→ nodocker push, nodocker login; v0.4.1 only builds, tags locally (harbor.techteamer.com/${PROJECT_NAME}/<svc>:${VUER_VERSION}.${VUER_BUILD_NUMBER}-${SECURITY_NUMBER}) and can export.tarinto the customer ZIP.sign-partner.shv0.1.1 wraps cosign, but signing is not publishing. The modernvuer-releasepath does publish —release-tool publish pushinautobuild.ymlwithsecrets.HARBOR_USER/HARBOR_SECRET. The actual publish mechanism for the legacy path is in no file read so far — recorded as an OPEN QUESTION, not guessed, and it sits directly on CIB 1.9.11.101, which is on the legacy path (note flags that client-registry says .102 per FKITDEV-9197 — resolve the number from the openASSCIBRelease issue /git ls-remote --tags, never from a note). Two traps re-recorded:build.sh -l/--list-partnersis broken (cd partners/at:447, real dir ispartner/) and builds fail without an operator-suppliedbase/<svc>/github.key(gitignored, README:22-28). Base OS is branch-dependent:main=UBI9,feature/FKITDEV-8868=UBI8,feature/FKITDEV-8252-ubi10=UBI10. (2) Release testing has three tiers and the middle one is empty — the per-release runbook is NOT mostly browser work, which is what the k6/Playwright framing assumes: measured against nusz-1.9.11.48-test-runbook, ~60% cannot be driven by a browser at all. Tier 1 static/hermetic (lint, unit, config schema, clean-merge-broken-product detectors) → runs anywhere; tier 2 booted non-browser (flow registration at boot §3.1, RPC, cron CLI completion §1.1, emails ACTUALLY SENDING §4.5, report/xlsx exports, DB assertions) → NO TOOLING AT ALL; tier 3 browser → 12/45 k6 files ported. Not reachable by browser tooling even in principle: iOS Safari mid-call backgrounding (§4.3) and the runbook’s own “cannot be validated in UAT” list (real disk reclaim, load profile, customer-key-offline branch). Two tier-3 limits restated: k6 cannot do file uploads at all ⇒ the attachment/S3 flow (§4.4, a P1) is unportable, andk6.ymlpasses onlyCI_DOMAIN, neverK6_BROWSER_ARGS⇒ the docker path has no fake camera/mic and no--disable-web-security— close to fatal for a video-identification product. Payoff worth acting on: a tier-2 harness that boots the app to assert against it IS option (a) of the k6 seeding blocker (“Node pre-seed step reusinghelper.ts”), so building tier 2 unblocks the 30 stalled k6 tests as a side effect — one build, two problems, which argues for tier 2 before finishing the port. Both notes linked from release-pipeline-automation-spec (open question 1 + the tier table) — vuer-build-never-pushes, facekom-test-tiers, k6-e2e-harness-vuer-oss, nusz-1.9.11.48-test-runbook, mjml-v5-esm-breaks-commonjs-email-templates - FKITDEV-9197 EXPANDED from the portal_css slice above to the FULL three-repo CIB round — and 1.9.11.102 turns out to be a PURE CORE-UPDATE release. Ticket “CIB - CIB Release 1.9.11.102 előkészítés” (In-progress, assignee andras.lederer, reporter Bence Varga, created 2026-08-05, empty description); parent ASSCIB-166 (Submitted, Bence Varga) still reads
TODO: release changelog/TODO: core update változtatások.develmerged intocustomization/cibonchore/FKITDEV-9197-cib-devel-updatein three repos, all gate-verified locally on Node v24.18.0, all solo-authored real merge commits, NOT pushed, no PRs: vuer_osse191f3f53f(amended fromb0b987d463; parents690721c316+435e520ee8; worktree nested inside the repo atvuer_oss/vuer_oss-FKITDEV-9197, not a sibling), vuer_css680a6256c(parentsb043527c7+cda6c80b9— the devel parent is the socket-token fix, so CIB takes the fixed state), portal_cssb1a4bc94(parentsbf6dfbf8+56a63bd0). Nothing was committed directly tocustomization/cibsince the last release — in all three repos the branch tip WAS the release commit (cib-1.9.11.1012026-05-29 oss/css,cib-1.4.0.742026-04-21 portal) ⇒ Phase 3 bucket 1 is empty; the only partner-requested ticket, ASSCIB-161 = FKITDEV-8887 (iOS Safari audio), was already on devel (6bdf66d16, vuer_css only) and arrives via the merge, verified withgit merge-base --is-ancestor— the same commit that is Generali .19’s headline (ASSGRALI-63), and invisible torelease_tickets.pyin both releases because it never touchedcustomization/. Drift: 11 months (last sync 2025-10-01 oss/css, 2025-09-11 portal) = 334 commits / 212 tickets, full author inventory at/Users/levander/coding/facekom/out/FKITDEV-9197-cib-1.9.11.102-tickets.md(Makkai Krisztián 44, Balázs Horváth 37, Szecsődi Imre 16, Szekeres Tamás 15 — the outreach list for TjK sections). THE DEPENDENCY-REMOVAL TRAP GENERALISED — it cuts BOTH ways, three outcomes not one fix:git merge-treecalled the files clean, devel had deletedrequest+request-promise-nativeas a tracked security action (CIB’s ownsecurity/*.mdlogged “Remove of request and request-promise-native scheduled” monthly since 2025-03), CIB code still required them ⇒ merges clean, lints clean, dies at require-time on boot. Row 1 devel removed it deliberately ⇒ PORT the partner code off it (restoring re-introduces what devel retired) — vuer_ossrequest/request-promise-native→fetch; row 2 unused-in-core only ⇒ restore the declared version — portal_cssmulter+uuid; row 3 partner-only dep devel never had ⇒ KEEP it, and this row has no detector at all because it is a conflict-resolution mistake, not a merge artefact — vuer_oss keptclamscan/soap/xml-formatter/short-uuid/uuid/zod, vuer_css keptnode-fetch/passport/passport-oauth2(the CIB corporate-portal SSO path).git diff -- package.jsoncannot distinguish row 1 from row 2 — only the removal commit’s reason can. mTLS through nativefetchneedsundici(globalfetchignoresagent, honours onlydispatcher+connect): declaredundici ^6.28.0as a new direct vuer_oss dep (already transitive viacheerio), flagged reversible vianode:https, proven 11/11 against a real client-cert HTTPS server incl. verified mTLS (clientCN: "client"). Prior art existed and was buggy — two abandoned unmerged branches byhorvathbalazshbal(update/customization/cib-2025-11-12,…-2025-12-08tip4df6666d4f“chore: core update afterworks”) had already ported 4 files tofetch, but silently droppedagentOptions, killing Infocert mutual TLS (InfocertRestAPIpasses{pfx, passphrase}at 6 sites — that port compiles, lints, and sends no client cert) and their multipart port cannot run (formData.getHeaders()doesn’t exist on webFormData;fs.createReadStreamcan’t be appended to one) ⇒ fixed rather than copied, usingfs.openAsBlob()and lettingfetchset the boundary. Lesson: mine abandoned branches for the FILE LIST, never for the diff. CI pipeline-inheritance = third confirmed instance, and on portal_css it was a SECURITY WIN: CIB carried the legacy single-joblint-and-build(blobec0a1244, byte-identical to the pre-merge Cofidis branch ⇒ one shared frozen artefact, checkable with a singlegit rev-parse <branch>:.github/workflows/pull-request.yaml) and portal_css had nopull-request.yamlat all; measured against a base worktree atbf6dfbf8, eslint exit 1 (15 problems) → exit 0 and audit 25 CRITICAL → 0 — CIB’s portal had been shipping 25 critical advisories unmeasured (tarviasemantic-release>npm,handlebars,twig>locutus×2,browserify>shell-quote) precisely because it had no audit gate. Reframe: the expansion is not automatically a tax. CIB is NOT an Oracle partner (nodb.optionsoverride, nooracledb⇒ Postgres) so FKITDEV-8279’s behavioural-swap risk doesn’t apply — but the audit gate is still red on the fork’s CRITICALGHSA-v8fg-2rw7-q452andbuildhasneeds: audit, so CI build is blocked (pre-existing on every vuer_oss branch). Gates: vuer_oss lint 0 / build 0 / depcheck clean / frozen-lockfile ok / audit 1 CRITICAL (expected) / test 3546 passed, 3 failed all pre-existing against REAL controls —translations.test.jsis CIB-only and fails identically on the pre-merge tip (__infoText__missing fromtranslations.map.json,PortalData.trans.js:978),converter/vuer-cv-service/pdffail on clean devel too — plus an import sweep of 1219 specifiers across 703 files, 0 unresolved. vuer_css lint 0 (independently re-verified) / build ok / frozen-lockfile ok / depcheck clean / audit 0 critical / test 1066 passed, 2 failed pre-existing; 53 conflicts resolved, 722 relative imports + 302 twig include targets all resolve. portal_css all green — but zero tests exist structurally (test/tests/holds a 0-byte.gitkeep; the emptyCORE_TEST_ORDERintest.sequencer.jsis a second kill-switch) ⇒ green ≠ covered, andmulteris the proof real breakage hides there. Two methodology corrections folded into the flow: (1) never symlink the mergednode_modulesinto the base worktree when deps changed —vuer-cv-serviceduly failed there withCannot find module 'request-promise-native', a failure manufactured entirely by the shortcut; give the control its own install; (2) callingjestdirectly (to dodge rtk’syarnrewriting) drops flags the npm script supplies — omitting--experimental-vm-modulesmanufactured 4 phantom failures in vuer_oss. Open for a human: push + PRs (intocustomization/cib, never devel); does portal_css even ship in .102 (ASSCIB-166’s Komponensek lists only vuer_oss + vuer_css);undicias a new direct dep; the vuer_css branding callpage-focus-visible = cib-green-700over devel’sblue-primary(site-wide focus ring, no CIB precedent) plus the videochat ScreenSign panel left on devel’s generic palette; the system-check browser-incompatibility guard is now removed (devel’s FKITDEV-6036 deleted it deliberately, CIB had re-acquired it via a merge resolution ⇒ unsupported browsers now render an error report instead of hard-failing — changelog-worthy); the CV v2→v3 swap auto-merged ungated inself-service-v2.jswhile CIB config saysidentificationLimits.compat: true(“CV 4.6”); REST ports are unit-proven, not endpoint-proven (needs a staging smoke of Infocertprocess-start+ one CORPO call); CIB’s TjK shape has never been verified (partners.jsonpriorShape: null, ASSCIB-166 links a Google-Doc “TJK Sablon”); changelog goes incustomization/RELEASE.MD— FKITDEV-9197, devel-dependency-removal-breaks-partner-customization, devel-update-and-release-flow, customization-branch-ci-pipeline-inheritance, vuer-oss-global-fetch-ignores-agent-mtls, portal-css-jest-runs-zero-tests, eslint9-flat-config-dead-disable-directives, FKITDEV-8279, FKITDEV-8947, ASSCIB-161, FKITDEV-8887, vuer_oss, vuer_css, portal_css
2026-08-08
- FKITDEV-9194 — Generali
develupdate for release 1.9.11.19: merged, validated, NOT pushed, no PR. Ticket “Generáli - Generáli Release 1.9.11.19 előkészítés” (Open, andras.lederer), parent ASSGRALI-72 whose changelog carriedTODO: core update változtatásokpending on exactly this. Branchchore/FKITDEV-9194-generali-update-2026-08-08in both repos offcustomization/generali-atvilagitas(precedent:chore/FKITDEV-9073-generali-update-2026-07-15); worktrees/Users/levander/coding/facekom/vuer_{oss,css}-FKITDEV-9194; result vuer_ossdf01e922ce, vuer_csse3c8996d4, both 0 behind live devel. Scope: Generali customization exists in vuer_oss + vuer_css only (zero refs in portal_css/esign_oss/esign_css);customization/generali-karis DEAD (last commit 2022-01-24, 1754 behind) — the live line isgenerali-atvilagitas(taggenerali-atvilagitas-1.9.11.18). ⚠️ HEADLINE GOTCHA — a narrowed fetch refspec silently merged a STALE devel:vuer_csshasremote.origin.fetch = +refs/heads/customization/raiffeisen:…(one branch), sogit fetch origin devel(bare name, no destination) writes onlyFETCH_HEADand never movesrefs/remotes/origin/devel, while printing success and exiting 0; the followinggit merge origin/develmerged a stale tree conflict-free with zero warning. The first css merge used devel @7d4f9956c8(2026-07-28) vs live3ace8872c3(2026-08-07) — 6 commits dropped incl.6bdf66d16 fix: [fkitdev-8887] recover WebRTC audio after iOS Safari interruption (#3066), which IS ASSGRALI-63, the headline changelog item of the very release being prepared. Fix: alwaysgit fetch origin '+refs/heads/devel:refs/remotes/origin/devel'then assertgit rev-parse origin/devel==git ls-remote origin refs/heads/devel;vuer_osshas a full+refs/heads/*refspec and was unaffected. Semantic breaks a conflict-free merge hid (the real work of a devel update): csscustomization/server/web/routes/waiting-room.endpoint.js:5requiredserver/util/aiActHelper.tswhich devel DELETED in favour ofserver/web/helper/getAiActData.js(asyncgetAiActData(req)→{shouldShowAiIdentificationConsent, consentDocumentUrl, consentData}) ⇒ would throwCannot find moduleon the waiting-room route — fixed by mirroring devel’s core refactor while keeping Generali’sgen-waiting-room.template.twig; csscustomization/ui/pages/gen-self-service-consent-{pep,ttny}/{*.script.js,*.ui.js}still calledauth(...)after devel’sa6185aa41 fix: [fkitdev-8846] remove duplicated socket connections (#3130)replaced it withSocketService.getConnection('<page>.script')+ a “Missing layout socket connection provider” guard — fixed to mirror core keeping thegen-*identifiers; vuer_oss clean, proven by resolving all 704 relative requires undercustomization/(only hits were commented-out placeholders, byte-identical on base) and bysupportedSteps(removed by devel’sfeat: [fkitdev-9119]) having 0 real-source references in either repo. Validation (Node 24.18.0 from/opt/homebrew/opt/node@24— repo-default v22.22.3 is below the>=24.9jest needs): css lint/build/depcheck PASS,test:unit120 suites / 1083 passed / 0 failed (base 115/1043/0 ⇒ devel’s 5 new suites all pass against Generali),improved-yarn-audit --min-severity critical0 vulns PASS; oss lint/build/depcheck PASS,test:unit4 failed / 3545 passed — all pre-existing, none merge-caused, proven on a base-commit worktree (base 10 failed: converter, self-service-v2, sms-report-service, vuer-cv-service; merged 4: converter, self-service-v2, vuer-cv-service ⇒ the merge net-fixessms-report-service), deterministic across 3 isolated runs each while full-suite runs vary from test ordering. oss audit gate FAILS on 1 CRITICAL —sequelizeGHSA-v8fg-2rw7-q452 viasequelize@npm:@techteamer/sequelize6.32.2, pre-existing (byte-identical resolution on base, which fails the same gate) = the known FKITDEV-8279 fork problem; matters becausebuildhasneeds: [lint, test, audit, sonar]so red audit blocks build (the prior FKITDEV-9073 round hit the same). CI trap did NOT apply: both Generali branches already carried devel’s full 6-job pipeline, so the “legacy 1-job partner branch inherits devel’s 6 jobs” expansion that cost Cofidis 5 failure clusters in FKITDEV-9059 was a no-op here; vuer_oss also gained a scheduledlong-lived-branches.yamlbut its matrix lists only devel/mbh/raiffeisen/kh/unicredit ⇒ Generali takes no new scheduled load. Open question: prior rounds used a dedicated devel-update ticket (FKITDEV-9073); this one was folded into the release-prep ticket — convention unsettled. First vault coverage of the Generali devel-update line (nothing existed for 9073 or 9194) — FKITDEV-9194, narrowed-fetch-refspec-stale-devel-merge, devel-update-verification-recipe, customization-branch-ci-pipeline-inheritance, customization-branches, vuer_css, ASSGRALI-63
2026-08-07
- FKITDEV-8279 — the
@techteamer/sequelizefork is retired on a branch: upstreamsequelize@6.37.8+ its three patches carried in-repo viapatch-package, a boot guard, and 30 tests. Branchfix/FKITDEV-8279-sequelize-upstream-6-37-8@b0303af227(offorigin/devel70cc97382b, fast-forwardable, 8 commits + a final fix wave) — reviewed ready to propose, but NOT pushed and NO PR opened. Option C from the analysis; supersedes vuer_oss PR #7710 (pins^6.37.7, so still carries GHSA-6457, and drops all three patches with no replacement). Shipped files:package.json(sequelize ^6.37.8,patch-packagemoved intodependencies,"postinstall": "patch-package --error-on-fail"),patches/sequelize+6.37.8.patch(177 lines / 5 files / 16 hunks),server/db/vendorPatches.js(assertVendorPatches, called fromserver/db/sequelize.js:35),test/tests/unit/db/sequelize-patches.test.js(30 tests),.depcheckrc.json,yarn.lock. Carry-over fidelity byte-verified against fork 6.32.2 unpacked from the Yarn cache (116/116 reserved words incl. order, 8/8, 6/6, 4/4, 1/1).oracledbdeliberately NOT added to core. TWO ANALYSIS CLAIMS RETRACTED — do not repeat them: (a) “the fork is invisible toyarn audit” is FALSE and was never measured (inferred from an npm advisory-API query) —develdepends on it through an npm alias, Yarn v1 audits it under the keysequelizeand submitssequelize@6.32.2, so both advisories have been reported all along; (b) “a CVSS 9.8 sat unnoticed for two years” is FALSE — GHSA-v8fg-2rw7-q452 / CVE-2026-69240 was published 2026-08-03, four days earlier, and GHSA-6457 / CVE-2026-30951 (2026-03-11) sat below the gate’s--min-severity criticalthreshold for five months; what sat for two years is the fork being abandoned (last npm release 6.32.2, 2023-10-13). The correct checkable claim: the CI Audit job is currently RED ondeveland this branch turns it green — measuredimproved-yarn-audit --min-severity critical: devel Found 1 vulnerabilities exit 1, branch Found 0 exit 0 (gate.github/workflows/pull-request.yaml:109-119,needs: [lint, test, audit, sonar], no.improved-yarn-audit-ignoreanywhere); fullyarn audit14 → 12 findings, delta exactly the two sequelize rows. Third correction: pre-existing unit failures on devel are 5, not 4 (genuinegit archivedevel install: 347/3673/5 vs branch 348/3703/5, +30 passes, 0 new failures). DECISIVE EXPERIMENT (fk-dev SSH refused → local substitute, real DBs in disposable containers): a fork-shaped Oracle schema built by hand-written DDL through raworacledb— physicalSETTINGSwith uppercaseID/CREATEDAT/UPDATEDATnext to lowercase-quoted"key"/"value"— reads fine through the patched build (SELECT id, "key", "value", …, row returned) and, with the reserved-word hunk reversed innode_modules, returnsORA-00904: "VALUE": invalid identifier, errorNum 904, from a real Oracle (md5 identical before/after the reversal). Same both-directions treatment for patch 3 (ORA-01408: such column list already indexed, 1CREATE INDEXvs 0 patched) and patch 2 on a real SQL Server 2022 (Implicit conversion from data type nvarchar to varbinary(max) is not allowed.— verbatim fork PR #1’s string); boot guard verified through the realrequire()ofserver/db/sequelize.jswith a live connection, silent patched / refuses to load unpatched. Also: 61 models synced,SettingsService.init()/loadSettings()/importSettings()green, reserved-word sweep 13/14 and query surface 7/8 (both FAILs explained — an Oracle CLOBORDER BYthat reproduces on a non-reserved column, and aUser.update()harness artifact throwing in therightsgetter with no SQL issued). STILL UNGATED — no partner smoke test:fk-dev(100.91.108.61) is reachable buttailscale: tailnet policy does not permit you to SSH as user "levander"; local drivers (oracledb6.10.0 thin,tedious16.7.1) are nobody’s production versions (bb/mkb-instant^5.5.0,kh^6.9.0,otp/unicredit-srb14.2.0) — bounded only by both connection-managers being byte-identical between 6.32.2 and 6.37.8;Model.sync()has never met a partner’s real index inventory. Merge preconditions: abb/mkb-instantboot on a restored partner schema withsyncOnStart: true, an MSSQL partner on its owntedious 14.2.0writing a NULL BLOB, and the built image actually containingpatches/. Partner merges: four of five clean, onlymkb-instantconflicts (^6.32.2vs devel^6.30.1) and must resolve to^6.37.8, not “keep ours” (a wrong resolution fails loudly — 6.37.8-stamped hunks can’t apply to 6.32.2 and--error-on-failaborts). Reusable gotchas:yarn install --check-filesis required oncenode_modules/sequelizegoes missing (plainyarn installshort-circuits on the integrity check →Patch file found for package sequelize which is not present); a missingpatches/dir is a silent no-op even under--error-on-fail(applyPatches.js:58-61prints “No patch files found”, exit 0) so the boot guard is the only backstop — don’t prune it;patch-packagemust be a runtime dependency because production images runyarn install --production(vuer_build/base/vuer_oss/Dockerfile:162,vuer-release/install/install-app.sh:19) — cost 14 new packages incl.open@7.4.2; coredevelneeds Node >= 24 (geoip-lite@2.0.3) despiteengines.node: ">=22.18.0"; jest here needs--testPathPatterns(plural);postinstall-postinstallreddens depcheck unless added to.depcheckrc.jsonignores. Process note: the final re-review could not be completed by an independent agent (3 dispatches died on API errors) — the controller verified the 3 must-fixes directly, weaker evidence, recorded as such — FKITDEV-8279, vuer_oss, FKITDEV-7973-sequelize-pool-fix
2026-08-06
- FKITDEV-9200 — Playwright→k6 E2E migration, first 12 files ported (93/96 cases) on
chore/FKITDEV-9200-e2e-k6, NOT committed (worktree/Users/levander/coding/facekom/vuer_oss-FKITDEV-9200). Ported:auditlog,compatibility-test,cronjobs,media-content,open-hours,flow-editor-list,reports/{feedbacks,users,video-calls},users/new-user,emergency-shutdown,callback-request. 3 cases dropped — allmedia-contentfile uploads: k6/browser has noFileChooser, nowaitForEvent('filechooser'), noLocator.setInputFiles(page.waitForEvent()accepts only'console'|'request'|'response').staticendpoints.test.tsdeliberately NOT ported — it exists only to collect V8 coverage and k6 has nopage.coverage.*.all.tsrestructured from concurrent scenarios into ONE sequential scenario withmaxDuration: '1h'(scenarios withoutstartTimeall fire at t=0, destroying the stateful chain). Harness came from FKITDEV-9041, nothing built from scratch: vuer_docker8ae9f0c(PR #223)k6.yml→ stockgrafana/k6:master-with-browser, mountstest/tests/k6→/e2e,run /e2e/${K6_TEST_FILE:-all.ts}, envCI_DOMAINonly; vuer_oss0e63bcd166(PR #8085, tip oforigin/devel). GOTCHA: nothing in CI verifies the k6 suite —test/tests/k6/tsconfig.jsonis separate, root tsconfig excludestest/,yarn lintignorestest/*, notypecheckscript ⇒ typecheck by hand withtsc -p test/tests/k6/tsconfig.json. Hard k6 limits (vs@types/k62.0.1):newContext()throws if one is already open (browser/index.d.ts:754-766) ⇒ 1-to-1 Browser↔BrowserContext, a second actor must be a second page, and every test MUST close its context or all later tests die; no file upload, no coverage, nopage.route(), no Node/require('server/**'), no:has-text()(uselocator('button',{hasText:'…'})). Translation rules that bite: k6 doesn’t auto-wait on navigation →Promise.all([page.waitForNavigation(), locator.click()]), but do NOT add it when the click is already followed bypage.waitForURL(...)(second waiter misses a completed navigation and hangs); Playwrightexpect()auto-retries, k6check()does NOT → retried assertions need a waiting locator. Still blocked: 30 of 45 tests seed fixtures by booting the real Node app in-process (test/tests/support/helper.tsimportsserver/db/sequelize, models,UserService,FlowService,acl) — k6 has its own JS VM; 4 options weighed, undecided, this is the gating decision. Ordering lost:playwright.config.tschains 14 projects viadependencies;OpenHoursSetupis load-bearing (setOpenHours('00:00','24:00')× 7 days — without it the vuer_css customer flow never renders its callback button). Open:k6.ymlnever passesK6_BROWSER_ARGS⇒ docker path has no fake camera/mic and no--disable-web-security(needed bycompatibility-test+callback-requestlobby; README documents them for native runs only); suite is destructive underNODE_ENV=devand can erase the DB. Vacuous assertions in the originals reproduced faithfully (hasEmailError()/hasRightsError()return!!page.locator(...); severalexpect().toHaveText()inopen-hours.test.tsmissingawait) — FKITDEV-9200, k6-e2e-harness-vuer-oss, playwright-to-k6-translation-recipe
2026-08-05
- FKITDEV-8581 / SLARAFIPI-53 (Raiffeisen girinfo) — MAJOR CORRECTION: the earlier reply was WRONG and is RETRACTED; the
waitingtask IS a real blocking GIRO gate. Established by direct code reading on vuer_ossorigin/customization/raiffeisen@ tip9fd6813dd2. Retracted claim (from the draft/Users/levander/coding/facekom/SLARAFIPI-53-reply.txt): “a ‘Sikeres’ nem feltétele annak, hogy a GIRO adategyezés lefutott… elvileg meg nem érkező GIRO mellett is el lehetett jutni ‘Sikeres’-ig.” — over-generalised, not true of current code; reporter Bihari Péter (Raiffeisen) challenged it and is essentially right. What was right:identificationStatus='verified'IS written unconditionally inonFinished()(customization/flow/myra-self-service-v2-phase-1/…flow.handler.js:240). What was wrong: that write is unreachable without passing the gate —SelfServiceV2Service.finish()(:408) returns early unlessserviceProgress==='wrapup'and has exactly one caller (:549);waitingadvances from only two sites, both requiring a terminal GIRO state (customization/listeners/self-service-v2.js:1655,customization/server/service/GirinfoService.js:90); andskip()throws (:843-846,step.required !== false; the waiting proto has norequiredkey). ⇒ no girinfo = room PARKS onwaitingand expires/fails. Refinement found while verifying: the gate is “GIRO reached a TERMINAL state”, not “GIRO succeeded” — the listener path accepts['resolved','rejected','cancelled']and parks on a falsycompareCustomerData(), while the GirinfoService path is strictlyresolvedand fails the room (selfServiceV2.fail()) on!acceptable. TERMINOLOGY TRAP = the whole apparent contradiction (customization/portal/PortalData.trans.js): fieldidentificationStatus=“Ügyfél állapot” (:80); valueverified=“Ellenőrzés sikeres” (:277); valuefinished=“Sikeres” (:286, a LATER post-e-sign state set byRaiffeisenService.esignOfferUpload) — the old reply said “Sikeres”, Bihari asked about “Ellenőrzés sikeres”, two different enum values. What actually happened in the 18 rooms (2025.07.02–2025.11.26): girinfo DID arrive (that’s what releasedwaiting); the logikai adategyezés never ran — pre-f830fd8e5athe gate advanced on GIRO resolve without callingcompareCustomerData(), which instead sat oncustomer-portrait(usually running before GIRO returned). Fixed byf830fd8e5a(FKITDEV-7667, m3szi, 2025-10-22), prod 2025-11-28, no new cases since. Thewaitingstep is not new — proto v8 (94d3ee2df6, FKITDEV-1615, 2023-10-27), so old v13/v14 rooms had it; the gap was the missing comparison call. THREE residual holes — “Ellenőrzés sikeres” still does NOT prove a real comparison: (1) eMRTD fail-OPEN by construction —GirinfoService.js:339-343returnstruewithout comparing if the eMRTD result isn’tCHECK_SUCCESS, deliberate + unit-tested (customization/test/tests/unit/services/GirinfoService.test.js:136-142asserts exactly this); plus:335development.skipCustomerDataComparisonCheck(default false,trueinconfig/dev.json); (2) gate vs room-page tile are DIFFERENT comparisons with OPPOSITE defaults — gate skips postal-code+city (:278-279, defaulttrue), the “Logikai adategyezés” tile checks them (customization/listeners/self-service-checker.js:107,110, defaultfalse) and recomputes at read time ⇒ “Ellenőrzés sikeres” + “Logikai adategyezés: sikertelen/nem elérhető” is a LEGITIMATE, EXPECTED pairing and likely what the customer is actually seeing; (3) display bugs still open —GirinfoService.js:28swallows thegirinfoStatussave error atdebug, and:69is missing anawaitonSelfServiceRoom.findByPk(bare Promise always truthy ⇒ theif (!selfServiceRoom)null-check can never fire) ⇒ tile shows “Kérés folyamatban” while the BackgroundProcess is alreadyresolved⇒ any “Sikeres + Girinfo folyamatban” query yields FALSE POSITIVES; neither open PR fixes this. NEW FINDING (flagged, NOT reproduced — may warrant its own ticket): flow proto is now v15 (…flow.proto.js:4,ce08873962, FKITDEV-9081 AI Act, 2026-07-20), task order 1ai-act/ 2-3 dynamic-id front+back / 4emrtd/ 5customer-portrait/ 6liveness-check-v1/ 7waiting/ 8data-confirmation;server/queue/rpc_server/AiActRPCServer.js:20callsfinishCurrentTask()with NO step-type check (contrastGirinfoService.js:88, which guardscurrentStep?.type !== 'waiting') and is registered (server.js:397, queuerpc-ai-act) ⇒ a late/duplicateacceptAiActRPC while the room sits onwaitingwould push it past the GIRO gate → “Ellenőrzés sikeres” with no girinfo — the one path by which the retracted claim could still be true. IMPLICATION FOR PR #7939 (feature/FKITDEV-8581-girinfo-verification-gate, still OPEN, never reviewed, merge conflicts; addsisGiroDataMatchVerified()+ anonFinishedgate): itsgiro-not-resolvedcase is now largely REDUNDANT (thewaitinggate already blocks that), and it reusescompareCustomerData()so it INHERITS the eMRTD fail-open hole; remaining value is defence-in-depth against the two bypass routes (AI Act RPC, and theisRecording-gatedselfService:flow:finishatserver/transport/session/SelfServiceTransportSession.js:290-300) ⇒ worth re-scoping before merging. Corrected reply drafted at/Users/levander/coding/facekom/SLARAFIPI-53-reply-2.md— FKITDEV-8581
2026-08-04
- FKITDEV-9022 — FIRST PUBLISH GREEN: the registry is no longer empty.
@techteamer/acl@2.0.2is PUBLISHED tonpm.facekom.net— the first package on the registry — and proven e2e:npm viewreturns it,npm install … --registry npm.facekom.netin a clean dir +require()exposesACLService/ACLError/ACLManager, and the version guard is confirmed idempotent (npm view <name>@<version>now exits 0 ⇒ the workflow’s publish step would correctly SKIP a republish). The 2026-07-22real_groups: []/ 403 blocker is retired WITHOUT the GitHub App: infra provisioned the htpasswd-backed bot accounttechteamer-ciand granted it@techteamer/*access+publish in the Verdaccio packages config — an htpasswd user’s own username lands in the token’sreal_groups, so the ACL matches with no GitHub org membership; the NPM-SH org install now only matters for future human GitHub logins / Phase-2 reads. Non-interactive token minting (what CI + rotation should use):curl -X PUT -u 'techteamer-ci:<pw>' https://npm.facekom.net/-/user/org.couchdb.user:techteamer-ci -H 'content-type: application/json' -d '{"name":…,"password":…}'— a plain PUT gives 409 “user registration disabled”, the basic-auth retry gives 201 + token;npm login --registry … --auth-type=legacyis equivalent (--auth-type=legacyis load-bearing — npm’s default web auth-type bounces into the GitHub OAuth flow the bot can’t use). Tokens are 90-day HS256 JWTs ⇒ standing rotation duty for whoever ownsFACEKOM_NPM_TOKEN. Allowlist findings — the list is narrow and drifts: the Tailscale exit nodeexit-vpn(37.76.13.180) was blocked until infra adjusted it today, and the user’s home IP had silently rotated off after Jul 22 (entries age out with no notice).fk-dev(GCP egress34.158.19.122) is also blocked, but that is irrelevant to CI — it’s the user’s personal GCP test node, completely separate from FaceKom infra, so it says nothing about the runners’ network. Runner egress tonpm.facekom.netstill needs a routine confirmation from infra (open ask #4) — never documented, no indication it’s broken. Remaining:FACEKOM_NPM_TOKENorg secret reported set by the user 2026-08-04 (not independently verifiable — reading org secrets needsadmin:org, absent from ourghtoken), runner-egress confirmation, user go → commit+push the 7 branches → compare links only, no auto-PR. Local state:~/.npmrcon the Mac now holds the bot token; the personalwowjeeeztoken is backed up at~/.npmrc.bak-9022— FKITDEV-9022 - FKITDEV-9022 (later same day) — user gave the GO: all 7 branches committed + PUSHED. Every repo is now on
chore/FKITDEV-9022-npm-facekom-publishwith the single-line messagechore: [fkitdev-9022] publish to npm.facekom.net(no body, no trailers), solo-author wowjeeez:acle16e1bd,janus-api182dfc9,mqe044ce9,video-processor39ef73d,xlsxc473103,archiver-zip-encrypted67c012e,timestamp_serviceaff10e3. ⚠️ New gotcha worth remembering — fresh clones inherit the GLOBAL git identity: the clones under/Users/levander/coding/facekom-v2-cloneshad no per-repo identity and picked up the globalandras.lederer@alpiq.com(wrong org), so the first push went out with the Alpiq author — fixed withgit commit --amend --reset-author+ force-push to thewowjeeeznoreply identity. Narrowed-refspec clones rejected a plain--force-with-lease(“stale info”) — the explicit--force-with-lease=<branch>:<oldsha>form is required. Per-repouser.name/user.emailare now set in all 7 clones.FACEKOM_NPM_TOKENorg secret reported set by the user (still unverifiable — reading org secrets needsadmin:org, absent from ourghtoken). PRs intentionally NOT opened — compare links handed to the user. Next: runner-egress confirmation from infra; PR creation/review/merge (acl’s first CI run will no-op — the version guard sees2.0.2already on the registry and skips the publish); Phase-2 consumer repoint later — FKITDEV-9022
2026-07-31
- SECOND CORRECTION (same day) — the
ts-jest@29.4.11“broken publish” claim is FULLY RETRACTED, and theignore-optionalfinding is narrowed to macOS-local (CI is green). Two things changed after further verification of the vuer_css test-infra work; both folded into jest30-ignore-optional-native-resolver with the earlier text superseded in place, plus FKITDEV-8887, vuer_css, agent-context, TOPICS. (1) ts-jest is innocent — it was a poisoned LOCAL Yarn cache entry, not a bad upstream publish. Afteryarn cache clean ts-jest+ a freshyarn install --frozen-lockfile,node_modules/ts-jest/dist/index.jsis present andts-jest@29.4.11works fine; the full unit suite passes against stock 29.4.11 (119 suites / 1051 passed / 47 skipped / 0 failures). Thedist-less artifact I inspected — containing the publisher’snpm-view.errwith an npmE404from/home/runner/.npm— existed only at~/Library/Caches/Yarn/v6/npm-ts-jest-29.4.11-<hash>-integrity/. Do NOT pin ts-jest to 29.4.10; there is nothing to pin. Real, reusable lesson that replaces it: a Yarn v6 cache entry can be silently corrupt and will be reused across installs indefinitely (nothing re-validates it); symptom is an installed package whosedist/is missing; fix isyarn cache clean <pkg>then reinstall; and a stray CI/build log (npm-view.err,*.log) inside an installed package directory is a tell-tale of a bad cache artifact, not proof of a bad publish — verify against a freshnpm packbefore blaming upstream. (2) Theignore-optionalroot cause STANDS exactly as written, but it is macOS-LOCAL, not a CI problem..yarnrc--install.ignore-optional true→@unrs/resolver-binding-<platform>never installed →require('unrs-resolver')throws “Cannot find native binding” →jest-resolve.findNodeModule()returnsnullfor every module: all confirmed. New facts: it is NOT caused by--ignore-scripts(re-tested with a fullyarn install --frozen-lockfile, scripts enabled sonapi-postinstallran — binding still absent,unrs-resolverstill fails; my intermediate--ignore-scriptssuspicion was wrong); and CI is GREEN —.github/workflows/pull-request.yamlinstallsyarn install --frozen-lockfileunder the same.yarnrc, and all 7 checks pass on the FKITDEV-8887 head commit, includingUnit Tests. So the Linux self-hosted runners resolve the binding fine and only macOS/arm64 local dev is affected. Why CI differs is recorded as an OPEN QUESTION, not an assertion (warm runnernode_modules, a different fetch path for the linux binding, a glibc fallback, or a globally-present binding — all untested). Consequently the “drop/scope the.yarnrcflag” repo-wide recommendation is DOWNGRADED to a local dev-environment workaround (npm pack @unrs/resolver-binding-darwin-arm64@1.12.2→ extract intonode_modules/@unrs/resolver-binding-darwin-arm64): changing.yarnrcis not justified by the evidence when CI is unaffected. The old[!question] Check CI before changing anythingcallout is resolved with this answer. FKITDEV-8887 status: unit suite green against stock dependencies with only the local binding added —yarn.lockandpackage.jsonare untouched by any of this, PR #3066’s 15-file diff intact — jest30-ignore-optional-native-resolver - CORRECTION — the vuer_css
yarn test:unitbreakage is.yarnrcignore-optional, NOTts-jest@29.4.11. Yesterday’s diagnosis was wrong and has been rewritten across the vault. Real root cause (verified): vuer_css’s.yarnrccontains--install.ignore-optional true; Jest 30’sjest-resolve@30.4.1depends onunrs-resolver@1.12.2, which ships its platform-specific native binding as an optionalDependency (@unrs/resolver-binding-darwin-arm64on Apple Silicon,@unrs/resolver-binding-linux-x64-gnuelsewhere).ignore-optionalskips it →require('unrs-resolver')throws “Cannot find native binding” →Resolver.findNodeModule()returnsnullfor EVERY module — verified null forts-jest,jest-circus,lodash, andjest-resolveitself. Jest reports whichever module its config mentions first, which is why it masqueraded as a ts-jest fault and why swapping ts-jest versions changed nothing; thejest-circus/build/runner.js not founderror recorded yesterday as “a second unrelated break” is the same single root cause. Diagnostic one-liner worth keeping:node -e "const R=require('jest-resolve').default; for (const m of ['lodash','jest-resolve']) console.log(m, R.findNodeModule(m,{basedir:process.cwd()}))"— bothnull⇒ missing native resolver binding, not a per-package problem. Local workaround (node_modules only, nopackage.json/yarn.lockchange):npm pack @unrs/resolver-binding-darwin-arm64@1.12.2, extract, copy the package folder tonode_modules/@unrs/resolver-binding-darwin-arm64. ⚠️ Repo fix to consider (WITHDRAWN — see the correction bullet above): “drop or scope--install.ignore-optional true, since jest 30 now genuinely needs an optional native dep — check CI first: if CI installs with the same.yarnrcits unit tests are broken too; if CI is green, CI installs differently.” CI turned out to be green, so no repo change is justified. Result:yarn test:unitruns clean on the merged FKITDEV-8887 branch — 119 suites passed, 1051 tests, 47 skipped, 0 failures. ⚠️ “What survives about ts-jest” (FULLY RETRACTED — see the correction bullet above): “29.4.11’s registry tarball genuinely has nodist/and ships the publisher’s CI failure log asnpm-view.err(npmE404,/home/runner/.npm) … still worth pinning29.4.10.” The registry tarball is fine; that directory came from a corrupt local Yarn cache entry. Do not pin ts-jest. Notets-jest-29411-broken-publishrenamed → jest30-ignore-optional-native-resolver and rewritten; corrected FKITDEV-8887 (dated section), vuer_css (## Testingcallout), agent-context (vuer_css gotchas), TOPICS — jest30-ignore-optional-native-resolver
2026-07-30
- FKITDEV-8887 — PR #3066 devel catch-up merge done (staged, NOT committed) + a devel-wide unit-test blocker found. vuer_css
fix/FKITDEV-8887-ios-audio-resumewas 23 commits behindorigin/devel; onlyyarn.lockconflicted —package.jsonauto-merged cleanly (devel’sresolutions+ the branch’sbrowserify/shell-quote: ">=1.7.3"audit fix both survived). Resolved by house precedent: regenerate, don’t hand-merge —git checkout origin/devel -- yarn.lockthenyarn install --ignore-scripts --non-interactive(Yarn Classic 1.22.22). Verification trick worth reusing: diff the regenerated lock against the target branch, not against the conflict — the result differed fromorigin/develby exactly 4 lines (shell-quote1.9.0 → 1.10.0, key becomesshell-quote@>=1.7.3, shell-quote@^1.6.1), proving the branch’s critical-audit fix is preserved and nothing else churned; post-merge the branch differs from devel by exactly the PR’s 15 files.yarn lintclean. Merge left staged/uncommitted (analyze gate — commit only on explicit go, same as the rest of the ticket). NEW GOTCHA (own note):yarn test:unitnow fails withValidation Error: Module ts-jest in the transform option was not found. ⚠️ The ts-jest root cause recorded here was WRONG — superseded by the 2026-07-31 entry below; see jest30-ignore-optional-native-resolver. (Original text, kept for the audit trail: “ts-jest@29.4.11is a broken upstream publish… local unblock =npm pack ts-jest@29.4.10… second, unrelated breakjest-circus/build/runner.js not foundsits behind it”. All three claims are false: the ts-jest tarball is fine (thedist-less copy came from a corrupt local Yarn cache — see the 2026-07-31 second-correction entry), it was not the cause, and thejest-circuserror was the same bug, not a second one.) Re-confirmed repo trap:~/coding/facekom/vuer_csshas a narrowed fetch refspec (onlycustomization/raiffeisen) →git fetch origin devel:refs/remotes/origin/develexplicitly. New note (since renamed + rewritten) jest30-ignore-optional-native-resolver; updated FKITDEV-8887, vuer_css, agent-context — FKITDEV-8887
2026-07-27
- FKITDEV-7973 sequelize pool fix — PR #7852 review state captured (view-only, nothing written to GitHub). vuer_oss PR #7852 (
feature/FKITDEV-7973→devel, author wowjeeez) is open +mergeable_state: blocked, tip7da69cba85(2026-04-01) ~58 commits behind devel, PR body still holding theTÖLTSD KIplaceholder. One review thread onserver/db/sequelize.js:27(the new{max:10,min:2,idle:10000,acquire:30000,evict:10000}block), three comments: (1) Pocok256 2026-05-06 + CHANGES_REQUESTED — the 1s default evict sweep is fine (so theevict:10000override is unwanted) and he’d raisemax(“anno a 100 is kevés volt”); (2) bencevarga666 2026-07-01 + CHANGES_REQUESTED — rebuts raising max: 7 processes share the pool, keep it bounded to avoid saturation, consider per-process pool configs, stay below the DBmax_connections, and per the PostgreSQL wiki few concurrent connections is better; (3) Pocok256 2026-07-27 + COMMENTED (newest) — concedes: counting only 7 processes understates it since CLI/other tooling open their own connections, somax:10is sufficient, andmincould be 0 if idle connections close on a ~1s cadence (ambiguous whether he meansidle:1000or the defaultevict— his May comment points at evict). Net:max:10settled; open asks = dropevict:10000, considermin:0; both CHANGES_REQUESTED reviews stand ⇒ PR stays blocked until changes + re-review; PR body needs filling; branch needs a devel catch-up. Still unaddressed from the ticket: Bence László’s “enableoptions.logging+benchmark, measure before finalizing numbers” —loggingis hardcoded after the config spread sodb.options.loggingis non-overridable, which blocks the measure-first step. Note status flippedimplemented→in-review-blocked— FKITDEV-7973-sequelize-pool-fix - FKITDEV-7973 (later same day) — review feedback ACTED ON, commit pushed.
c89124e29cfaecc3e19dd00def53f26f9302e4a5“fix: set pool min to 0 and use default evict interval” pushed solo-author (Andras Lederer) tofeature/FKITDEV-7973; PR #7852 head now at that SHA (was7da69cba85). Change = 2 files, +4/−6:server/db/sequelize.jsand its mirrortest/lib/utils/db.utils.js(the test harness duplicates the pool config — both must move together) getmin: 2→min: 0and theevict: 10000override deleted so Sequelize’s default 1s evict interval applies;max: 10/idle: 10000/acquire: 30000unchanged (acquirelost its trailing comma, now last property, standard-style). That is exactly Pocok256’s 2026-07-27 condition (“min could be 0 if idle connections are closed on a 1s cadence”) plus his May ask (default 1s check is fine) — one change, sincemin: 0is only safe because the sweep is fast; the earlieridle: 1000-vs-evict-default ambiguity was resolved in favour of evict, leavingidle: 10000untouched. Verified:node --checkboth files OK;eslint --max-warnings 0on both files exit 0 (ESLint 9 flat config via FlatCompat/standard);git showdiff shape confirmed; remote ref + PR head both atc89124e2. Worktreevuer_oss/.worktrees/feature/FKITDEV-7973kept. New repo gotcha captured: the packagedyarn lintscript passes--ignore-pattern "test/*", so test files are NOT covered byyarn lintor the CI lint gate — lint them explicitly with./node_modules/.bin/eslint <paths>(the flat config does define atest/**block, so explicit invocation works). Still open / deliberately untouched: PR staysmergeable_state: blocked— both CHANGES_REQUESTED reviews (Pocok256, bencevarga666) still stand and no re-review was requested, no PR comment posted; PR body Summary still theTÖLTSD KIplaceholder; branch still ~58 commits behind devel; Bence László’soptions.logging+benchmarkmeasure-first guidance still unaddressed (loggingstill hardcoded after the config spread ⇒db.options.loggingnon-overridable). Note status flippedin-review-blocked→review-feedback-addressed— FKITDEV-7973-sequelize-pool-fix
2026-07-24
- FKITDEV-9022 npm.facekom.net — publish workflows must run on SELF-HOSTED runners. Discovery:
npm.facekom.net(public IP 92.119.122.189, resolves publicly) is IP-allowlisted at nginx → the whole site returns 403 from outside the FaceKom network; the 2026-07-22 recon 200s only worked via the user’s VPN egress. So GitHub-hostedubuntu-latestrunners can never reach the registry → publish workflows must run on the FKITDEV-8981 self-hosted pool. Change applied (2026-07-24, uncommitted/unpushed): all 7publish.yamlswitchedruns-on: ubuntu-latest→[self-hosted, node](lowercase — the live 8981 label; pool active since ~2026-06-24, proven by 5 merged vuer PR-check migrations);setup-node@v6kept (fleet pattern = per-run Node provisioning); 6 workflows byte-identical to acl’s, timestamp_service differs only by its 2working-directorylines. Open infra asks (one msg to Bence/infra): (1) install the NPM-SH GitHub App on the org (fixesreal_groupsfor all logins); (2) bot-account token forFACEKOM_NPM_TOKENorg secret (90-day rotation); (3) confirm the runner group covers the 5 lib repos 8981 never touched — acl, video-processor, xlsx, archiver-zip-encrypted, timestamp_service (an unavailable label queues jobs forever, silently); (4) confirm the runners’ network can reachnpm.facekom.net(never documented; gh API introspection needsadmin:org→ 403 for us). Caveat:xlsxbuilds viamake→ runner toolchain beyond git+Node undocumented, first-run failure possible. Cross-ref: FKITDEV-8981 mq #101 / janus-api #50 PRs still OPEN but touchpull-request.yaml(different file, no conflict with publish.yaml) — FKITDEV-9022
2026-07-22
- FKITDEV-8387 STRATEGY REVERSED:
.jsshims → DIRECT RENAME. After reviewer feedback on vuer_oss PR #8059, the shim plan (B) was dropped for plan A: entrypoints are now real.tsfiles invoked ascommand=node server.ts, no shims. Landed across vuer_oss (7 entrypoints), vuer_css + portal_css (1 each),vuer_build(75 supervisor confs) andvuer-release(12); all three code PRs CI-green 8/8. Five durable findings: (1) Node type-stripping floor is 22.18, NOT 22.6 — 22.6 needed--experimental-strip-types; empiricallynode:22.6on a.tsfile →SyntaxError: Missing initializer in const declaration,node:22.18runs it; repos pinengines >=22.18.0, images/CI use 24.x, butvuer-releasepins a floatingNODE_VERSION: 22. (2)soap_server.jssuffix trap —vuer_oss/server/logger.jspicks the log4js channel viaprocess.argv[1].endsWith('server.js')and'soap_server.js'.endsWith('server.js') === true, so bb/kh’s SOAP entrypoint was silently inheriting thevuerchannel; the rename dropped it tounknownwith no error → fixed toendsWith('server.ts') || endsWith('soap_server.js'); general lesson = suffix-matching entrypoint dispatch is fragile under rename. (3) RELEASE BLOCKER — unversioned partner supervisor overlays:vuer_build/partner/*/vuer_oss/DockerfiledoesFROM harbor…/vuer_oss:${VUER_VERSION}(version-pinned app) thenCOPY supervisor_vuer_oss_docker.conf(unversioned, frommain) ⇒ conf and app version decoupled → flipping the confs breaks rebuilds of older release tags, and ~94origin/customization/*branches still carry.jsso each partner breaks on its next build until it merges devel; not fixable by merge ordering. Mitigations: hold the build/release merges until the first release tag with the rename is cut, delete redundant overlay confs so partners inherit the base image symlink to the app’s own conf, or make overlays release-aware; merge hazardscustomization/kh(edits both confs) +customization/nusz(editsserver.js/cron.js→ rename+modify). (4) depcheck CI-only false positive on vuer_css@emotion/is-prop-valid— the literalrequire()lives in the 865 KB minifiedweb/sdk/web-sdk.js:205, which CI’s depcheck can’t parse (OOM/timeout) and then treats as having no requires; suppressed via.depcheckrc.json, and removing the dep would be wrong (flips to “missing”). (5) queueoptionalflag is NOT dead code — multi-connection MQ is live (server.ts:465,background.ts:197,bin/attachment.js:52readesign.queueConnection+connectionPool.hasConnection()), so the FKITDEV-3191 ECONNREFUSED swallow covers a real partner setup (external eSign RabbitMQ down at boot); a “dead code” deletion was reverted. Plus the TechTeamer commit ruleset (^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(!)?(\([^)]+\))?: [^\n]{1,100}) rejecting defaultgit revertsubjects + >100-char subjects. New notes unversioned-partner-supervisor-overlays, techteamer-commit-message-ruleset, depcheck-false-positive-minified-bundle, vuer-oss-optional-queue-connection; updated FKITDEV-8387, typescript-in-vuer-repos, entrypoint-rename-blast-radius — FKITDEV-8387 - FKITDEV-9022 npm.facekom.net — VPN worked, registry recon done + hard publish blocker found.
npm.facekom.net= Verdaccio 6 behind nginx (titled “Facekom npm”, pluginverdaccio-github-oauth-ui), currently EMPTY (no packages; anon reads 401, UI listing[]). Login flow = GitHub App “NPM-SH” (client_id Iv23liP34v8mLsDTgEkF, TechTeamer-owned, “Self hosted verdaccio”) → web UI hands anpm config set //npm.facekom.net/:_authToken <JWT>snippet. Token = HS256 JWT (claimsreal_groups/name/groups), 90-day expiry → theFACEKOM_NPM_TOKENorg secret needs 90-day rotation (prefer a bot/service account). BLOCKER: userwowjeeezauthenticates (npm whoamiOK) but@techteamer/aclpublish → 403 “not allowed to publish” because the token’sreal_groups: []— the NPM-SH GitHub App is authorized for the user but NOT INSTALLED on the TechTeamer org, and user-to-server tokens only surface memberships for orgs where the app is installed. App is private (no public Install button) → a TechTeamer org admin must install via https://github.com/apps/NPM-SH/installations/new, then the user re-logs-in to mint a token carrying the org group. Validation (dry-run green):aclbuilds the CI way withyarn install— NOTnpm install, which trips an ERESOLVE peer conflict (eslint 10vseslint-config-standard) that Yarn Classic v1 silently ignores (repo has noyarn.lock);npm publish --dry-runroutes tohttps://npm.facekom.net/, restricted access, tarball 35 files / 9.8 kB. In progress (uncommitted): fanning the acl pattern (canonicalpublish.yaml+publishConfigwith trailing-slash registry URL) tojanus-api,mq(canonical workflow chosen over its semantic-release),video-processor,timestamp_service(rename →@techteamer/timestamp-service+ dropprivate:true), plus fresh clones ofxlsx+archiver-zip-encrypted; all onchore/FKITDEV-9022-npm-facekom-publishbranches, no commits/pushes yet — FKITDEV-9022 - FKITDEV-9022 (later same day) — fan-out COMPLETE: all 7 repos carry the publish setup locally (uncommitted/unpushed;
xlsx+archiver-zip-encryptedfreshly cloned; everypublish.yamlbyte-identical to acl’s, all dry-runs →npm.facekom.net/restricted). timestamp_service rename SUPERSEDED: it’s a Yarn-workspaces monorepo — root staysprivate:true(yarn refuses workspaces otherwise) and isn’t the lib; the real package ispackage/timestamp_service→@techteamer/timestamp@2.0.2(consumers vuer_oss/esign_oss depend on^2) → no rename anywhere, publishConfig on the inner package, workflow = canonical +2working-directorylines (install stays at root). Quirks: archiver’s committed.npmrc(npmjs) loses to publishConfig (tested); xlsx = SheetJS fork, builds viamake, tab-indented package.json. Remaining: auth path (user leaning: infra-minted bot token forFACEKOM_NPM_TOKENinstead of NPM-SH org install), org secret, user “go” for commit+push, compare-link PRs, Phase 2 after consumer repoint — FKITDEV-9022 - FKITDEV-9059 (Cofidis) — MJML v5 ESM upgrade silently broke cofidis email templates (green CI / broken runtime). The devel→cofidis merge pulled in FKITDEV-8727 MJML v4→v5 (
c9602a519e), which is ESM-only →server/e-mail/EmailService.jsnowawait import(...)s letter templates. Node 22 auto-detects anycustomization/email/*/*.letter.data.jsthat mixes a top-levelimportwith arequire()as ESM →ReferenceError: require is not definedatEmailService.init→ the letter type never registers and its email never sends. Debugging trap: the naive scope was “41 of 49 files containrequire(” — WRONG; a pure-CommonJS file (noimport) loads fine, only the 6 mixed files are at risk, and 5 of those had acreateRequire(import.meta.url)shim so onlye-mail-invite(bare require, the registration invite) actually crashed at boot — matching the box log. Fix =require()→ ESMimport(relative specifiers need explicit.js; named imports resolve againstmodule.exports = {}via Node’s CJS named-export detection) in all 6; committed solo-author52a0843a1eonchore/FKITDEV-9059-cofidis-update-2026-07-13-fixes(parent6fac58ba4b), NOT pushed; verified on fk-dev (letter-registration errors 3/boot → 0). CI missed it because unit tests never boot EmailService. Reusable: after any ESM migration of a shared loader, grepcustomization/for mixed import+require. New note mjml-v5-esm-breaks-commonjs-email-templates — FKITDEV-9059 - FKITDEV-9059 (Cofidis) — FaceKom dev email lands in a baked-in Mailtrap Sandbox inbox (it’s not “not sending”).
config/dev.jsonemail.transport.SMTPbakes a Mailtrap Sandbox inbox (hostsmtp.mailtrap.io[legacy; currentsandbox.smtp.mailtrap.io], port 2525, user643414e4c00185), so on any fresh dev box registration/verification mail is delivered — into the original-dev/shared inbox you can’t see. Route it to your own inbox by overridingemail.transport.SMTP.host→sandbox.smtp.mailtrap.io+auth.{user,pass}in the bind-mountedvuer_docker/tailscale/config/vuer_oss-local.json(getconfiglocallayer;config/docker.jsonis never loaded underNODE_ENV=dev). Sandbox creds only auth againstsandbox.smtp.mailtrap.io, not legacysmtp.mailtrap.io. Product distinction: Sandbox =sandbox.smtp.mailtrap.io+ per-inbox user/pass (~14 hex), catches all mail; Email Sending (live) =live.smtp.mailtrap.io+api/32-char token, delivers for real (wrong for testing). Verify withnodemailer.verify()+ testsendMailfirst (require nodemailer by absolute path/workspace/vuer_oss/node_modules/nodemailer— ESM import from/tmpcan’t resolve app node_modules). New note mailtrap-sandbox-inbox-dev-email; sibling sms-verification-code-dev-testing — FKITDEV-9059
2026-07-20
- FKITDEV-9059 (Cofidis devel update) — two reusable findings extracted from the per-ticket dossier. (1) Partner branches inherit devel’s full CI pipeline on their first devel-merge — systemic, will recur: legacy
customization/*branches ran a single job (lint-and-build, oldpull-request.yamlblobec0a1244); devel’s current workflow (blobdda79403) runs lint / test / audit / depcheck / sonar / build, so four jobs execute on the partner branch for the very first time, surfacing years of latent breakage in one PR. On cofidis: 5 failure clusters, only 2 merge-introduced, the rest dating 2017–2024. Two structural amplifiers recorded as architectural constraints: partners fork core source files in place (no override layer — e.g.server/service/FlowLiveUpdateService.js, whose fork then violates the core unit test) and there is no customization-aware unit-test layer (jest.config-unit.jsmatches onlytest/tests/unit/**, no per-partner test dir) so a partner-specific test fix must diverge a shared core test file, which then conflicts on every subsequent devel merge — a recurring tax. (2) CVE-2025-7783 / GHSA-fjxv-7rqg-78g4 — criticalform-data@2.3.3(unsafe random multipart boundary, patched>=2.5.4) via EOLrequest@2.88.2which hard-pinsform-data: ~2.3.2; absent from devel (Audit green) becauserequestis live partner code (vuer_osscustomization/api/sms/SmsCofidis.js; vuer_csscustomization/server/web/api/{login,register,partner-register}.endpoint.js); confirmed red oncustomization/cofidis(#3100/#8040),customization/kh(#3098),customization/raiffeisen(#8055) ⇒ blocks every partner branch adopting the new pipeline. Interim fix in the repos’ existing house style (they already pincsurf/cookie,twig/minimatch,ts-jest/handlebars):"request/form-data": "^2.5.6"inresolutions+yarn install; real fix = drop EOLrequest(4–5 call sites) as a separate ticket. Debugging trap recorded: the Audit job’sERROR: Unable to parse yarn audit output: SyntaxError …+ Node 24DEP0169 url.parse()lines are cosmetic —improved-yarn-auditmerges child stdout+stderr into one NDJSON stream so the deprecation warning corrupts lines and the tool silently skips them; the same errors appear on green devel runs (proof: vuer_oss PR #8062, job87891787317,Found 0 vulnerabilities, success). Exit code comes solely from the real advisory count — an initial diagnosis in-session got this wrong before deeper checking corrected it. New notes customization-branch-ci-pipeline-inheritance + cve-2025-7783-form-data-via-request; cross-linked from FKITDEV-9059, ci-github-branch-audit-chronically-red, customization-branches — FKITDEV-9059
2026-07-13
- Drafted NÚSZ 1.9.11.48 test runbook (payload ASSNUSZ-76 + devel-update regression + AI-Act) — TJK source — nusz-1.9.11.48-test-runbook
- Build/test host MIGRATED:
ssh Facekom→fk-devTailscale VM (verified 2026-07-01). The on-prem box behind thessh Facekomalias (~/.ssh/config:HostName localhost,User lederera,ProxyJump FKJumpBox→root@lederera-447-fk-hardver) is DECOMMISSIONED — Tailscale reportslederera-447-fk-hardveroffline, last seen ~2026-06-27. Per user: “never use the ssh Facekom host again, we need to use the tailscale fk vm” →fk-dev(100.91.108.61,command ssh ops@fk-dev.taild4189d.ts.net, Tailscale SSH, no keypair, no jump box). Unchanged guidance: still build native x86_64 on the remote host, NOT emulated on the Mac (qemu SIGSEGV exit 139 / overlay-FS I/O exit 125 / EPEL metalink 503s) — only the host moved. Agent gotcha (re-confirmed): the user’s shell aliasesssh/scpto a_kaku_wrapped_sshfunction that is not loaded in a non-interactive shell → usecommand ssh/command scpfor the raw binary. Other tailnet peers (oss-fk-dev100.91.55.42,css-fk-dev,portal-fk-dev,esign-oss/css/api-fk-dev,css-sdk-demo-fk-dev) are per-service Tailscale sidecars on fk-dev, not separate build hosts. New canonical note dev-build-host; updated the docs that prescribed the old host: agent-context (dev-env table + warning), infrastructure (Remote Server section; the dnsmasq100.103.48.49/*-lederera.facekomdev.netchain died with the box — MagicDNS now), release-automation-design (vuer_buildbuild.sh/sign-partner.shrun on fk-dev), nusz-1.9.11.47 (cut checklist), FKITDEV-8252 (UBI10 native-build host), FKITDEV-8959 (test host), instacash-esign-dev-box-deploy, dev-box-cv-photo-processing-failures, dev-box-esign-container-startup-failures-2026-06-01 (oldFacekom/FKJumpBoxtopology struck through), instacash-external-api-esign-headless-test-2026-06-01, FKITDEV-8787 (pending functional verification must be redone on fk-dev), plus facekom-v2dev-environment/working-on-facekom/VERIFICATION— dev-build-host - FKITDEV-8387 implementation, Task 6 (vuer_css) — second repo in the multi-repo
.ts-shim rollout (Tasks 1-5 covered vuer_oss’s seven entrypoints separately). Singleserver.jsentrypoint shimmed torequire('./server.ts');vuer_css/server/logger.jsuses a static log channel list (noprocess.argv[1]sniffing, unlike vuer_oss) so no logger change needed — a notable repo-to-repo difference. 4 files touched (eslint.config.mjs,tsconfig.json,server.ts<void>Promise fix,bin/server/server.task.jswatch list).tsc/eslint/yarn lintall exit 0,yarn test:unit115/115 suites, 1064/1064 tests (0 failures). Commitb6513dc08ee91a2324786ecc44029d16004d9b2fon branchchore/FKITDEV-8387-ts-entrypoints, local only, not pushed — FKITDEV-8387
2026-07-10
- FKITDEV-8387 scoping → durable TypeScript-mechanics note — captured how TS actually works in vuer_oss/vuer_css/portal_css (established by FKITDEV-8246 “TS Magic”, PR #7645
55035572bb; foundation for FKITDEV-8251): NO build step (tsconfignoEmit+erasableSyntaxOnly, nothing runstsc, no typecheck job in CI in any repo), Node ≥ 22.18 strips types at runtime, files stay CommonJS (no"type":"module"), a cross-modulerequireof a.tsmodule needs an explicit.tsextension (extensionless →MODULE_NOT_FOUND; hencerequire('../util/magic.ts')), root-level*.tsis SILENTLY UNLINTED (ESLint TS blockfiles:['server/**/*.ts','customization/**/*.ts','client/**/*.ts'];tsconfig includesame blind spot), Jest via@swc/jest(oss) /ts-jest(css/portal),@typescript-eslint/no-explicit-anyis an ERROR (never fix a type error withany), andrequire('node:module').stripTypeScriptTypes(src)asserts erasable-syntax-clean — typescript-in-vuer-repos - FKITDEV-8387 gotcha →
nyc(v18) cannot load.tsat all — hijacks the.tsextension handler (append-transform→default-require-extensions/js.js), compiles TS as raw JS →SyntaxError: Unexpected token ':';--extension=.ts/--includedon’t help. Sovuer_oss/supervisor_vuer_oss_e2e_test.conf(npx nyc node <entry>.js×7) has been broken since FKITDEV-8246 “TS Magic” (Jan 2026) becauseserver.jsrequires six.tsservices at boot (server.js:48,83,99,108,109,110); nothing outside the git index references the conf (no CI job, no Docker repo). Fix =nyc→c8(V8 coverage, no require hook) or retire; its own YouTrack ticket — nyc-cannot-load-typescript - FKITDEV-8387 blast-radius fact → renaming any vuer entrypoint is a 4-repo coordinated release: 95 supervisor conf files hard-code
command=node <entry>.js(75vuer_build/partner/*across 35 partners, 11vuer-release/projects/*/components/*, 2vuer_docker/workspace/devtools/files/, only 7 in the three code repos); two SILENT traps —vuer_oss/server/logger.js:102–114sniffsprocess.argv[1].endsWith('server.js')/etc. for the log4js channel (rename → everything to theunknownchannel, no crash) + an 8th entrypointsoap_server.json bb/kh customization branches only (notdevel); motivates FKITDEV-8387’s.ts-module +.js-shim approach (keeps filenames literal) — entrypoint-rename-blast-radius
2026-07-08
- FKITDEV-9022 npm.facekom.net publishing — documented the approach for publishing 7 standalone
@techteamer/*library repos (xlsx, timestamp_service, mq, video-processor, archiver-zip-encrypted, janus-api, acl — all onmaster, NOT the vuer monorepo) to the private registryhttps://npm.facekom.net/. Mechanic (only real org precedent =TechTeamer/amqplib-asyncapi-template, which already declarespublishConfig:{registry:"https://npm.facekom.net",access:"restricted"}): per repo add thatpublishConfigtopackage.json+ one.github/workflows/publish.yaml(push-to-master,secrets.FACEKOM_NPM_TOKEN→~/.npmrc,npm view <name>@<version> --registry …guard = idempotent/skip-if-published).publishConfig.registryonly moves the publish target — default registry stays npmjs → dependency installs + downstream consumers unaffected; NO package renames. Decision (user, 2026-07-08): keep@techteamer/*, do NOT rename to@facekom/*→ timestamp_service is the one special case: rename to@techteamer/timestamp-service+ remove"private": true(both currently block publish). Correction: the earlier “janus-sdk publish.yaml reference impl” was WRONG —TechTeamer/janus-sdk= 404; only the amqplib template references the registry. mq special-cased (hasrelease.config.mjs/semantic-release, which also honors publishConfig.registry, but no release workflow wired yet). Blocked on VPN: registry publish docs, CI token from the registry web UI, creating org secretFACEKOM_NPM_TOKEN, real publish test. Phase 2 (take repos private / stop public npm publish) must be sequenced AFTER consumers (vuer_oss/vuer_css/portal_css, Yarn-Classic v1 + offline mirror) are repointed at the private registry, or their CI/Docker installs break. Status:aclreference done + validated locally (branchchore/FKITDEV-9022-npm-facekom-publishofforigin/master; publish.yaml + publishConfig added; JSON/YAML/logic checks pass) — not committed; other 6 pending user go; solo-author, no auto-PR — FKITDEV-9022
2026-07-03
- FKITDEV-8747 NÚSZ daily-stat “eltérés” — enriched the investigation note with a source-verified fix analysis from vuer_oss PR #7929 (squash
5099b8ad8b, commits56231e7c3c/78bd1b1ebe/7d16439620, merged 2026-05-28, nusz 1.9.11.48). It is the video-calls report / daily statistics feature and all changed files are CORE (notcustomization/nusz), surfaced by NÚSZ — not a call-count bug (raw counting logic unchanged; honest note). Three squashed fixes: (1) empty-period Service Level →nullnot0(CallsReportService.js ~L562:SL = calls>0 ? round((calls-lateAnswers)/calls*100) : null) on per-bucket and Sum/aggregate; clientreportCalls.jsrendersnull→-(was always+ '%', so0%showed); (2) Sum-column SL aligned to the per-bucket rule — that mismatch was the reported “eltérés”; (3) locale plumbed end-to-end through the RPC queue (rpc_client/rpc_serverReports.js) + the newreporterDownload.process.jsBackgroundProcess (a booleantruewas passed instead of the locale string) → xlsx exports use the user’s UI language, reviving the FKITDEV-8639 locale fix that was dead on the download path. Test cases at/Users/levander/coding/facekom/FKITDEV-8959-8747-test-cases.md(also covers FKITDEV-8959) — FKITDEV-8747 - fk-dev VM NÚSZ deploy + FKITDEV-8959 TC-8959-02 verification — documented the operational runbook for the
fk-devGCP dev-mirror VM (tailnettaild4189d.ts.net,100.91.108.61; NOT the offline on-premssh Facekombox). Connectcommand ssh ops@fk-dev.taild4189d.ts.net(Tailscale SSH, no keypair; thekakuwrapper shadowsssh→ usecommand ssh/command scp). Stack = vuer_docker compose + per-service Tailscale sidecars (oss-/css-/esign-*/portal-fk-dev), source bind-mounted/workspace/<repo>, supervisord per container; operator UI https://oss-fk-dev.taild4189d.ts.net (:10081inside);postgresqlpeer-auth blockspsql -U postgres(use app Sequelize);nginx_proxycrash-loops (bypassed by sidecars). Deploy recipe (bind-mount, no rebuild): box has NO GitHub key →ssh-add ~/.ssh/id_ed25519+command ssh -Ato forward yours → on/workspace/vuer_oss:git fetch origin <branch>+git checkout→docker exec vuer_oss sh -c 'cd /workspace/vuer_oss && yarn install && yarn build'→docker exec vuer_oss supervisorctl restart all; verify supervisorctl RUNNING +Web server is listening on 10081+ UI HTTP 302. Branch consolidation:customization/nusztipd426cc6ae1carries BOTH 8747 (5099b8ad8b, PR #7929) + 8959 (519d3b933e, PR #8010 merged), vuer_oss-only; deployed 2026-07-03, restore box’s originalbd8923d69f(InstaCash) when done. Gotcha: oldfix/FKITDEV-8959-nusz-image-deletionauto-deleted on merge but localorigin/…ref stale (narrowed refspecs, no prune) →git ls-remoteto confirm. TC-8959-02 (key-inaccessible image deletion) PROVEN PASS: cronRemoveAttachmentDataCronJob→CustomRemoveOldDataCronService.removeAttachmentData()→getOldImageAttachments(type LIKE 'image/%' AND isArchived=false AND createdAt<cutoff, batched, excl.file) →removeOldAttachmentskey-guard (encryption?.key? encryptBuffer : blank+encryptionId=null+skippedNoKey++;isArchived=true). KEY CHAIN for standalone test:encryption.key= Sequelize getter →cryptos.data.getActualKey→customerKeyStorage.getKey(stub ⇒ null models offline key). Harness = Node script inbin/(process-settings bootstrap + logger Proxy + crypto/customerKeyStorage stub + sequelize authenticate + raw-SQL seed → call REAL get/removeOldAttachments → SELECT before/after; deliver viacommand scp+docker cp+docker exec). RESULT BEFORE{isArchived:false,encryptionId:3,file_bytes:9}→ tally{processed:1,archived:1,skippedNoKey:1,errored:0}→ AFTER{isArchived:true,encryptionId:null,file_bytes:0}. Configattachments.active=true,expiryDays=7(dev.json)/28(docker.json) — 7-vs-28 retention with NÚSZ still OPEN — fk-dev-nusz-deploy-and-8959-verification
2026-06-30
- Tailscale dev-box HTTPS enabled + 8b impl reviewed + ansible task posted (status stays in-progress; push still gated on Andras’s go). Andras toggled “HTTPS Certificates” ON → per-node
tailscale certissuance now works for the sidecars (clears the prior blocker). Correctness review of the kernel-mode 8b overlay = PASSED, no code changes needed — key insight: new topology (tailscale serveTLS-terminate →http://app:port) is identical in shape to the old nginx_proxy, so the app side behaves unchanged. Verified: compose merges clean; apps staynetwork_mode:host; apps listen0.0.0.0sohost.docker.internal:host-gatewayreaches them (Docker 29.6.1 supports host-gateway); app nginx serves HTTP on the ports (matches serve→http); each sidecar own bridge netns → owntailscale0(no conflict);local.jsonhost overrides make CORS/SAML/socketOriginpass. Three tailnet-admin prereqs flagged (owner Andras): (1) sidecar auth key MUST be NON-ephemeral — deploy’s existingtag:cloudkey is reusable+EPHEMERAL → risks MagicDNS name flap (oss-fk-dev→oss-fk-dev-1) breaking hardcoded hosts + cert binding; use a reusable, non-ephemeral, pre-authorizedtag:cloudkey (state volumes already persist identity); (2) ACL grant team devices →tag:cloud:443(+MagicDNS) or they resolve but can’t connect; (3) runtime check at wiring — confirmtailscale servepreserves the originalHostheader (old nginx_proxy setHost:$host); it does setX-Forwarded-Proto/For. janus/WebRTC media over tailnet = unsolved follow-up. Babylon task #884 → deploy (facekom_dev): create ansible playbooks for the fk-dev dev workflow —git checkout <branch>on host/workspace/<app>+docker exec <container> yarn && yarn build(pnpm for facekom_library) +supervisorctl restart all, parameterized by branch + component subset, referencingbin/vuer.sh checkout; components vuer_oss/vuer_css/esign_oss/esign_css/portal_css/facekom_library (vuer_cv excluded). Open: tailscale branch push to origin pending Andras’s go — tailscale-gcp-dev-box-migration - Tailscale dev-box 8b overlay BUILT + validated (status stays in-progress; unpushed, no commit on
vuer_dockerbranchtailscale). KEY CORRECTION — “no app URL change” assumption was FALSE: apps computeseparator = DEV_DOMAIN.endsWith('facekomdev.net') ? '-' : '.', so a tailnetDEV_DOMAIN(fk-dev.taild4189d.ts.net) flips to.→ invalid dotted multi-label names likeoss.fk-dev.taild4189d.ts.net(NOT MagicDNS-resolvable, NOT the sidecar nameoss-fk-dev…). Fix stays ENTIRELY inside vuer_docker (zero app-repo edits): app host derivation is guardedif (!config.X)+getconfigdeep-mergesconfig/local.jsonlast (both verified empirically — a test proved local.json overrides one key while preserving siblings); so vuer_docker ships aconfig/local.jsonper app, bind-mounted at/workspace/<app>/config/local.json, settinghosts.*explicitly to<prefix>-fk-dev.taild4189d.ts.net. Files added on branchtailscale:tailscale.yml(8 userspacetailscale/tailscale:stablesidecars —network_mode host,TS_USERSPACE=true,--advertise-tags=tag:cloud, per-svcTS_HOSTNAME+TS_SERVE_CONFIG, DRY via YAML anchors, namedts-state-*vols, + 5 app-svc stubs merging the local.json mounts);tailscale/serve/{oss,css,css-sdk-demo,esign-oss,esign-api,esign-css,portal,library}.json(eachtailscale serveHTTPS${TS_CERT_DOMAIN}:443→http://127.0.0.1:<port>, ports 20080/30080/30081/20180/20181/30180/30380/50080);tailscale/config/{vuer_oss,vuer_css,esign_oss,esign_css,portal_css}-local.json(explicithosts.*, +esignportal.url; vuer_osshosts.cv=nullCV-out-of-scope);tailscale/README.md;.gitignore+=tailscale/tailscale.env. Validated:docker compose -f dev.yml -f vuer-oss.yml -f vuer-css.yml -f esign-oss.yml -f esign-css.yml -f portal-css.yml -f facekom-library.yml -f tailscale.yml config -q→ EXIT 0 (5 local.json + 8 serve mounts present in merged config). Networking: each sidecar host-net + userspacetailscaled,tailscale serveproxies to127.0.0.1:<app-port>(apps unchanged, stillnetwork_mode host), per-svc MagicDNS name + own cert;nginx_proxyfromdev.ymlno longer the access path (harmless if left running). Caveats: needs admin-console “HTTPS Certificates” toggle ON (owner Andras) before cert issuance; vuer_osshosts.api=api-fk-devhas no sidecar butapi-is only used by customization/external/createCustomerTokenhostname-gating, not base dev flow (matches today’s unrouted api-). Open/next: push gated on user go → thendeploywires onto fk-dev; HTTPS toggle pending; CV deferred; no new Artifact Registry (uses existing) — tailscale-gcp-dev-box-migration - DuckDNS → Tailscale migration plan for a GCP
vuer_dockerdev-box mirror (reach the box over tailnettaild4189d.ts.net, no DuckDNS / no public IP). PLAN ONLY — parked on local-only branchtailscale(offdevel), plan docvuer_docker/TAILSCALE-MIGRATION.mduncommitted. Why it’s nearly a repo no-op (source-verifiedvuer_docker @ devel): (1) alldev.ymlservices arenetwork_mode: "host"→ nginx_proxy binds0.0.0.0:443, apps bind127.0.0.1, so the host joining the tailnet = reachable at<100.x>:443with nothing published; (2)nginx_proxy/proxy_servers.confroutes by subdomain PREFIX (oss-/css-/css-sdk-demo-/esign-css-/esign-oss-/esign-api-/portal-/cv-/library- → ports 20080/30080/30081/20180/20181/30180/30380/40080/50080) with a regexserver_name ~^oss-(.+)\.facekomdev\.net$that wildcards the domain suffix → routing already domain-agnostic; (3) single self-signed cert/workspace/cert/dev.{crt,key}(externaltechteamer/certrepo) used by every block + single-label service names → a*.facekomdev.netwildcard cert covers all; (4) apps build URLs fromDEV_DOMAIN(host/etc/environment→ each*.yml). Only literalduckdnsin the repo =README.md:17. Recommended path: Phase 1 zero-repo-edits (tailscale up --hostname=facekom-dev,DEV_DOMAIN=gcp.facekomdev.net, client/etc/hosts→100.x, reuse self-signed CA, delete DuckDNS, GCP firewall DENY all public ingress — DERP works behind NAT); Phase 2 polish (2a public*.facekomdev.netA-record → the box’s 100.x tailnet IP, removes client /etc/hosts, CGNAT-in-public-DNS is valid; 2b real LE wildcard via DNS-01 at the same cert path, removes browser warning) — neither needs nginx/app changes. Fallback (no public DNS) = MagicDNSfacekom-dev.taild4189d.ts.net+tailscale cert, but single-name-per-node forces port/path routing = invasive (touches proxy_servers.conf + app URLs). Containerized tailscale sidecar rejected for host-level install. Repo diff = README rewrite + newinstall/install-tailscale.sh+ optional cert-fetch script, no nginx/compose/app edits. Open decisions (blocking, awaiting user): domain label, publish public DNS→private tailnet IP?, self-signed vs real LE cert, CV/GPU in scope?, node auth (pre-auth key + tag:dev + SSH), VM sizing. Will coordinate on babylonfacekom_devonce confirmed — tailscale-gcp-dev-box-migration - Tailscale dev-box migration DECISIONS LANDED + VM PROVISIONED (status draft→in-progress) via babylon
#facekom_dev. Decision 1 — hostnames: use Tailscale MagicDNS (<name>.taild4189d.ts.net), NOTfacekomdev.netsubdomains → Phase 2a public-DNS approach RETIRED. Decision 2 — routing:deployagent chose 8b (multi-tailscaled sidecar per service) over port-based 8a — each of the 9 services gets its own userspacetailscaledsidecar (envTS_AUTHKEY+TS_HOSTNAME, ~30 MB idle), own MagicDNS name, owntailscale cert. No app URL rework expected IFF sidecars named to preserve the existing<prefix>-<DEV_DOMAIN>pattern (oss-fk-dev,css-fk-dev, …) withDEV_DOMAIN=fk-dev.taild4189d.ts.net— flagged to verify vs actual app config; pattern proven on pmv2-zurich (babylon+nats sidecars). This reverses this note’s original “host-level install, sidecar rejected” recommendation. VMfk-devprovisioned bydeploy(part of a levandor-infra terraform refactor — module"vm"→for_each=var.vms; pmv2-zurich’s 14 prod containers verified untouched): e2-standard-4 (4 vCPU/16 GB), 100 GB pd-balanced, europe-west6-a; separate VPCfk-dev-net/subnet10.2.0.0/24, SAfk-dev-sa; tailnet IP 100.91.108.61, MagicDNS fk-dev.taild4189d.ts.net, ACLtag:cloud(reuses pmv2 auth key); public IP 34.158.19.122 egress-only, firewall denies ALL inbound except Tailscale DERP, no public SSH; Docker 29.6.1 (+gcloud cred helper foreurope-west3-docker.pkg.dev), tailscaled + OTel collector active (host.docker.internal:4317/4318); accessssh ops@fk-devfrom any tailnet device. Open (owner Andras/user): CV/GPU scope (VM non-GPU); toggle “HTTPS Certificates” ON in Tailscale admin console (required beforetailscale certworks); whetherdeploycreates a FaceKom Artifact Registry namespace. Next (on user go): build the 8b sidecar compose layer on vuer_docker branchtailscale(sidecar per service named<prefix>-fk-dev,tailscale serve https → localhost:<port>, likely drop nginx_proxy), verify cross-service URLs, push fordeployto wire onto fk-dev — tailscale-gcp-dev-box-migration
2026-06-29
- InstaCash eSign 1.3.0.11 release composition — documented the release: components
esign_oss+esign_cssONLY (source taginstacash-1.3.0.11, 2026-06-08; Harborinstacash-esign-{oss,css}:1.3.0.11-20260608, built via the eSignbizalmi_szolgaltatas_buildpipeline). Release issue ASSICASH-92; installs ASSICASH-93 (TESZT) + ASSICASH-96 (PROD, approved 2026-06-26, upgrading from the deployed1.3.0.8—.9/.10not in this PROD line). Changelog = adevelcore update + vuln fixes under FKITDEV-8817 (andras.lederer): jQuery XSS CVE-2020-11023 + jQuery prototype-pollution CVE-2019-11358 remediated onesign_css(PR #250) + hardening (HSTS, nginx HTTP hardening, WAF/ModSecurity). No DB migration, no breaking change; rollback = redeploy1.3.0.8. — instacash-esign-1.3.0.11 - Dev-box deploy recipe for testing an InstaCash eSign release — on
ssh Facekom(=lederera-447-fk-hardver, code bind-mounted from/workspace). The box defaults to Raiffeisen, so testing InstaCash eSign requires aligning the whole chain:esign_oss/esign_css→ taginstacash-1.3.0.11,vuer_oss/vuer_css→ taginstacash-1.9.11.50(latest InstaCash vuer; the eSign ticket pins no vuer version),pdfservicestays onmain/2.0.12(partner-agnostic). Recipe per repo:git stashWIP →git fetch --tags(clones predate the tag) →git checkout <tag>→ rebuild in-containerdocker exec <c> sh -c 'cd /workspace/<repo> && yarn install && yarn build'→supervisorctl restart all. Verify: supervisord allRUNNING, logs showRabbitMQ connection established+Web server is listening(esign_oss 10180/81/82, esign_css 10183/84, vuer_css 10082/83), esign_css UI HTTP 200 on :10183. Gotchas: a “dirty”vuer_cssafter checkout was only an untracked.claude/dir; old log ERRORs may be historical from the prior (Raiffeisen) run — check timestamps. — instacash-esign-dev-box-deploy /fk-tjkflow dogfooded → first InstaCash eSign tesztjegyzőkönyv ever. Addedinstacashtopartners.json(display “InstaCash”,ytProjectASSICASH; 12 → 13 seeded), rendered~/Downloads/tesztjegyzokonyv_instacash_1.3.0.11.docx(5 test cases). InstaCash historically had no TJK (the attachment-recipe note’s blanket “InstaCash has none” warning is now superseded — the doc exists locally but is not yet attached to YouTrack; the flow does not auto-write). Updated the generation-flow note (partner count + a “First real use” section) and the attachment-recipe note (reworded the InstaCash warning + added ASSICASH-96 PROD install) — tesztjegyzokonyv-generation-flow, youtrack-tesztjegyzokonyv-attachment-recipe- FKITDEV-8533 PR #8013 SonarCloud gate — vuer_oss PR #8013 (Janus CVO un-gate, branch
fix/FKITDEV-8533-videoorient-ungate) FAILED SonarCloud “Maintainability Rating on New Code” (rated C, then D after a refactor). Root cause = pre-existing-debt mis-attribution, NOT the fix: all 20 flagged issues are pre-existing (git blame2018→Jan 2026; authors Jordán/Bence/jurki/kzsolt/Makkai; SonarCloud issue keys e.g.AZ8A1W4d…/AZ8A1W6o…identical before & after a PR refactor); decisive control = the co-modifiedserver/db/model/customer.jshad ZERO flags, proving the diff is innocent — the gate counts legacy smells in any touched file, most likely becausedevelhas no SonarCloud baseline (projectvuer-ossis private; New Code config unconfirmable without a token). Gotcha: any PR touchingvideochat.js/RoomTransportSession.js/SelfServiceTransportSession.js/VuerCVListenerSession.js(legacy optional-chain/.find/async smells) re-trips it → waive (mark issues Accept / admin-merge) or fix the baseline (New Code → Reference branch =devel, ensure devel is analyzed); do NOT bloat the PR fixing unrelated debt — esp. the 2[failure]VuerCVListenerSession.jsitems (async-in-constructor + await-non-Promise, behavioural CV refactors). Fix final state: standaloneserver/transport/videoOrientExt.jshelper refactored INTOCustomer.prototype.videoOrientExtEnabled()(besideisNativeApp), calledX.customer?.videoOrientExtEnabled() ?? trueat the 4 gate sites (behaviour identical: null→true/native→false/browser→true); commit1815f693fe(amended overd27d4cc990), solo-author, force-with-lease pushed. Decision (user): waive the gate as pre-existing debt; device test (operator view + recording + iPad orientation direction) still pending — FKITDEV-8533
2026-06-26
- Tesztelési jegyzőkönyv generation flow (
/fk-tjk) — built a repeatable per-partner test-report.docxgenerator for FaceKom releases (producing companion to the attachment-recipe note): a Claude command + stdlib Python docx renderer under/Users/levander/coding/facekom/.claude/. Practice: one TJK per AFFECTED partner per1.9.11.NNrelease (not all 39), attached to that partner’s YouTrack release ticket; shortName usuallyASS<PARTNER>/BUG<PARTNER>but VARIES (MicroSec=MF, DÁP=DAP/ASSDAP) →partners.jsonpinsytProjectper partner; a core change reuses byte-identical body text across partners (verified MKBASSMKB-90== BBASSBB-82Oracle-timezone reports, body doesn’t even name the partner). New std templatetesztjegyzokonyv_sablon.docx(authored 2026-05-29, replaces 3 inconsistent legacy formats): 19<…>placeholders each intact in a single<w:t>run, all inword/document.xml→ plain string substitution preserves all styling (no docxtemplater/pandoc). Built:.claude/commands/fk-tjk.md(procedure: pull dev ticket via existingfkticketclient + 1 past report/partner for house style → draft per-partner JSON → render),.claude/scripts/tjk/render_tjk.py(stdlib-only: metadata substitution + clone test-case block document.xml paras 27–36 once per case w/ literal1.→k.+\n→<w:br/>+ zip-repackage copying entries verbatim swapping ONLY document.xml + self-check),partners.json(12 seeded: barion/bb/cib/cofidis/dap/fundamenta/generali/microsec/mkb/mvm/raiffeisen/unicredit), pinned sablon. v1 MANUAL/out-of-scope: screenshots, pass/fail underline, PDF export, attaching to YouTrack — NO write-back. Verified: renderer self-check + tests pass, independent fixture renders, pinned sablon byte-identical+unmutated post-render. Design spec (incl. §13 fact-check)/Users/levander/coding/facekom/docs/superpowers/specs/2026-06-26-teszt-jegyzokonyv-flow-design.md— tesztjegyzokonyv-generation-flow - YouTrack tesztjegyzőkönyv (test-record) convention + REST attachment recipe — captured WHERE FaceKom “Tesztelési jegyzőkönyv” PDFs/DOCX live: attachments on per-client
ASS<CLIENT>release /BUG<CLIENT>tickets, NOT standalone issues (8-section branded template; source-of-truth templates FKITDEV-8329 unified format + FKITDEV-8330 release/install template). InstaCash (ICASH) has NO release/eSign TJK —ASSICASH-65(FaceKom 1.9.11.50) /-92(eSign 1.3.0.11) carry only build.logs, install ticketsASSICASH-66/62/67/93only screenshots; the only instacash “teszt jegyzőkönyv” PDFs are OLD compliance/DR (BUGICASH-460 BCP 2023, ISSFK-338 SaaS-DR 2021). Only eSign-tied test record = RaiffeisenBUGRAFIPI-512(eSign 1.3.0.22, 2/2 cases, Nagy Balázs 2024-10-16) + sibling-516(eSign DR); recent ASSRAFIPI-117/113/102 TJKs are FaceKom/VUER releases (NOT eSign);BUGRAFIPI-514has both .pdf+.docx. REST recipe (read-only, pythonurllibto dodge RTK + keep token off argv):GET /api/issues?query=…&fields=…,attachments(name,mimeType,created,url),comments(text,attachments(…))&$top=200, Hungarian full-text works, scope byproject:; download = prepend base to the attachment’s relative signedurl, GET w/ Bearer, write bytes; dates are epoch-ms. Same base +~/.config/facekom/youtrack.tokenas the ready-for-release query — youtrack-tesztjegyzokonyv-attachment-recipe
2026-06-25
- FKITDEV-8639 post-fix reality — appended a Post-fix Reality / Open Question section to the investigation note. Synthesis: PR #7862 (
543f293c38, tagnusz-1.9.11.45) made the Excel report self-consistent/auditable (Sum on every row) but did NOT reconcile UI per-period SL with Excel weighted-overall SL — both formulas coexist BY DESIGN (naive per-period roundCallsReportService.js:669-670vs weighted overall:558-559; team standardised on weighted overall as headline). Per nusz-1.9.11.47 (ASSNUSZ-58 UAT), client STILL reported the SL discrepancy after the fix (“Az SL eltérés itt is jelentkezett”) even though the daily-stat discrepancy resolved. OPEN PRODUCT DECISION: UI == Excel exactly requires picking ONE formula everywhere — a product call, not a further bug fix. Clarified Bug C (ReportsService.js:63true→locale) is DISTINCT from FKITDEV-8747 (locale through RPC queue boundary + empty SL when no calls, PR #7929, new for 1.9.11.48) — two locale bugs at two layers — FKITDEV-8639
2026-06-23
-
FKITDEV-8981 self-hosted PR-check runners — 33 identical
runs-on: ubuntu-latest→runs-on: [self-hosted, node]edits across the 7 repos’ single PR-check workflow.github/workflows/pull-request.yaml(vuer_oss 5, vuer_css 5, esign_oss 5, esign_css 4, portal_css 5, mq 5, janus-api 4; esign_css + janus-api omit thetestjob). Repo-name resolution:@techteamer/mq→ GitHubTechTeamer/mqdefaultmaster(NOT devel);janus_api→TechTeamer/janus-api(hyphen) defaultmaster(TechTeamer/janus_apidoes NOT exist); the 5 css/oss base offorigin/devel, mq+janus-api offorigin/master. Scope correction: portal_css’s oldpr-title-lint.yamlwas already removed on devel in PR FKITDEV-8976, andrelease-caller.yamlis push-triggered (reusablenode-semantic-release.yaml@master, noruns-on) = out of scope — so onlypull-request.yamlremained (re-scope against post-fetch devel, not a stale ref). Job NAMES unchanged → branch-protection required checks stay valid. Done in worktrees<repo>-FKITDEV-8981onchore/FKITDEV-8981-self-hosted-runners; edits verified (numstat 5/5/5/4/5/5/4, zeroubuntu-latestresidue, YAML parses) but NOT committed, NOT pushed, NO PRs. Hard infra dependency / risk: inert+dangerous without onlinenode-labelled (+ implicitself-hosted) runners carrying git+Node/yarn (setup-node@v6 cache:yarn)+theSonarSource/sonarqube-scan-action@v6toolchain (sonar = likeliest self-hosted gotcha) — if none online at merge, every PR check queues forever and ALL PRs in these repos block. “Build-green ≠ runs”: real validation needs a live PR hitting anoderunner. Precedent: vuer-releaseautobuild.ymlalready on[self-hosted, docker]. Commit msg stylechore: [fkitdev-8981] run PR checks on self-hosted runners— FKITDEV-8981 -
FKITDEV-8239 depcheck CI — ALL 5 PRs now fully green and ready to merge (flips the prior 4/5). The lone red, vuer_oss #8001, was a pre-existing
self-service-room-archive-service.test.jsUnit Tests failure (NOT sonar, NOT the depcheck change) — now RESOLVED: a colleague merged the test fix to vuer_ossdevelin PR #8003 (commitcfdc116543, “tests updates/ci fix”); mergedorigin/develintochore/FKITDEV-8239-depcheck-ci— clean, no conflicts (devel only touched CODEOWNERS + the test file, zero overlap with the 3 CI-config files), merge commit3717e30b91solo-author (andras.lederer), pushed; #8001 re-ran fully green (Unit Tests, SonarQube Scan, SonarCloud Code Analysis, Build, Lint, Audit, Unused Dependencies all pass). Net: vuer_oss #8001 + vuer_css #3076 + portal_css #703 + esign_oss #353 + esign_css #253 all green — FKITDEV-8239 -
FKITDEV-8947 scoping gotcha — vuer_oss’s
getHttpsAgent()+fetch({ agent })idiom is a SILENT NO-OP (verified on Node v22.22.3 / bundled undici 6.24.1). Everyfetch()in vuer_oss is Node’s global fetch (neitherundicinornode-fetchis a declared dep), and global fetch ignoresagent(honors onlydispatcher). PROVEN:fetch(selfSigned, { agent: new https.Agent({ rejectUnauthorized:false }) })→TypeError: fetch failed / DEPTH_ZERO_SELF_SIGNED_CERT(therejectUnauthorized:falsewas dropped). Harmless today only becausecv.rejectUnauthorizeddefaultstrue= global-fetch default; but client-cert mTLS viaagentdoes nothing — latent trap for FKITDEV-8947 (UniCreditApiService.jsmigratesrequest-promise-native→fetch with cert/key/ca/passphrase mTLS fromportal.api). FIX (verified status 200 + peer CN received vs localrequestCertserver):const { fetch, Agent } = require('undici')thenfetch(url, { dispatcher: new Agent({ connect: { cert, key, ca, passphrase, rejectUnauthorized } }) }). CROSS-VERSION TRAP: feeding a standalone undici 8.5.0Agentinto Node’s global fetch (bundled undici 6.24.1) →UND_ERR_INVALID_ARG: invalid onRequestStart method(handler-iface mismatch across undici majors); since Facekom runs Node 22 and 24 (different bundled undici majors), pinning standalone undici to the bundled version is fragile — use undici’s own fetch+Agent pair. Also:ApiService.js:267has an uncommitted stray}w(HEAD clean) →ReferenceErrorin thenon-realtime-sdkbranch ofsetIdentificationComplete— vuer-oss-global-fetch-ignores-agent-mtls, FKITDEV-8947 -
FKITDEV-8239 depcheck CI — COMMITTED (solo-author) + PUSHED (flips earlier LOCAL-ONLY status). Branch
chore/FKITDEV-8239-depcheck-ci→git@github.com:TechTeamer/<repo>for all 5 repos, authorandras.lederer <andras.lederer@alpiq.com>(no Co-Authored-By). Each commit = 2 files (workflow +.depcheckrc.json), msgchore(ci): add warn-only depcheck job for unused dependencies (FKITDEV-8239), committed--no-verify(worktrees have no node_modules so husky/lint-staged can’t run; validated independently via actionlint + depcheck). Commits: vuer_oss0e7bd6377e, vuer_css7913f181c, portal_cssac15b91d, esign_oss47d6a5c, esign_css93ccd9f. No PRs yet (no-auto-PR) — compare linkshttps://github.com/TechTeamer/<repo>/compare/devel...chore/FKITDEV-8239-depcheck-ci?expand=1; worktrees preserved for PR iteration. Merge-time caution still stands: do NOT promote theUnused Dependenciescheck to a required branch-protection check or it stops being warn-only — FKITDEV-8239 -
FKITDEV-8239 depcheck CI — adversarial deep-review found NO bugs; ready to ship as-is. Verified:
actionlintv1.7.12 clean (exit 0, zero findings) on all 5 workflows (full Actions schema + expression check); all 5 diffs purely additive vsorigin/devel(31 insertions/0 deletions, no existing job touched);${{ env.NODE_VERSION }}=“24” resolves in all 5; barenpx -y depcheck@1.4.7auto-discovers.depcheckrc.json; the 5 job blocks byte-identical except the intended install spelling (yarn --frozen-lockfilein vuer_oss vsyarn install --frozen-lockfile×4); depcheck warn-only everywhere (exit 255 absorbed bycontinue-on-error),unused_devDeps=[]. Final candidates: vuer_oss soap/umzug; vuer_css add; portal_css lodash/tmp/tough-cookie + a genuine MISSING devDependencyistanbul-lib-coverage; esign_oss ajv/fast-xml-parser/inquirer/jsdom/protobufjs/umzug (resolutions=CVE pins, advisory); esign_css license-checker/postcss. Merge-time op note: do NOT add the newUnused Dependenciesstatus check to branch-protection required checks or it stops being warn-only — FKITDEV-8239 -
RTK tooling gotcha — RTK proxy MANGLES some commands (mutates the command, not just output), hit while fetching the actionlint binary for the 8239 review.
curl <url>fails with curl error (3) “Malformed input to a URL function” (Rust proxy corrupts the URL);ls | sortreturned empty;find|wc -l/|grep -cget zeroed (dangerous — looks like a legit “no results”). Workarounds bypass RTK via python3: download files withurllib.request.urlretrieveinstead of curl/wget; run multi-step CLI checks viasubprocess.run([...])(argv list, noshell=True) instead of shell pipelines; for counts cross-check two independent methods. Sibling of the merge-commit-hiding gotcha — rtk-mangles-curl-and-pipes -
FKITDEV-8533 iPad self-service rotation — chosen fix LANDS (server/Janus): “Option A — un-gate CVO for browsers.” Restored the
videoOrientExtgate to its 2017 intent — disableurn:3gpp:video-orientation(CVO) RTP ext ONLY for the native mobile SDK (UA prefixmobile/), enable for ALL browsers — via new shared helperserver/transport/videoOrientExt.js(videoOrientExtEnabled(customer)=!customer.isNativeApp(), null→true) wired at all 4 (the only) gate sites (RoomTransportSession:917 / SelfServiceTransportSession:49 / videochat:274 / VuerCVListenerSession:154) + newCustomer.isNativeApp()(customer.js:307,userAgent.startsWith('mobile/')); isSafari/isMobile untouched (≈7 other callers — avoids #7945’s blast radius). Branchfix/FKITDEV-8533-videoorient-ungateoff devel9aabf7bb6c, commitd27d4cc990, solo-author; ships own tests (video-orient-ext.test.js+91). 4-front adversarial validation all PASS: (1) completeness — 4 sites are the only setters, no config/client/SDP override (client munges fmtp not extmap), self-service iPad reaches the gate with non-null customer; (2) native-SDK off→off, singlemobile/prefix (vuer_css mobile.js:52/119) for iOS+Android, no browser false-positive; (3) regression — full unit A/B 3220→3230 (+10/−0), identical 29 pre-existing ts-jest fails; (4) config —streamRotate:falsedev/docker+Generali, recording is janus-pp-rec→ffmpeg -c:v copy(no transpose). Client finding (shelved, NOT redundant): self-service ID photo is captured from the LOCAL getUserMedia preview (VideoFeeddrawImage(videoElement)), which CVO physically CANNOT correct (RTP ext = remote/operator decode only) → PR #3043’s client-canvas rotation is a SEPARATE artifact, still needed, ORTHOGONAL (no double-rotate — corrects an earlier assumption); minimal client fix built+validated (default-offcorrectOrientation,isIpadClient()+geometry gate, operator KYC byte-identical) on branchfix/FKITDEV-8533-selfservice-photo-rotation, NOT committed (deferred). Latent bug (separate-ticket candidate, NOT fixed): devel high-res capture triple-dead —self-service.controller.js:201-202reads never-assignedthis.services.highResolutionLocalStream, AND:204calls object-argscreenshot()positionally → self-service photos always PNG/1, intended JPEG/0.9 path silently dead; orientation fix preserves PNG (no KYC-format side effect). Residuals need 1 physical iPad session (operator view/screenshot upright?, recording honours CVO?, stored photo upright + 90° CW direction) — FKITDEV-8533 -
FKITDEV-8239 SonarCloud gate fix — after the depcheck PRs opened, SonarCloud’s “Security Rating on New Code” gate FAILED on 4 of 5 PRs: the new workflow lines tripped SonarCloud’s GHA supply-chain rules —
npx(“install packages on-demand”, confirmed sole driver on vuer_css),yarn install(“lifecycle scripts”), and unpinnedactions/*@v6(“use full commit SHA”); existing jobs use the same patterns but are grandfathered as old code, only the PR’s new lines are gated. Profiles differ per repo (vuer_css flags only npx; portal_css flags all three). Fix (chosen from 3 options): appended.github/**tosonar.exclusionsin eachsonar-project.properties(already insonar.coverage.exclusions). Pushed solo-author (andras.lederer): vuer_ossc2b5cfcb3f, vuer_css93c9d976e, portal_css7ee62cbd, esign_oss4e96053, esign_css9f9b862. Verified viagh pr checks: 4/5 PRs now fully green (vuer_css #3076, portal_css #703, esign_oss #353, esign_css #253). vuer_oss #8001 stays red but NOT sonar / NOT this change — a pre-existing Unit Tests failure (self-service-room-archive-service.test.js, 2 tests: archive + restore self-service room, “Cannot log after tests are done” async-leak; 3512 pass/2 fail) that also fails ondevel(branch is devel + CI-config-only; sonar/build skipped behind the test job); likely FKITDEV-8787 self-service work, out of scope. Reusable gotcha captured in SonarCloud “Security Rating on New Code” can fail on new CI workflow lines — FKITDEV-8239
2026-06-22
- FKITDEV-8239 depcheck CI rewrite — corrected investigation note: scope is all 5 repos (vuer_oss/vuer_css/portal_css/esign_oss/esign_css), not portal_css only; removed false
npx -ymacOS breakage gotcha (verified working); corrected lodash narrative (portal_css had over-suppressed genuine unused deps, not a static-analysis miss — fixed by removing lodash/tmp/tough-cookie from ignores); Yarn Constraints not viable (Yarn Classic v1 only) — FKITDEV-8239
2026-06-18
- FKITDEV-8887 iOS audio resume — SonarCloud cleanup on vuer_css PR #3066 (TechTeamer; branch
fix/FKITDEV-8887-ios-audio-resume, still UNCOMMITTED in worktreevuer_css-FKITDEV-8887-ios-audio-resume). Quality Gate PASSED but Sonar flagged 18 “New issues” (all maintainability code smells; 0 bugs/vulns/hotspots; 89.2% new-code coverage). 13 were genuinely the PR’s new code → fixed (11×prefer-optional-chaininga&&a.b→a?.bin Peer.js/VideoFeed.js/InterruptionRecovery.js/videochat.services.js/videochat.script.js; 1×prefer-globalThiswin:window→win:globalThis; 1×cognitive-complexityrecoverAudioIfNeeded19→≤15 by extracting_safeLog/_isAudioTrackDead/_applyRecoveredAudioTrack, behavior-preserving — 119 suites/1045 tests pass + independent adversarial APPROVE). 5 were PRE-EXISTING document-upload/validation code (promptUpload/validationResult,videochat.script.js~L424–448) the PR never touched (verifiedgh pr diff 3066: script.js changed only at the import,InterruptionRecoverywiring ~L78–92, one teardown line) → intentionally LEFT for a separate chore (keep audio PR focused). Reusable technique captured: read SonarCloud PR issues WITHOUT a Sonar token via GitHub check-run annotations on the PR head commit (gh pr view --json statusCheckRollup,headRefOid→gh api .../commits/<sha>/check-runs→gh api .../check-runs/<id>/annotations;sonarqubecloudbot also posts a PR summary comment). Gotchas: passing Quality Gate ≠ zero issues (gate = new-code thresholds only); no analyzeddevelSonar baseline (onlypull-request.yamlruns Sonar) so pre-existing code can appear as PR “New issues”; annotation_levelfailure= issue severity, not a gate failure. Added gh-annotations recipe to 10. Verified gotchas — FKITDEV-8887 - FKITDEV-8787 Raiffeisen Myra phantom-room — deployed the fix branch to dev box
lederera-447-fk-hardver(command ssh Facekom, ProxyJumpFKJumpBox; box was offline ~4h on Tailscale, brought back online first) and server-side verification PASS. vuer_css switchedcustomization/instacash@e3f7a1d6e→fix/FKITDEV-8787-selfservice-v2-abort-clear-state-95@d69f7272e(PR #3064 tip), left on the fix branch; a whitespace-onlyconfig/dev.jsonreformat stashed asstash@{0}first. vuer_oss left untouched (customization/raiffeisen, provides thegetRemainingSecondsRPC). Build/restart that worked:docker exec vuer_css sh -c 'cd /workspace/vuer_css && yarn && yarn build && supervisorctl restart all'(yarn ~22s, build ~8s). Evidence: supervisordvuer_css RUNNING pid 612stable, clean boot (RabbitMQ connection established,Web server listening on 10083,Socket server listening on 10082), zero errors since boot, self-heal atselfservice-v2.js:313. Two operational corrections: (1)vuer_csshas NO docker healthcheck (docker inspecthealth =nohealthcheck;docker ps“Up 5 weeks” = only inner supervisord procs restart, not the container) — the “~60s unhealthy anti-flap” note for esign containers does NOT apply; verify viadocker exec vuer_css supervisorctl status(RUNNING + climbing uptime), not docker health; (2) a pre-existingTypeError: Cannot read properties of undefined (reading 'stack')atserver/web/WebServer.js:481(findRoute) was logged by the OLDcustomization/instacashprocess pre-restart — unrelated to 8787, does NOT recur on the fix branch, but a real error-handling fault oncustomization/instacash(flag for that branch’s owner). Restore command:cd /workspace/vuer_css && git checkout customization/instacash && git stash pop && docker exec vuer_css sh -c '... yarn && yarn build && supervisorctl restart all'. Still pending: functional verification (Scenarios A/B) with the real Raiffeisen Myra mobile client athttps://css-lederera.facekomdev.net— not yet run — FKITDEV-8787
2026-06-18
- FKITDEV-8787 Raiffeisen Myra phantom-room — added a manual end-to-end verification (partner hand-off) script to the investigation note, complementing the existing 76 Jest unit tests. Fix ships in PR #3064 → base
release/FKITDEV-8902-raiffeisen-1.9.11.95(release-targeted delivery of the same server self-heal first landed in PR #3051 →customization/raiffeisen); tester MUST be on a build/env with that fix deployed or they just reproduce the original bug. Critical gotcha: the bug only ARMS when the mobile SDK reuses the SAME socket — use in-app Restart/Cancel and stay in the same app session; fully closing/reopening the app (or re-scanning a fresh token) makes a NEW socket with no staleselfServiceRoomDataso nothing triggers and the test proves nothing. Scenario A = drive room to timeout/no-tasks (~5 retries, do NOT close app) → in-app Restart → PASS if fresh flow + tasks + first photo OK, FAIL if “Already authorized”/“Already has some kind of room”; Scenario B (controllable) = abort in-app → start in same session. Server-side proof:docker logs -f vuer_css | grep -i "self-heal"— warnself-heal: clearing stale selfServiceRoomData for dead room …= self-heal fired (room confirmed expired);getRemainingSeconds failed … preserving state= fail-closed branch (room NOT confirmed-expired; recover via abort-then-start). Hand-off needed because the “Already authorized” string lives in the Raiffeisen mobile SDK (real client required, not a local mock) — FKITDEV-8787
2026-06-16
- FKITDEV-8252 UBI10 RUNTIME fixes (rabbitmq + supervisord) — build-green ≠ runs: prior phases were EXIT-0 build-verified but not runtime-tested; Bence reported containers failing on START. Four distinct ubi10-minimal runtime gotchas, each masking the next (all native x86_64 on
ssh Facekom): (1) supervisor 4.2.5 crashes on Py3.12ModuleNotFoundError: pkg_resources(setuptools dropped it) → pinsupervisor==4.3.0(vuer_docker was 4.2.5; vuer_build/vuer-release unpinned ⇒ already 4.3.0); (2) supervisord logfile path hidden by volume mount —logfile=/var/log/supervisor/supervisord.log+childlogdirbaked in image, but compose bind-mounts host log dir over/var/loghiding the subdir → “directory … does not exist” → log to/var/logROOT (mount always exists), vuer_docker only; (3) rabbitmq-server exit-1 “Please ensure /bin/su or /sbin/runuser exists” — ubi10-minimal ships onlyutil-linux-core(no su/runuser), rabbitmq privilege-drop wrapper needs su →microdnf install -y util-linuxin ALL 3 repos; (4) erlang.erlang.cookieeacces (latent, surfaced only after #3) — supervisord (PID1, HOME=/root) does NOT propagate techteamer’s HOME nor doesUSER techteamerset it → erlang writes cookie to /root → eacces crash-loop → setenvironment=HOME="/var/lib/rabbitmq"insupervisor_rabbitmq.conf(vuer_build+vuer-release). Also removed wrongly-addedUSER $DOCKER_USERfrom vuer_css/portal_css Dockerfiles (must run supervisord as ROOT; regression from shared-script refactor). Red herrings: healthchecksupervisor-health-check.shusessupervisorctl status(root unix socket, fine) NOT rabbitmqctl;rabbitmqctlas root via docker exec ALSO gets cookie eacces (cookie 0400 owned by techteamer) → usedocker exec -u techteamer -e HOME=/var/lib/rabbitmq <c> rabbitmqctl status; “rabbitmq exit 127” in baredocker run= test artifact (directory=/workspacemissing without compose bind-mount). Outcome: all 3 rabbitmq images boothealthy(RabbitMQ 4.1.4, listeners up). Pushed solo-author: vuer_dockera6543ab→feat/FKITDEV-8252/UBI-10-build-fixes; vuer_build82acea7→5c56120→feature/FKITDEV-8252-ubi10(also folded in held-back Phase A clamav shadow-utils + janus CentOS-CRB.repo base fixes); vuer-releasebc9570e→92cc400→feature/FKITDEV-8252-ubi10— FKITDEV-8252 - NÚSZ devel update — merge validation FAILED at lint, merge left UNCOMMITTED (mid-merge,
MERGE_HEADintact) in worktree~/coding/facekom/vuer_oss-nusz-devel-update(origin/devel→update/customization/nusz-2026-06-16).yarn lint(eslint . --max-warnings 0 --ignore-pattern "test/*") reported exactly 1 error:cron.js:46 n/no-missing-require Can't resolve './server/service/FFmpegService'. Root cause = reusable merge gotcha: devel renamedserver/service/FFmpegService.js→.ts; nusz tip commit1d837dac83had added an extensionlessrequire('./server/service/FFmpegService')tocron.js(resolved fine while.js); the conflict-free merge kept devel’s rename + nusz’s extensionless line, so it no longer resolves to.tsundern/no-missing-require.cron.js:46is the lone straggler — every other caller (server.js:108,convert.js:31,background.js:52,server/convert/convert_check.js:4) already uses explicit.ts. Fix (NOT applied, validate-only) = add.tsto line 46. Lesson: after a cross-side.js→.tsrename merge, grep for extensionlessrequire()s of the renamed modules — nusz-devel-update-2026-06-16-lint-merge-fix - FKITDEV-8354 vuer-release PR #28 (MVM partner migration, branch
feature/FKITDEV-8354, basemaster, reviewerbencelaszlo) — resolved Bence’s round-2 supervisor-config review (two “merge with the<repo>config” comments). vuer_css conf (projects/mvm/components/vuer_css/supervisor_vuer_css_docker.conf) was byte-identical to the vuer_css repo copy ⇒ DELETED + removed itsCOPY … conf.d/line from the component Dockerfile; safe because baseinstall/configure-app.sh:16-21symlinks all source-packagesupervisor*.confinto/etc/supervisor/conf.d/(supervisord.confincludes*.conf) ⇒ identical conf.d set. vuer_oss conf KEPT as intentional override (NOT merged): vs the correct baseline (vuer_oss repo MVM branchorigin/chore/FKITDEV-8892-mvm-devel-update-2026-06-01, blobd6e7843) the release copy uses supervisor-stdout eventlistener logging (stdout_events_enabled=true/stdout_logfile=NONE, 8 programs) vs the repo’s file-logging 9-program set; the eventlistener apparatus (supervisor_stdout.py+supervisor_stdout_eventlistener.conf+pip install supervisor-stdout) exists ONLY in vuer-release and consumes the very supervisor-stdout plugin Bence asked to RESTORE in round 1 (07db225) ⇒ merging would no-op it; and dropping[program:vuer_oss_storage]is the consistent vuer-release convention (equilor/nusz/polgaribank-facekom/unicredit/unicredit-srb/mvm all omit it). Reusable mechanism: supervisor confs reach conf.d via TWO paths — (a)configure-app.shsymlinks the source-package conf, (b) the partner DockerfileCOPYs an override on top (last-write-wins by filename); an override is a deletable duplicate only if byte-identical, else it’s intentional customization. Distinct from FKITDEV-8252 PR #31 (feat: ubi10) — don’t conflate. Changes LOCAL/UNSTAGED in worktree~/coding/facekom/vuer-release/.worktrees/FKITDEV-8354only; reply to Bence DRAFTED not posted; nothing written to GitHub (user constraint) — FKITDEV-8354-mvm-supervisor-config-dedup - Devel update executed for nusz-1.9.11.47 — vuer_oss + vuer_css
chore/FKITDEV-8938-nusz-devel-updatepushed, PRs pending merge into customization/nusz; cut blocked on those merges — nusz-1.9.11.47
2026-06-15
- NÚSZ release automation — created the releases hub + design under
projects/facekom/releases/: per-release tracker nusz-1.9.11.47 (@13/1.9.11.47, release issue ASSNUSZ-116 / FKITDEV-8938, payload = CRNUSZ-102 + ASSNUSZ-58 + SLANUSZ-28, dual-publish 🅼 Harbor / 🅻 vuer_build, manual post-release YouTrack transitions), the reusable prepare-and-gate release-automation-design (/fk-release <client>command spec, scope = ASSNUSZ Release-issuePackagemanifest ∪ tag/status union, fix-forward never delete tags), and the releases index with verified nusz @1–@12 history — left UNCOMMITTED for review - NÚSZ release scope — documented YouTrack access + the verified “Ready for release” release-scope query for the four NÚSZ projects (
CRNUSZ/BUGNUSZ/SLANUSZ/ASSNUSZ): tracker = YouTrackhttps://youtrack.techteamer.com(/api/issues), Bearer token read from~/.config/facekom/youtrack.token(never on argv); “Ready for release” is a tag (exact stringReady for release, searchtag: {Ready for release}) — tracker-wide it matches 57 issues so theproject:filter is what scopes it to NÚSZ; queryproject: CRNUSZ, BUGNUSZ, SLANUSZ, ASSNUSZ tag: {Ready for release}returned 3 on 2026-06-15 (CRNUSZ-102, ASSNUSZ-58, SLANUSZ-28; BUGNUSZ 0); read-onlycurl -G --data-urlencoderecipe +/fk-ticketcommand/extractor (~/.config/facekom/youtrack.token) paths captured; CRNUSZ-102 verified example (StatePendingyet tag-flagged → the tag is the readiness signal, not State) — youtrack-ready-for-release-nusz-query - NÚSZ release payload detail + client registry — extended the release docs (UNCOMMITTED, per request): appended a per-ticket payload detail section to nusz-1.9.11.47 (CRNUSZ-102 impl FKITDEV-8794/8801 — no code/PR found, business-accepted, UAT 06.18; SLANUSZ-28 impl FKITDEV-8639 → PR #7862 on
feature/FKITDEV-8639, NOT yet incustomization/nusz, may already be in .45/.46; ASSNUSZ-58 stat-export, UAT/PROD-gate notes targeted .46.1) with a merge-status warning that payload code is not yet confirmed incustomization/nuszand the version target (.45/.46/.46.1/.47) needs confirming; created the cross-system client-registry (YouTrack suffix ≠ repo name, e.g. RAFIPI=raiffeisen, MNET=magnet, PB=polgaribank; 22 clients with build-path modern/legacy/eSign + resolution rules for/fk-release); appended client-generalization, PR-fetch (no YouTrack VCS → git-grep + comment-scan), and comment-extraction ranking sections to release-automation-design — client-registry
2026-06-15
- FKITDEV-8887 iOS audio resume — QA acceptance protocol documented (device repro is the real acceptance gate): baseline-first on
origin/devel, core lock→unlock-to-read-SMS scenario on iPhone Safari, evidence via allowlistedwebrtclog(interruption:resume→senderPeer:audioRecovered {swapped:true}), full test matrix (iPhone/iPad, built-in+AirPods, >30s background crossingconnectionStateRecovery, non-default-mic survival, Android/desktop regression, both directions), and version-risk settlement (pulluserAgentfor rooms 10071/10091 Generali + 2281 CIB; iOS ≥16 weakens only mic-interruption premise, playback+socket-mask hold) — FKITDEV-8887 - FKITDEV-8887 iOS audio resume — two polish fixes applied (UNCOMMITTED): (1) mic recovery routed through
LocalMediaService.startLocalMedia()instead of rawgetUserMediaso saved mic device is respected;videochat.script.jswireslocalMediaintoVideoChatService; (2) WebRTC test globals extracted to shared helpertest/tests/unit/_helpers/webrtc-test-globals.js, removing duplication across 3 test files;videochat.services.test.jsupdated to mocklocalMedia.startLocalMedia+ new guard test; 119 suites / 0 failures / lint clean — FKITDEV-8887
2026-06-11
- FKITDEV-8252 UBI10 Phase B build-verified GREEN (vuer-release) — all no-app-source component images build clean on UBI10. Built natively x86_64 on remote Facekom host (
ssh Facekom→lederera-447-fk-hardver, ProxyJumpFKJumpBox, Docker 29.2.1/buildx 0.31.1, no podman): clamav 419MB, turn 354MB, rabbitmq 520MB, janus 375MB all EXIT 0. janus full compile OK — entireinstall-janus-build-env.sh-devel surface (ffmpeg/libogg/jansson/openssl/glib2-devel, pkgconf, gengetopt, gnutls-devel, libtool, automake, cmake, libcurl/libconfig-devel, gtk-doc) resolves on UBI10+EPEL10+RPMFusion10+CentOS-Stream-10, and libnice 0.1.17 / libsrtp 2.5.0 / libwebsockets 4.3.3 / janus (TechTeamer/janus-gateway@cc0fdca8) all compile. App components’ SYSTEM layer verified via synthetic probe (Mac, emulated): valkey-8.1.7-1.el10 (from CentOS-AppStream-9.repo), java-21-openjdk-headless (both install-java-11.sh AND install-java-17-jre.sh now install java-21), nginx-1.30.2-1.el10.ngx, nodesource pub_22.x — all install on UBI10; app FINAL images (vuer_css/vuer_oss/resource-manager/nyilvantarto_scraper/pdfservice) can’t be fully built locally (need SOURCE_PACKAGE release-tool artifacts, not in repo); postgresql intentionally stays Debian (postgres:bookworm). BUG FOUND+FIXED (only real defect):base/components/clamav/Dockerfileused bespoke inlinemicrodnf install crypto-policies-scripts nano net-tools procps tar(vs install-os.sh) and OMITTEDshadow-utils→groupadd: command not found(STEP 11 exit 127) — SAME gotcha as vuer_build commit4fac31a, missed in vuer-release; fix = add shadow-utils to clamav inline list, UNCOMMITTED pending approval. Reusable build cmd =docker build -f base/components/<c>/Dockerfile --build-context install-scripts=<repo>/install -t <c>:probe <args> base/components/<c>(build-args fromcomponent_env_values.json+default_env_values.json; UID/GID 1000, NODE_VERSION 22); vuer_ossoss-janus-compileis byte-identical build-env to janus ⇒ green janus implies it. Emulation gotchas (NOT migration issues — why we moved to remote host): podman libkrun qemu amd64 saw EPEL metalink 503s, valkey/janus SIGSEGV (exit 139), concurrent-build overlay I/O error (exit 125) — all vanish building native onssh Facekom— FKITDEV-8252
For Agents
Reverse-chronological session log. Newest entries at top, grouped by date (## YYYY-MM-DD). Each bullet: one piece of work, short summary, wikilinks to docs touched. Updated by obsidian-documenter on every project doc write. Read by historian at bootstrap (top ~15 entries).
2026-06-04
- CI gotcha captured (verified 2026-06-04) — the “Github CI - Branch” workflow (
.github/workflows/audit.yaml:33) in vuer_oss is chronically RED on customization branches and must not be read as a regression. The failing stepyarn run improved-yarn-audit --min-severity critical --exclude <GHSAs>exits 4 whenever a critical advisory exists in a transitive dep absent from the--excludeallowlist; as of 2026-06-04 it trips on 4 stale-dep advisories (twig>locutusGHSA-vh9h-29pq-r5m8,@techteamer/timestamp>…>basic-ftpGHSA-5rq4-664w-9x2c,@kafkajs/confluent-schema-registry>protobufjsGHSA-xq3m-2v4x-88gg,request>form-dataGHSA-fjxv-7rqg-78g4). The base branchcustomization/raiffeisenhas failed this exact gate on every push since ≥April 2026 (verified viagh run list) and the team merges through it. Triage check for agents: if your commit didn’t touchpackage.json/yarn.lockAND the base branch is already red, it’s the pre-existing gate, not your change. Team clears it by appending triaged GHSAs to the--excludelist (a security-acceptance decision) or remediating the dep. The real per-change gates are lint (yarn lint, eslint--max-warnings 0, ignorescustomization/test/*) and unit tests (yarn jest <file>) — ci-github-branch-audit-chronically-red
2026-06-03
- FKITDEV-8827 (ASSRAFIPI-119, Raiffeisen PION face-comparison export) — design-phase architecture findings documented (verified vs
vuer_ossworktree oncustomization/raiffeisen). Key facts:faceComparisonsrows key by EITHERroomId(videochat/operator) ORselfServiceRoomId(self-service-v2), no mutual-exclusivity constraint;euclideanDistanceFLOAT nullable = cosine distance 0–2 despite the name; FKs roomId/selfServiceRoomId/customerId/userId/recognitionFromId/recognitionToId, scopewithRecognitions(models.js:298-309,model/faceComparison.js). PION is a videochat flow, NOT self-service —pion-online-verification-phase-1/2protos declarevideochat, setcompareFaceWithnowhere; comparisons come from thevideochat:closehook (faceRecognitionHooks.js:26-44) keyed byroomId, gated by deployment configfaceRecognition.comparisonPairs(FaceRecognitionService.js:7,20) → a self-service-only query returns zero PION rows. 4 call sites, 3 gated byrecognitionOptions.compareFaceWith(liveness-v2SelfServiceV2Service.js:1418, portrait/ID-docFlowService.js:2899-2943@:2902, V1) + the config-gated videochat hook. Verdict is DERIVED not stored —SelfServiceCheckerService.getFaceComparisonResult(:132-154) returns CHECK_SUCCESS(≤perfect)/CHECK_PROBABLE(≤probable, thematchtier collapses here since defaultmatch:null)/CHECK_FAILURE(>probable=different_face), operators<=, defaults{perfect:0.5,match:null,probable:0.6}(:32-48). Threshold sourcing differs: self-service per-room viaselfService:v2:config:stateactivity (oldest[0], ASCgetActivityLogdb/helpers.js:13-33), REPLACES not merges, falls back to globalSettingkeyfaceComparison.value.euclideanDistances(persisted at startup bySettingsService.init()); videochat/operator rows have no per-room path and are NOT verdict-classified at runtime (room.endpoint.js:144shows raw distance only). NocreatedAtindex onfaceComparisons(FK indexes only) → date-range exports risk a full scan; order byidPK. Report-bin pattern = bin →ReportsServicesubclass →_exportReport(rows,null,null,format,null)→ Buffer →fs.writeFile(NOT_prepareDownload/Download-model), butcustomization/bin/raiffeisen-selfservice-failed-reports.js:106callsprepareReportDatawhichNrtFailureReportServicenever implements (abstractReportsService:297) — latent bug masked only because its cron isactive:false(FailedSelfserviceRoomsReport.js:73). DB is Postgres (config/dev.json) but MySQL is supported (sequelize.dialect.name !== 'mysql'guards) → prefer portableLOWER() LIKE LOWER()overILIKE. Design decision: build a GENERAL both-paths export binraiffeisen-facecomparison-export.js+FaceComparisonExportService(spec at.worktrees/vuer_oss-FKITDEV-8827/docs/superpowers/specs/2026-06-03-raiffeisen-facecomparison-export-design.md) — face-comparison-data-verdict-threshold-model
2026-06-02
- FKITDEV-8787 (SLARAFIPI-60, Raiffeisen Myra phantom-room) — fix implemented + pushed on vuer_css branch
fix/FKITDEV-8787-selfservice-v2-abort-clear-state(renamed frombugfix/...—TechTeamer/vuer_cssenforces^(feature|feat|chore|fix|release)/FKITDEV-\d+,bugfix/rejected), 2 commits8586df65(self-heal) +923e4c70(fail-closed hardening), no PR yet. Fix inserver/socket/events/selfservice-v2.js: (1)selfService:v2:start— beforeALREADY_HAS_ROOMthrow, if staleselfServiceRoomData, call OSSrpcClient.selfServiceV2.getRemainingSeconds(roomId); ifremainingSeconds < 1delete stale data so re-init proceeds; (2)selfService:v2:abort— deleteselfServiceRoomDataafter OSS abort RPC succeeds. Key design learning (4-perspective review): first version was fail-OPEN (delete on ANYgetRemainingSecondserror) → re-introduced duplicate rooms from the opposite direction (a transient RPC/OSS error on a LIVE room would clear state →start()creates a 2nd live room, orphaning the original; de-reg loop only cleans the NEW room id). Verified OSSgetRemainingSeconds=Math.max(0, floor((expireAt-now)/1000))afterresolveModels, so a timed-out room returns 0 (the<1branch, not the catch) → catch only hit for truly-absent rooms → fail CLOSED there. RULE: for a duplicate/phantom-room-prevention bug, default-to-preserve-state on ambiguity; “RPC threw” ≠ “resource dead”. Teststest/tests/unit/socket/events/selfservice-v2.test.js75 passing, lint clean (expired/preserved/boundary===1, abort-RPC-failure-does-not-clear, start→abort→start regression), now use REALserver/auth.jspredicates viajest.requireActual(fakes had droppedisAuthorized/customerIdconjunct + collapsedhasAnyRoomroomDatabranch). NEXT: open PR vscustomization/raiffeisen, move ticket Triaged→In Review, coordinate w/ m3szi (FKITDEV-7667) — FKITDEV-8787 - FKITDEV-8581 (SLARAFIPI-53, Raiffeisen) — girinfo no-response observability change (decision + implementation, NOT committed). In
customization/server/backgroundProcess/giro.process.js(renamed fromgiroService.process.jsduring “Raiffeisen PIon project clean-up”;customization/raiffeisenbranch only),GiroProcess.handleTask()catch block split from one generic[GIRO process] Errorinto twologger.errors: “No response from girinfo service (timeout/network)” forRequestError/ETIMEDOUT|ESOCKETTIMEDOUT|ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN, vs “Bad response from girinfo service” for non-200/StatusCodeError/save failure (incl.statusCode); both addelapsedMs/requestTimeout/code. Retry (this.retry) unchanged — log-only. Chose minimal log-only over a heavier “mark bg-process/portal state differently after final no-response retry” option (DEFERRED, ties to the ambiguous-portal-state RCA). Branchfeature/FKITDEV-8581-giro-no-response-log(vuer_oss worktree),node --checkpasses, no giro unit tests, lint clean (one pre-existing env package.json resolver error). Original RCA fixf830fd8e5ashipped 2025-11-28 but YouTrack still Pending — FKITDEV-8581
2026-06-01
- Headless test path for the InstaCash external API + eSign documented (verified live on
lederera). Tool = branch-onlybin/instacash-cli.jsin thevuer_osscontainer (/workspace/vuer_oss, branchcustomization/instacash, NODE_ENV=dev): two jobs — (1)start-server [8189]MOCKS the bank’s/auth+/status(run detached, “InstaCash external server is listening on 8189”); (2) drives the InstaCash external API the bank calls into vuer_oss. Every cmd exceptstart-serverboots the FULL vuer_oss service in-process (keystore + Postgres + RabbitMQamqps://localhost:5671) then HTTPS-callshttps://${hosts.oss}/external/...— needs a healthy stack + conflict-free config, NOT just an HTTP client. Cmds:post-application [rt|nrt] [mkb_szemelyi_kolcson|mkb_mszh|mbh_mfl] [extId] [loan]→{customerId, customerProfileUrl, inviteUrl};get-invite/get-customer;post-contract <id> [pdf](dummy base64 PDF if none) → “IC - Szerződés ajánlat feltöltése” (ic-contract) flow → EsignRPCClient → esign;get-contract/revoke-contract. Prereqs: healthy vuer_oss+esign_css+esign_oss+postgresql+rabbitmq+vuer_cv (esign needs the nginx-PID fix — dev-box-esign-container-startup-failures-2026-06-01);instacash.external.apiKey= Bearer token +authMock;settings.allowSelfSignedCerts: true(CLI setsNODE_TLS_REJECT_UNAUTHORIZED=0). HARD LIMIT: the actual eSign signature is interactive — CANNOT be driven headless (customer opens inviteUrl on css, video-IDs, auths via mock/auth+ SMS123456sms-verification-code-dev-testing, signs in eSign UI); state machine (PortalData)none→initial→applied→identification→identified→signature→signed(+aborted/rejected/accepted). 2026-06-01 run:post-application rt mkb_szemelyi_kolcson→ customerId 28, profilehttps://oss-lederera.facekomdev.net/customer/28, invitehttps://css-lederera.facekomdev.net/dch/eL90QmqJbqWXOjVd;get-customer 28→ product loan, state created;post-contract 28→ HTTP 400{"error":"Contract flow is in progress"}(clean JSON via nginx→vuer_oss, not a crash). OPEN QUESTION: a freshly-created/not-yet-identified application already has a contract flow “in progress” blocking the external upload, butdeveloper-guide-hu.mdsays contract upload is AFTER identification — verify intended InstaCash sequencing — instacash-external-api-esign-headless-test-2026-06-01 - Dev-box infra/image gotcha —
esign_css+esign_osscontainers came upunhealthyduring InstaCash 2026-05-27 devel-update testing on theledererarootless-docker host. PRIMARY (image regression, NOT the update code): both runharbor.techteamer.com/facekom-devel/esign_{css,oss}:2024.4.1-20240614(rebuilt ~2025-12-08, nginx 1.28) as non-roottechteamer(uid 1000), but baked/etc/nginx/nginx.confline 6 =pid /run/nginx.pid;while/runisroot:root→nginx: [emerg] open("/run/nginx.pid") failed (13: Permission denied)→ nginx exits → supervisordFATAL ("Exited too quickly")→ healthcheck flips container unhealthy (node/redis/cron were all RUNNING; nginx-only failure). Ephemeral fix applied:docker exec -u 0 <c> sed -i 's#^pid .*nginx.pid;#pid /tmp/nginx.pid;#' /etc/nginx/nginx.conf+supervisorctl restart nginx→ both wenthealthy(lost on recreate;/etc/nginxNOT bind-mounted — only/workspace/<svc>, certs,/var/logare). Durable fix = bakepid /tmp/nginx.pid;(or chown/run) into the esign images/Dockerfiles, not the host checkout. Also captured: (a) healthcheck/usr/local/bin/supervisor-health-check.shfails if any supervisord prog ≠ RUNNING OR uptime0:00:[0-5][0-9](< 60s anti-flap) → ANYsupervisorctl restart= ~60s unhealthy then recovers (interval 60s, retries 3, start-period 60s); (b)RedisStore is not a constructor= RED HERRING/resolved —server/web/web-server.js:24correctly uses connect-redis v9 ({ RedisStore }/new RedisStore({client})) and/workspace/esign_css/node_modules(host-bind-mounted) has connect-redis@9.0.0; only an OLD ≤v6 factory-style stalenode_modulestriggers it → lesson: after a dep major bump, re-yarn installthe running container; (c) chalk ^5 ESM-only brokeesign_oss/bin/test/trans-check.js:6(require('chalk')) → fixed in LOCAL mac checkout to dynamicimport('chalk')in the existing promise chain (dev toolingyarn transonly; box’s separate/workspace/esign_osscheckout would need it too); (d) SSH from Claude’s shell —kakuwrapper shadowsssh(_kaku_wrapped_ssh: command not found) so usecommand ssh;Facekom=lederera@localhostviaProxyJump FKJumpBox(the real docker host);FKJumpBox=root@lederera-447-fk-hardveris a SEPARATE bare Alpine namespace (no docker/noledererauser); operate viacommand ssh Facekom bash -l -s <<'EOF' … EOF(login shell for docker on PATH) — dev-box-esign-container-startup-failures-2026-06-01
2026-05-29
- Dev-box infra gotcha — vuer_oss CV / photo-processing failures discovered testing InstaCash nrt self-service identification on
lederera/192.168.1.93: customer UI shows “error during photo processing”; oss logsFailed to ping CV server/read ECONNRESET/CV server is down: 'cv-lederera.facekomdev.net'thenCV process error Error: Recipe missing no CV Service!(server/cv/CVRecipe.js:88, viaRecognitionService.runRecognitions→FlowService.submitTaskRecognition→SelfServiceV2Service.photoCandidate:1043which calls submitTaskRecognition unconditionally — no dev flag skips face detection;selfService.ui.disabledChecksonly covers girinfo/emrtd/kau). Two compounding causes: (1)vuer_cvcontainer STOPPED (docker ps -a→Exited (255); nginx returns 502; fixdocker start vuer_cv, ~2 min toUp (healthy), loopback curl then 404 not 502); (2) hairpin NAT — vuer_oss host-networked, its/etc/hostsmaps all*-lederera.facekomdev.netto the box’s own LAN IP192.168.1.93, so a host-net container hitting its own public IP resets at the TLS handshake; fix = remap those names →127.0.0.1(then logsCV server is available). CRITICAL:/etc/hostsis a Docker-regenerated single-file bind mount → edit does NOT survivedocker restart vuer_oss(also re-breaksbin/instacash-cli’soss-lederera/external/...path) → re-apply after every restart, via truncate+write (> /etc/hosts), NOTsed -i(fails “Device or resource busy”) — dev-box-cv-photo-processing-failures - Dev/testing gotcha — controlling the SMS verification code in vuer_oss when the customer phone is fake (discovered testing InstaCash NRT self-service identification):
customer:verification:sendSmshook (customization/listeners/sms-verification.js) usesconfig.get('test.security.tempTokenSms')as a fixed code for every send when truthy, else reuses customer’s stored code or generates a random 6-char token; conventional dev value is123456(alltest/testconfigs/*.json;tempTokenEmail: "mailToken"for email); dev box (lederera, NODE_ENV=dev) does NOT ship it — add the block toconfig/local.json(overridesdev.json), restart vuer_oss (node-config caches at startup), then resend (old random code won’t match123456); alternative recovery = readcustomer.getVerificationCode()via the Customer Sequelize model —customer.dataTEXT column is encrypted (serviceContainer.service.cryptos.data) but the model’sdatagetter (customer.js:23-51,_getDecrypted:316) auto-decrypts, so reading via model returns plaintext (stored asvideochatToken,PortalData.js:1704);smslogs.messageBodyseparately encrypted + SMS bodies not logged = dead ends;matchTokens(ContactValidationService.js:16-20) = case-insensitive exact match — sms-verification-code-dev-testing
2026-05-28
- FKITDEV-8788 / SLARAFIPI-61 — Raiffeisen PION MRZ recognition triage (P2): HU eID back/TD1 reads
valid_score:100on the FULL image but2on the warped/cropped image of the same capture; self-service flow rejects on the crop (VuerCVOCRRecognition.js:45-99warp→MRZ path vs no-warpMRZDetectionApi.js:22-38); SLARAFIPI-61 was marked “Solved” on a CV 4.9.0 test almost certainly run on the FULL image (already passing), not the crop; counterintuitive 191541 (worse, passed) vs 191549 (better, failed) points at warp corner-detection edge case; decisive next step = checklist #2(b) run 4.9.0 MRZ on CROPPED 191549 export image; mitigations = overrideocr.engineto no-warp path or fallback-to-full inSelfServiceCheckerService.getMrzCheckResult(:219-246) — FKITDEV-8788
2026-05-27
- InstaCash devel update wave initiated across all three repos (
update/customization/instacash-2026-05-27branch name across esign_css/vuer_oss/vuer_css); esign_css blocked on orphan-history (b7cee2fis a single squashed commit, no merge base withdevel, 95-path delta); vuer_oss in conflict (50 commits, 10 UU — high-risk oncustomization/listeners/self-service-v2.jsdue to FKITDEV-7518 id-card + InstaCashnewIdFormatAcceptanceoverlap with in-flight FKITDEV-8747/8787); vuer_css in conflict (57 commits, 44 paths via worktree at~/coding/facekom/vuer_css-instacash-updateto protect parallelbugfix/FKITDEV-8787WIP — server-side merged clean, no Express 5 risk; high-risk oncustomization/customizations.jsroute reconciliation and modal a11y triomodal.{js,twig,styl}); vuer_oss has uncommittedstash@{0}“instacash-update-temp-stash-2026-05-27” to pop on the right branch — instacash-update-2026-05-27-status - esign_css
customization/instacashorphan-history operational warning captured: single squashed commit (b7cee2f, 2025-11-20) with zero shared history withdevel,git merge-basereturns empty,git rev-list --count A..Bproduces misleading numbers, standard merge halts onrefusing to merge unrelated histories; 95-path delta (26 M, 14 A devel-only, 55 D devel-deleted but instacash retains — includes intentional MBH/MKB branding asset retention); three workflow options documented (brutal--allow-unrelated-histories, rebase-replay matching1.3.0.10shape, cherry-pick delta forward); needs team confirmation on historical pattern — esign-css-instacash-orphan-history - FKITDEV-8817 Status 2026-05-27:
bugfix/FKITDEV-8817-jquery-updatepushed on esign_css (commitb021019, author andras.lederer, no Claude co-author); 2-file change (delete staleweb/libs/metronic/global/plugins/jquery.min.js, repointclient/ui/layouts/auth/auth.layout.twigat existing/libs/jquery/jquery-3.7.1.min.js); dead-code claim re-verified (routes 344/346 commented out on bothdevelandcustomization/instacash); PR not yet opened; will flow into InstaCash via seconddevel→update/customization/instacash-2026-05-27merge once landed — FKITDEV-8817
2026-05-21
- Face comparison DB query (customer “P”, P3) — verified against local
feature/FKITDEV-8747checkout that failed/different_facecomparison results ARE persisted:faceComparisonstable storesstatus+euclideanDistance(cosine distance 0–2, nullable,faceComparison.js:31) unconditionally regardless of threshold;different_faceis NOT a stored status — it’s theCHECK_FAILUREverdict computed at read time bySelfServiceCheckerService.getFaceComparisonResult()when distance exceeds all thresholds (per-room → global → code defaultprobable:0.6); 4 comparison call sites, liveness-V2 (SelfServiceV2Service.js:1390) gated bytask.options.recognitionOptions.compareFaceWith; delivered read-only SQL (no release) joiningfaceRecognitionsforimageCategoryheuristic to split portrait vs liveness step; corrected triage_shared-context.md(models.jsnot.ts,FlowService.jsunderserver/flow/) — face-comparison-different-face-db-query
2026-05-20
- FKITDEV-8533 — verified PR #7893 (“enable videoOrientExt for tablets”) is unreliable: modern iPadOS 13+ Safari sends a macOS desktop UA,
ua-parser-jsv1 returnsdevice.type === undefined, soisTablet()is false for the very iPads the fix targets;isTablet()is also a strict logical subset ofisMobile()so the new OR’d term is redundant; correct fix = client-sidenavigator.maxTouchPoints > 1 && /Macintosh/detection passed to server; PR CHANGES_REQUESTED (Generali,customization/generali-atvilagitas) — FKITDEV-8533
2026-05-18
- FKITDEV-8252 — Phase A.6.1 complete: all 5 UBI10 base images probe-build green on UBI10+libkrun (portal_css 658 MB, vuer_css 805 MB, vuer_oss 2.44 GB, janus 313 MB, vuer_cv 5.93 GB); 2 new commits (
f38c8e2,b984006) onfeature/FKITDEV-8252-ubi10(17 ahead, not pushed); Q1 revised from per-key rpmkeys to LEGACY (rpmkeys flag disappears after microdnf update; DEFAULT:SHA1 sub-policy doesn’t exist on UBI10); vuer_cv now in-scope; 10 reusable lessons captured; A.6.2 = identify remaining 3 base/* (likelycommon/*) — FKITDEV-8252 - FKITDEV-8252 — UBI10 migration state captured: continuation of 2026-05-13→05-15 work; 3 decisions made (crypto policy = per-key rpmkeys, Oracle OL10 = stay on OL9 RPMs, vuer_cv = 2h spike); 4 Dockerfiles modified uncommitted; probe-builds blocked on podman sandbox allowlist — FKITDEV-8252
- ASSICASH-71 — validation via PROD + 2 UAT log pulls; CSP-channel flood gone everywhere; FKITSYS-9486 fix confirmed holding; previously-open log-volume question closed; status moved to validated — ASSICASH-71
2026-05-13
- FKITDEV-8787 / SLARAFIPI-60 — Raiffeisen Myra phantom-room triage; SDK-local error strings, OSS V2 silently resumes; in-app Restart hypothesis pending Raiffeisen confirmation — FKITDEV-8787
2026-05-12
- ASSICASH-71 — swapped English reply drafts for canonical Hungarian final versions (FKITDEV-8201 + FKITSYS-9486 comments); rest of note unchanged — ASSICASH-71
2026-05-08
- ASSICASH-71 / FKITDEV-8201 InstaCash CSS log-noise triage; reply drafts captured — ASSICASH-71
2026-05-07
- initial portal_css.md created (codebase mapping pass) — portal_css
2026-05-04
- Initialized activity log.
- FKITDEV-8533 iPad videoOrientExt — PR re-review update: #7945 (chrismakaay→devel) two 2026-06-09 “code review fix” commits (
bb06f009b,132ded8c8) corrected the inverted gate (iPad+Safari now ENABLES videoOrientExt viaisVideoOrientExtEnabled = (isTablet&&isSafari) || (!isSafari && !isMobile)), splitisMobile()to exclude tablet, added memoizedgetParser/getDevice/getBrowser+ a UA-regexisTablet()fallback/Macintosh/&&/Mobile\//&&/Safari/i. REMAINING RISK: that fallback needs aMobile/token, but the real FKITDEV-8533 device is iPadOS Safari in DESKTOP mode (Macintosh … Safari/605.1.15, noMobile/) → likely still missed — same ceiling: server-side UA parsing can’t reliably detect a spoofing iPad. #7945 still has 4× copy-paste (not DRY) + no tests; contrast #7942 (wowjeeez, OPEN) which self-reports via clientmaxTouchPoints→isTabletClientDB column + sharedvideoOrientExt.js+ Jest. Both #7945 & #7893 remain OPEN/CHANGES_REQUESTED; decisive test = a real spoofing iPad, not yet reproduced — FKITDEV-8533