Skip to main content

26Q3 Adhoc Requests

Bucket initiative for small, unrelated adhoc requests handled by the Bifrost team in 26Q3. Each request is a self-contained user story with its own PRD file under prds/; they do not share a single product theme beyond being adhoc work that rolls up to Jira epic BIF-8695.

Per the repo's Jira alignment convention, jira_epic lives here on the initiative README (not on the individual PRDs) so the manual per-AC sync is never accidentally triggered. Each PRD references its own Jira Story key in its body.

Flagged exception — A11. Its Jira Story (BIF-8612) is currently parented under BIF-7949 ("26Q2 BIF

  • Production Support"), not under this bucket's Epic BIF-8695 — it was folded into this tracker from a separate body of work rather than created here. Re-parenting it under BIF-8695 is a real Jira write and is left for the TPM to decide/execute, not done silently here.

Scope Changes

  • Backend — billing/subscription sync, schedulers, Modpanel user operations, SSO owner webhook, Self Topup settings, email removal.
  • Frontend — Custom Solution / Insights UI, subscription banner, Modpanel user index, Self Topup checkout.

Stories — per-story tracker (canonical)

This table is the canonical per-story home for the bucket. Each row is one self-contained user story = one Jira Story under Epic BIF-8695, and it is priced, classed, pulled and completed independently — the bucket is one container initiative (one Portfolio row, one Epic), but nothing here shares a fate. The bucket is classed, not ranked: it takes no ## Priority rank on the roadmap (a heterogeneous bucket can't be ordered by one integer, and an urgent adhoc can outrank a ranked initiative) — instead each story carries a Class of Service and the roadmap renders the bucket in its parallel ## Adhoc / Interrupt lane. This is why the per-story detail lives here and not lumped into the roadmap: the roadmap carries only the container + an aggregate rollup; this tracker carries the specifics. It is append-only — the bucket grows by adding rows, never by restructuring the roadmap (see How the bucket grows). Full doctrine + real-world grounding: .claude/reference/adhoc-interrupt-doctrine.md.

  • Story — stable identity A<n>, assigned in creation order and never reused/renumbered (keys the sprint queues; new adhocs get the next free A<n>). Gaps (A5, A6) are intentional — those ids were retired when their stories moved out (see Moved out of this initiative).
  • Class — per-story Class of Service (Kanban): 🔴 Expedite (customer-/revenue-/ security-facing — may preempt ranked work, WIP-limited to expedite_wip_limit in flight + logged in ## Expedite log) · 📅 Fixed-Date (hard external date — reuses commitment_date) · 🟡 Standard (normal pull-in fill, never ahead of ranked work) · ⚪ Intangible (cosmetic / cleanup, slack only). This is where "some items are customer-urgent" is expressed — and, via Expedite, where an adhoc can outrank a ranked initiative. A class, not a rank, so a new story slots in without renumbering. (Migrated 2026-07-09 from the old High/Med/Low tiers: High→Expedite, Med→Standard, Low→Intangible.)
  • Status — live completion, the canonical per-story state: backlogin-progressin-reviewdone. The roadmap forecast row's % done is just the rollup done ÷ total derived from this column; update the cell as work moves and the aggregate follows.
  • BE · FE · QA · Mobile — canonical per-story staffing, one column per discipline (assigned 2026-07-08 by discipline + domain affinity + BE/QA headroom); the roadmap Implementors, capacity.md Allocation and the Sprint-1 queues mirror these. = that discipline isn't in the story's Scope. Separate header-keyed columns (not one merged cell) so the delivery drift linter reconciles each owner. No adhoc story touches Mobile yet — the column exists for growth.
  • Effort is deliberately unsized (captures-never-estimates) — these enter the sprint as goal-led-Kanban pull-in fill, not a capacity-boxed load.
StoryClassStatusAddedScopeBEFEQAMobileJira StorySummary (→ PRD)
A1🔴 Expedite (reassigned BE-only 2026-07-19)backlog2026-07-08BESatyaYoddiBIF-8750Block replace/delete of SSO Owner in Modpanel → prd
A2🔴 Expeditebacklog2026-07-08BESatyaYoddiBIF-8751Listen to SSO Change Owner webhook → prd
A3🔴 Expeditebacklog2026-07-08BE+FEHafrizSyafrizal M.YoddiBIF-8696Payment button for not-enabled SO clients → prd
A4🟡 Standardbacklog2026-07-08BE+FEGrehastaSyafrizal M.YoddiBIF-8749Re-invite pending Qontak One user → prd
A7🔴 Expedite (reclassified 2026-07-19; owner corrected 2026-07-20)backlog2026-07-08BESatyaYoddiBIF-8736Modpanel user index — last activity + masked export → prd
A8🟡 Standardbacklog2026-07-08BEHafrizYoddiBIF-8718IG Comment validity follows subscription end_date → prd
A9🔴 Expedite (reclassified 2026-07-14)in-progress2026-07-08FESyafrizal M.YoddiBIF-8682Custom Solution page — Insights UI polish → prd
A10⚪ Intangiblebacklog2026-07-08BEMadaniYoddiBIF-8747Remove e-commerce expiry-reminder email → prd
A11🔴 Expeditein-progress2026-07-14YoddiBIF-8612Seamless logout across Qontak One, Chat, and CRM — session-invalidation fanout (9 of 13 linked Jira Tasks already Done); BE/FE owners pending staffing → prd
A12🟡 Standardbacklog2026-07-16YoddiBIF-7775Self-service message retry in Modpanel → prd
A13🟡 Standardbacklog2026-07-16YoddiBIF-8236Modpanel account index — columns, filters, export → prd
A14🟡 Standardbacklog2026-07-16YoddiBIF-8298Script — bulk create Qontak One users (>100) → prd
A15🟡 Standardbacklog2026-07-16YoddiBIF-8467Modpanel account quota — recording & loyalty quotas → prd
A16🟡 Standardbacklog2026-07-16YoddiBIF-8806Quota API — reset usage on contract_id change → prd
A17🟡 Standardbacklog2026-07-16YoddiBIF-8826, BIF-8585Launchpad invite email validation (1 email = 1 CID) → prd
A18🟡 Standardbacklog2026-07-17BETBDYoddiBIF-8901Modpanel subscription end_date follows Mekari Billing updates (stop false "about to expire" email after paid renewal) → prd
A19🟡 Standardbacklog2026-07-17BETBDYoddiBIF-8902Auto-resolve stale monitoring alerts when the anomaly clears in the datamart (Support › Monitorings) → prd
A20🟡 Standardbacklog2026-07-17BETBDYoddiBIF-8903Initial AI quota (qontakchat_ai_credit) stops resetting monthly — persists/carries over, no refill (Billing V1 & V3) → prd
A21🔴 Expeditebacklog2026-07-21BESatyaYoddiBIF-9001Launchpad CRS role-name compatibility for new/custom company roles → prd · implementation Task BIF-8906
A22🟡 Standardbacklog2026-07-27BETBDYoddiBIF-9093Add company name to consultant leader approval email subject → prd

A18–A20 mirror their existing Jira allocations (BIF-8901, BIF-8902, and BIF-8903); their repository artifacts (rows + PRDs) were added 2026-07-17. A21 was minted with its own ID (BIF-9001) rather than reusing theirs.

A12–A17 are the 2026-07-16 BIF-8695 sync additions — five previously-unmirrored epic stories (A12–A15, A17) plus the quota-reset PRD (A16). Classed 🟡 Standard on 2026-07-19 per their live Jira priority (all P2/P3 → not Expedite; all functional → not Intangible). Scope/BE/FE stay (unstaffed) with QA defaulted to Yoddi (Lane B) until a staffing pass — classing is orthogonal to staffing. As 🟡 Standard they are pull-in fill, never ahead of ranked work, so classing adds no Expedite-log row and no WIP/preemption.

Progress rollup: 0 of 20 done (0%) as of 2026-07-27 — the count of Status: done rows over total rows. This is the single number mirrored to the roadmap ## Portfolio progress & forecast row; it grows/shrinks automatically as rows are added and Statuses move, with no roadmap edit required beyond refreshing that one derived cell. A11 itself is in-progress (not done) at the tracker level even though 9 of its own 13 linked Jira Tasks are already Done — see prds/seamless-logout.md for that sub-breakdown. (Count rose from 11 to 15 on 2026-07-16: −2 for the Self Top-up stories moved out (old A5/A6), +6 for the BIF-8695 sync additions A12–A17; to 18 on 2026-07-17 with A18/A19/A20 (🟡 Standard billing / monitoring-alert / initial-AI-quota items); then to 20 with A21 (Launchpad/CRS compatibility incident) and A22 (consultant-approval email subject).)

Owner rollup (for the mirrors): BE — Satya (A1, A2, A7, A21), Hafriz (A3, A8), Madani (A10), Grehasta (A4); A11 and A12–A17 BE/FE unstaffed ( until a staffing pass), A18–A20 BE-scoped with owner TBD. FE — Syafrizal M. carries the 3 staffed FE stories (A3, A4, A9; A1 reassigned BE-only to Satya 2026-07-19); A11 and A12–A17 remain unstaffed, while A18–A21 have no FE scope. QA — Yoddi primary on all tracker rows (Lane B default), Izzul backup (initiative qa: only, not per-story). Izzul has ~1 effective QA-day left this quarter. A11 (Seamless Logout) folded in 2026-07-14 from what had briefly been drafted as its own standalone initiative, then a bifrost/engineering-q3-2026 bucket item — like the A12–A17 sync additions its BE/FE owners are genuinely unassigned (not just unsized), so it isn't added to Syafrizal M.'s or any BE engineer's committed load in capacity.md until a real owner is staffed.

⚠️ FE is the binding constraint. 3 of the 8 remaining originally-staffed adhoc stories (A1–A10) carry FE work and all land on Syafrizal M., whose ranked initiative work now reads under at 0.89 after the 2026-07-19 Centralized SSO Token chunk (was 1.21; decision 0002 deferred SSO Phase 2 to Q4 — capacity.md). The chunk clears the over-commit, not the constraint: it opens only ~5.5 effective FE-days of headroom, and these unsized adhoc FE stories are exactly what's meant to fill it — so FE stays the binding lane. They still have no reserved queue slot; they are pull-in-when-clear items, and any that overflow the thin headroom will slip to Q4 unless a second FE engineer is added — the same lever the roadmap/capacity docs already flag. See the Sprint-1 Deviations note. The BE distribution deliberately favours the deepest-headroom engineers (Madani 0.50, Satya 0.64) and keeps related SSO/Modpanel stories (A1/A2) together on Satya. A7 moved off this FE-blocked set 2026-07-19 — reclassed 🔴 Expedite (matching Jira BIF-8736's 2026-07-17 bump to Highest - P0) and corrected back to BE-only Satya ownership on 2026-07-20: the last-activity column and masked export are an internal Modpanel admin-panel surface he can build end-to-end without booking Syafrizal M.'s FE queue, so it closes independent of this constraint. A1 moved off the same way 2026-07-19 — its FE half (block the Replace action, trial-delete confirmation popup) is the same internal Modpanel admin surface, so it was reassigned BE-only to Satya (its existing BE owner, keeping the related A1/A2 pair together) and no longer routes to ESCALATE. A11 and the A12–A17 sync additions are excluded from this count and from Syafrizal M.'s load — their owners are genuinely unassigned (not just unsized), so they carry no committed capacity until staffing lands. A21 is also excluded because it is BE-only; its BE/QA owners are assigned and it carries no FE capacity.

Expedite log

Append-only record of the bucket's 🔴 Expedite classifications. Classifying a story Expedite is free; the act of pulling one in flight (in-progress/in-review) — where preemption actually happens — must have a row here (linter BUCKET_EXPEDITE_UNJUSTIFIED). Preempting a ranked initiative is also persisted into the displaced initiative's dated delivery/status/. WIP limit: expedite_wip_limit: 3 in flight at once (Bifrost's chosen cap; linter BUCKET_EXPEDITE_WIP).

StoryDateAuthorized byPreemptsReason
A12026-07-08addo.hernando@mekari.com— (ESCALATE)Security-facing: block replace/delete of the SSO owner in Modpanel. Expedite-eligible, but BE+FE and FE (Syafrizal M.) is over capacity → routes to ESCALATE (second-FE-engineer decision), not active preemption, this sprint.
A22026-07-08addo.hernando@mekari.com— (gap-fill)Security-facing: listen to the SSO change-owner webhook. BE-only and closeable on Satya alone → pulled in a gap in his blocked queue; displaces no ranked work.
A32026-07-08addo.hernando@mekari.com— (ESCALATE)Customer-/revenue-facing: payment button for not-enabled SO clients. Expedite-eligible, but BE+FE and FE over capacity → ESCALATE, not active preemption, this sprint.
A92026-07-14addo.hernando@mekari.comSelf-Subs (P6, Syafrizal M.'s FE queue)Reclassified from ⚪ Intangible → 🔴 Expedite (Custom Solution Insights UI polish now needs to ship now, not queue behind everything else). Unlike A1/A3, A9 is FE-only (no BE half) and trivial — 3 ACs, a settings-menu entry, a sidebar-label rename, and removing a page title, no new capability — so there is no BE-without-FE "unfinishable WIP" trap forcing an ESCALATE. It closes this window by preempting the first genuinely not-yet-in-flight Ready item on Syafrizal M.'s queue: P4 (Qontak One Team) is already In Deployment and P5 (Sales Invoice + Jurnal) is In Progress per the 2026-07-13 Jira reconciliation, so Self-Subs (P6) is the item that actually yields. Pulled in-progress same day.
A112026-07-14TBDFolded in 2026-07-14 from a standalone bifrost/engineering-q3-2026 bucket item. Classed Expedite reflecting reality already recorded in sprint reconciliation: the originating bug BIF-8570 has recurred as an escalated, off-plan, In Progress item across multiple sprint passes. Unlike A9, this is not a fresh preemption event — the work (9 of 13 linked Tasks) was already in flight before entering this tracker, and its per-repo owners are still TBD (pending Sprint 7), so no ranked Bifrost initiative yields FE/BE capacity to it yet. No formal Expedite authorization is on record — TPM should confirm the classification and name an authorizer.
A12026-07-19addo.hernando@mekari.com— (BE-only, no preemption)Reassigned BE+FE → BE-only on Satya (existing BE owner; keeps the related A1/A2 SSO/Modpanel pair together), applying the same rule as A7: both halves — the owner/is_trial checks and the block-Replace/confirmation-popup UI — are the internal Modpanel admin surface, untouched by clients/real users, so the BE engineer builds it end-to-end without booking Syafrizal M.'s FE queue. Supersedes the 2026-07-08 ESCALATE routing above: A1 no longer waits on the second-FE-engineer decision (ADR 0001) and closes without preempting ranked work (Satya pulls it behind A2, his Sprint-2 PULL-TO-CLOSE).
A72026-07-19addo.hernando@mekari.com— (BE-only, no preemption)Reclassified from 🟡 Standard → 🔴 Expedite, matching Jira BIF-8736's 2026-07-17 bump to Highest - P0 (flagged during Sprint 2 planning, sprint-02 #6 on Satya's queue). Reassigned BE-only from Satya to Grehasta same day: the Modpanel last-activity column + masked export is an internal admin-panel surface Grehasta can build end-to-end without booking Syafrizal M.'s FE queue, so unlike A1/A3 this Expedite closes without preempting any ranked work. Grehasta has a genuine gap right now — Qontak One BE and Self-Subs BE both fully shipped as of 2026-07-19; One CID BE is a flagged blocker pending PM/TPM confirmation, so it isn't absorbing his capacity either.
A72026-07-20addo.hernando@mekari.com— (owner correction; no preemption)Sprint-planning correction: A7 belongs to Satya, not Grehasta. Preserve the 2026-07-19 entry as history; this row supersedes only its owner. Satya pulls A7 after the related A2 → A1 pair. Live Jira still assigns BIF-8736 to Addo and remains an assignment-drift finding.
A212026-07-21addo.hernando@mekari.com— (not yet pulled)Customer-impacting upstream CRS role-name contract break caused login/consultant-mode failures for newly created Qontak One clients; rollback/backfill was initiated, and the Launchpad compatibility fix is tracked as an Expedite backlog item.

A1/A2/A3 are still backlog as of 2026-07-08, so none of them is yet strictly log-required (seeded to record the authorization and why FE capacity prevents them from actually preempting). A9 is the bucket's first real preemption — see the roadmap ## Adhoc / Interrupt lane and the Self-Subs 2026-07-14 status note for the propagated record. A11 is already in-progress on entry (backdated production-support work), not a preemption of ranked Bifrost work. A7 is also still backlog — BE-only and corrected to Satya, so like A2 it's expected to PULL-TO-CLOSE without ever needing to preempt anything. The A12–A17 sync additions are classed 🟡 Standard (2026-07-19) and carry no Expedite row until one is reclassed 🔴 and pulled in flight. A21 is deliberately seeded in the log for its customer-impact rationale but remains backlog; it is not an in-flight preemption until Jira leaves To Do.

Class ↔ Jira-priority realignment (through 2026-07-21). Every row's Class agrees with its live Jira priority (P0/P1 = 🔴 Expedite; P2/P3 not) except A9 (Jira Low - P3), A11 (Jira `Medium

  • P2), and **A21** (Jira P2`), intentionally 🔴 Expedite per their rows above — cost-of-delay calls that outrun the P-level, kept not reverted. Making Jira match instead is a TPM priority write, not done here.

Pull rule (deterministic — how an adhoc gets scheduled)

A bucket takes no ## Priority rank — it holds stories of incompatible urgency (a 🔴 Expedite payment button beside a ⚪ Intangible cleanup), so no single integer can order them. Handling is this per-story pull rule, run off data already captured above (Class / Scope / owner) × capacity.md load × the sprint queue's blocked flags. It replaces "rank the bucket" with "derive each pull," so every future adhoc is scheduled by the rule, never a raw decision. Generic contract: .claude/reference/adhoc-interrupt-doctrine.md.

Eligibility gate — pull A<n> when both hold:

  • E1 — queue gate: the owner's ranked (P1–P12) queue is blocked or between itemsUNLESS the story is 🔴 Expedite, which by definition may interrupt ranked work (the one exception, bounded by expedite_wip_limit + the Expedite log above; 📅 Fixed-Date interrupts only as its date nears). 🟡 Standard / ⚪ Intangible never run ahead of ranked work. (source: sprint queue Status × the Class column)
  • E2 — dependency: any related predecessor story is merged. (source: this tracker)

Pull order among eligible stories (lexicographic, deterministic):

  1. Class — 🔴 Expedite > 📅 Fixed-Date (near date) > 🟡 Standard > ⚪ Intangible. (source: the Class column)
  2. Closeability. Can the story reach done this window with current staffing? A BE-only or FE-only story owned by an engineer with a slot is closeable; a BE+FE story is not closeable while FE (Syafrizal M.) has no free slot — starting its BE creates WIP that can't finish (Kanban waste). Post the 2026-07-19 SSO chunk his committed load reads 0.89 (was over at 1.21; decision 0002), but the ~5.5-day headroom that opened is pre-spoken-for by these unsized adhoc FE stories, so a new BE+FE Expedite still lands with no closeable FE slot → ESCALATE stands. (source: Scope × capacity.md load)
  3. Domain affinity — story shares a surface with the owner's current ranked work (warm context).

Expedite that isn't closeable → ESCALATE, not PREEMPT. A 🔴 Expedite story that can't close because its FE half has no slot is not satisfied by pulling its BE — the priority is met by fixing the constraint (the FE second-engineer decision the capacity docs already flag), not by starting unfinishable WIP. So the rule emits: a completion plan (closeable stories, in pull order), a PREEMPT set (Expedite pulled ahead of ranked work — logged), and an escalation list (Expedite blocked only by the FE constraint).

Each sprint's adhoc rows render this rule's output as an explicit PULL-TO-CLOSE / BE-advance / PREEMPT / ESCALATE verdict per story. Verdicts are scheduling commitments, not completion states — PULL-TO-CLOSE means "pull and finish this sprint", never "already closed"; only a sprint:reconcile recheck evidences completion. Render them with 🎯, never 🟢/✅ — see the current sprint's adhoc queues. The rule consumes the tracker's captured fields and derives scheduling; it re-declares no priority, effort, or staffing. A12–A17 are now classed 🟡 Standard (2026-07-19), so the rule may schedule them as pull-in fill once their Scope/owners are staffed; as Standard they never run ahead of ranked work.

How the bucket grows (adding a new adhoc)

The bucket is designed to absorb new adhoc requests mid-quarter without touching the roadmap ## Priority ranks. To add one:

  1. Author the PRD under prds/ (same lightweight format as the existing ones — a single self-contained user story with a Section-8 story table).
  2. Append a tracker row above with the next free Story id (currently A23; preserve any IDs already allocated in Jira), its Class (🔴 Expedite / 📅 Fixed-Date / 🟡 Standard / ⚪ Intangible), Status: backlog, today's Added date, Scope, Owners, Jira Story key, and summary.
  3. Mint the Jira Story under Epic BIF-8695 (per-user-story, never per-AC — use jira-alignment-check), and mirror its key into the row. Create Tasks via sprint-jira-sync only when someone actually starts it.
  4. Mirror staffing into the roadmap Implementors (union), capacity.md Allocation (adhoc-q3-2026 (DISC) TBD — no man-days), and, if it's being worked this sprint, the relevant Sprint-1 queue as a pull-in row. If it's 🔴 Expedite and you pull it in flight, add an ## Expedite log row (WIP ≤3 in flight) and, if it displaces ranked work, a note in that initiative's dated delivery/status/.
  5. Refresh the rollups — the tracker's Progress line (done ÷ total), the roadmap forecast % done cell, and the roadmap ## Adhoc / Interrupt lane class buckets. The bucket's lane row, Portfolio row and Epic do not change — that stability under growth is the whole point of the container model.

What you never do: give a new adhoc its own roadmap ## Priority rank (a bucket is classed, not ranked — that would renumber P1…Pn on every request), or split the bucket into multiple Epics. Per-story urgency is its Class here; the container keeps one stable lane row.

QA Lane

Lane B (keeps a human QA gate) — advisory, as of 2026-07-08.

  • Basis: team-policy safe default. Every Bifrost initiative is Lane B, and these adhoc stories touch billing validity (A8, A18), AI quota accounting (A20), SSO/Modpanel owner-access controls (A1, A2, A7), a payment button (A3), cross-product session invalidation (A11), and the CRS role-name contract (A21) — money- and security-adjacent surfaces where a silent failure reaches paying customers. The 2026-07-16 sync additions (A12–A17 — Modpanel operations, quota API, Launchpad invite validation) inherit the Lane B default pending a per-story qa-lane-advisor pass.
  • Owner: addo.hernando@mekari.com. Scope: the composite AC ids in each PRD's Section-8 story tables; QA runs per-story as each is pulled.
  • Set as the conservative default without a full qa-lane-advisor pass. A genuinely trivial item (e.g. A10 remove-email, A9 UI polish) may warrant a lighter per-story gate — re-confirm with qa-lane-advisor if the bucket is ever sized. Advisory-only; no CI gate. (A9's Class changed to Expedite 2026-07-14 — that's urgency, an orthogonal axis to QA risk; it's still one of the two lowest-risk stories in the bucket for QA-gate purposes.)

Excluded epic children (not authored as PRDs)

These Story-type children of BIF-8695 were deliberately not mirrored as PRDs here:

Jira StoryStatusReason
BIF-8593To DoEmpty description; belongs to the separate qontak-one-team initiative, not adhoc work.
BIF-8717DoneQA-support-only (Desty broadcast-sidebar verification); already shipped, no build spec.

Task-type children of the epic (e.g. BIF-8829–8834, BIF-8876, BIF-8880 — Qontak One Settings/Insights work items; BIF-8723, BIF-8784) are work items under their owning stories, not PRDs, per the repo's Jira alignment convention.

Moved out of this initiative

The Self Top-up stories below were tracked here as A5 and A6; those A<n> ids are now retired (never reused) and the PRDs live under the Self Topup initiative.

Jira StoryNow lives inReason
BIF-8787self-topupChild of Self Topup Epic BIF-7797, not adhoc Epic BIF-8695. Moved 2026-07-16.
BIF-8788self-topupChild of Self Topup Epic BIF-7797, not adhoc Epic BIF-8695. Moved 2026-07-16.