# SatelliteHR — QA issues found on 15 Oct 2026 100 issues (20 high · 52 medium · 27 low). Environment: https://qa.satellitehr.com. Source of truth: the append-only ISSUES.md. ### ISS-478 · Tracker SHR-010 · Home "Pending approvals" shows only the requester's name (twice) and approves with one click without saying what - **Module:** Home → Pending approvals · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee1, send a missed-punch correction for 8 Oct. As QA Manager, open Home and look at the Pending approvals card. - **Actual:** The row reads "QO / QA Employee One / QA Employee One" followed by ✓ and ✗. It doesn't say what the request is. The ✓ approves at once; its accessible name is "Approve QA Employee One", the same for every request from that person, so a manager with two items from one employee can't tell which one they approve. The Inbox row for the same item says "Missed punch · 8 Oct · QA Employee One · at Manager approval · 5d left". - **Expected:** Tracker SHR-010: each pending approval says what is being approved (type and dates), as the Inbox does, and the quick buttons name the item. - **Evidence:** scratch/FB/shots/gen_010_mgr_home_pending.png; e2e `tests/feedback/general/general.spec.ts` › "SHR-010 · Home "Pending approvals" says what is being approved, not just who asked" (fails) ### ISS-479 · Tracker SHR-118 · HR, manager and admin Home "Celebrations" covers work anniversaries only; birthdays appear nowhere for them - **Module:** Home → Celebrations / Moments · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As admin (or QA Manager) open Home → Celebrations. As qa.employee1 open `/me` → Moments. - **Actual:** The admin/manager card reads "Quiet week — Work anniversaries show up here a week ahead". Birthdays are not part of it. The employee card "Moments" promises "Birthdays and work anniversaries in the next seven days" and `GET /api/me/people/moments` returns `{"items":[]}` for every persona. Nobody is due 15–21 Oct; Deepak Chauhan's birthday on 22 Oct (day 7) is listed nowhere, so whether names actually appear could not be confirmed. The email to the entity group can't be checked (no mailbox access). - **Expected:** Tracker SHR-118: birthdays and service anniversaries on every Home (the employee card already promises this), and the group email. - **Evidence:** scratch/FB/shots/gen_118_e1_moments.png, gen_118_admin_celebrations.png; e2e `tests/feedback/general/general.spec.ts` › "SHR-118 · the Home Celebrations card of HR and managers includes birthdays, not only work anniversaries" (fails); "SHR-118 · a colleague's birthday or service anniversary in the coming week is shown" (skipped, no data) ### ISS-480 · Tracker SHR-009 · Search → profile no longer errors, but search is 403 for most roles and the profile it opens shows the wrong data - **Module:** Header search (⌘K) → employee profile · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** (a) As QA HR Manager, search "QA Employee Two" in the header and click the result. (b) As QA Manager (also Admin, IT, Accounts, Employee), search "QA Employee One". - **Actual:** (a) The profile opens with no error (the reported error is fixed), but shows "No position · Operations / No location" and "No manager — this person is at the top of the tree" for an employee who is Delivery Manager at Hyderabad HQ reporting to QA Manager (see ISS-527). (b) `GET /api/company/search/quick-search` answers 403 `requiredPermission: ["settings.saved_searches.view"]`, an unrelated permission; the palette shows "No results for "QA Employee One". Try a page or an action." The Department Head gets 200 with `people: []` even for his own department. - **Expected:** Tracker SHR-009: the searched employee's profile opens with correct details; a manager can at least find their own reports. - **Evidence:** scratch/FB/shots/search-click-hrm.png, org-SHR009-profile-no-position.png, search-results-e1.png; e2e `tests/feedback/organization/organization.spec.ts` › "SHR-009 · the profile opened from search shows the employee's position, location and manager" (fails), "SHR-009 · a reporting manager can find their own team member in global search" (fails) ### ISS-481 · Tracker SHR-084 · "Los Angeles" (California) location still has a Bangalore address; nothing compares address and jurisdiction - **Module:** Organization → Locations · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As admin, Organization → Locations → "Los Angeles" → ⋯ → Edit. Then `POST /location/locations` with jurisdiction California and address "80 Residency Road, Bangalore 560025". - **Actual:** "Los Angeles" (code "BAN", California, USD, America/Los_Angeles, kind Other / "Client Site", 2 people, last edited 14 Oct) has the address "New Colony, Bangalore". The address has no state or country field. The API accepted the new California office with a Bangalore address (201; deleted at once). - **Expected:** Tracker SHR-084: a location's address lies in its jurisdiction; at minimum the city/state is checked against the jurisdiction, and the existing record is corrected. - **Evidence:** scratch/FB/shots/org-SHR084-los-angeles-location.png, org-SHR084-los-angeles-edit.png; e2e `tests/feedback/organization/organization.spec.ts` › "SHR-084 · no location sits in one geography with an address in another", "SHR-084 · the platform refuses a California location whose address is in Bangalore" (both fail) ### ISS-482 · Tracker SHR-119 · Employees table: Joined column exists, but no joining-date filter, no entity column/filter and no download - **Module:** Organization → Employees · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As admin, Organization → Employees → filters; Options (sliders icon) → Columns. - **Actual:** Options → Columns offers Joined and Jurisdiction (both hidden by default). Filters are only department, position, location and status. There is no Entity / Organisation column or filter and no Export / Download anywhere on the page (Options holds only Columns and Saved views; "Import CSV / Excel" is an upload). - **Expected:** Tracker SHR-119 (client priority High): filter by hire date, show and filter by entity, download the table. - **Evidence:** scratch/FB/shots/org-employees-options.png, org-employees-table.png; e2e `tests/feedback/organization/organization.spec.ts` › "SHR-119 · … can be filtered by joining date", "… shows and filters by entity (organisation) name", "… can be downloaded" (all fail) ### ISS-483 · Tracker SHR-088 · An employee can be placed in California at a Telangana location; form and server accept it - **Module:** Organization → New employee · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, New employee → Jurisdiction California → Location Hyderabad HQ (Telangana) → Create employee. - **Actual:** No check in the form or on the server. One real create proved it: "FB Test Server Probe" (`d240f1d3-823a-4ad6-a0a1-5d3941fa192e`) was created 201 with California + Hyderabad HQ. Live data already has the same mismatch: Rohan Demo (Tamil Nadu + Remote - India / Telangana), Preboarding Flowtest (California + Ahmedabad - Remote / Gujarat). Jurisdiction drives statutory rules, so these people get the wrong ones. - **Expected:** Tracker SHR-088: the location must belong to the chosen jurisdiction (form and server). - **Evidence:** scratch/FB/shots/ec-combo-caHyd.png; scratch/FB/employee-creation/created-server-probe.txt; e2e `tests/feedback/employee-creation/new-employee-form.spec.ts` › "SHR-088 · an employee in California cannot be placed at a location in Telangana" (fails) ### ISS-484 · Tracker SHR-089 · Emergency contact name may equal the employee's name, and personal email may equal work email - **Module:** Organization → New employee · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** New employee → Emergency contact name = the Legal name; Personal email = Work email → Create employee. - **Actual:** Both accepted by the form and the server (the FB Test Server Probe create had both). Live data: Aarav Testman, Nisha Sample and Rohan Demo have personal email = work email. - **Expected:** Tracker SHR-089: both refused with a message. - **Evidence:** scratch/FB/shots/ec-combo-ecSameName.png, ec-combo-sameEmail.png; e2e `tests/feedback/employee-creation/new-employee-form.spec.ts` › "SHR-089 · the emergency contact cannot have the employee's own name", "SHR-089 · the personal email cannot be the same as the official (work) email" (both fail) ### ISS-485 · Tracker SHR-105 · Phone country codes offer only IN +91 and US +1 - **Module:** Organization → New employee · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** New employee → open the Phone country code, then the emergency contact's. - **Actual:** Both pickers list only IN +91 and US +1. An employee or emergency contact with any other country's number can't be recorded. - **Expected:** Tracker SHR-105: a full country-code list. - **Evidence:** scratch/FB/shots/ec-SHR105-country-codes.png; e2e `tests/feedback/employee-creation/new-employee-form.spec.ts` › "SHR-105 · the phone country code list covers more than India and the US" (fails) ### ISS-486 · Tracker SHR-107 · A US employee phone with an Indian emergency number is accepted - **Module:** Organization → New employee · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** New employee → Phone US +1 4155550101, Emergency phone IN +91 9876509999 → Create. - **Actual:** Accepted by the form and the server (the FB Test Server Probe create went through with +1 / +91). - **Expected:** Tracker SHR-107: the emergency contact uses the same country code as the employee (the client's rule; if it isn't wanted, close the row). - **Evidence:** scratch/FB/shots/ec-combo-usPhoneInEc.png; e2e `tests/feedback/employee-creation/new-employee-form.spec.ts` › "SHR-107 · with a US phone number the emergency contact must use the same country code" (fails) ### ISS-487 · Tracker SHR-108 · Location list isn't filtered by jurisdiction, and Tamil Nadu is offered with no location in it - **Module:** Organization → New employee · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** New employee → Jurisdiction California → open Location. Then Jurisdiction Tamil Nadu → open Location. - **Actual:** California now has a location ("Los Angeles", whose address is in Bangalore: ISS-481), but after picking California the list still offers Ahmedabad - Remote, Demo – Bengaluru Office, Hyderabad HQ, Los Angeles and Remote - India. Tamil Nadu is offered as a jurisdiction but has no location at all. - **Expected:** Tracker SHR-108: after a jurisdiction is chosen, Location lists only that jurisdiction's locations; jurisdictions with no location aren't offered (or say so). - **Evidence:** scratch/FB/shots/ec-SHR108-california-location-options.png; e2e `tests/feedback/employee-creation/new-employee-form.spec.ts` › "SHR-108 · after picking a jurisdiction, Location offers only locations in that jurisdiction", "SHR-108 · every jurisdiction offered for employees has at least one location in it" (both fail) ### ISS-488 · Tracker SHR-004 · Employees created from Organization get no onboarding at all, start Active, and only the HR Head can start it by hand - **Module:** Organization → New employee / Lifecycle → Onboarding · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, create "FB Test Joiner A" from Organization → Employees → New employee with today (15 Oct) as joining date. Check Lifecycle → Onboarding and `GET /people/lifecycle`. - **Actual:** No onboarding record and no workflow run; no active workflow listens to `employee.hired` or `onboarding.started`. The dialog sends `status:"active"`, so a joiner is Active, not Pre-boarding. Recruitment hires do get a pre-boarding checklist (`preOnboardingChecklistId`). The only path is Lifecycle → Onboarding → Start onboarding, and only the HR Head can use it: HR Manager, HR SPOC and Admin get 403 `templates.view` and the checklist picker reads "None (unavailable)" (ISS-536). - **Expected:** Tracker SHR-004 (client priority Critical): an employee created from Organization gets the same pre-boarding checklist as a recruitment hire, automatically. - **Evidence:** scratch/FB/onboarding/shots/create-A-after.png, start-onboarding-dialog.png, start-onboarding-hrh.png; e2e `tests/feedback/onboarding/new-joiner.spec.ts` › "SHR-004 · an employee created from Organization gets the same pre-boarding checklist as a recruitment hire" (fails) ### ISS-489 · Tracker SHR-005 · A joiner starting today gets no document-collection tasks; nothing reaches anyone's Home, Inbox or bell - **Module:** Lifecycle → Onboarding / New joinees · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** Create an employee from Organization with DOJ today (FB Test Org Joiner). Check Home, Inbox and notifications of hrm, hrh, spoc, dh, it and qadmin; open Lifecycle → New joinees. - **Actual:** No document-collection tasks exist and no one is notified. New joinees shows the joiner with Onboarding "Complete" and "Starts in 1d" on the joining day (API `daysIn:-1, onboardingStatus:null, taskTotal:0`). - **Expected:** Tracker SHR-005: document collection starts for a same-day joiner, the owners see the tasks on Home and by email, and onboarding isn't shown as complete. - **Evidence:** scratch/FB/shots/hrm_lifecycle_new_joinees.png; scratch/FB/onboarding/shots/runs/ (new-joiner "while nothing has been done"); e2e `tests/feedback/onboarding/new-joiner.spec.ts` › "SHR-005 · a joiner starting today gets document-collection tasks", "SHR-005 · the joiner's pending onboarding tasks show on the owners' Home" (both fail) ### ISS-490 · Tracker SHR-007 · New joinees says onboarding "Complete" for every joiner who has no onboarding at all - **Module:** Lifecycle → New joinees · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, Lifecycle → New joinees; read the Onboarding column. - **Actual:** "Complete" for FB Test Org Joiner, Neera bv.aj, Probe Candidate and 15 others whose API rows are `onboardingInstanceId:null, onboardingStatus:null, taskTotal:0`. HR is told onboarding is done when it never started. Same pattern as ISS-314 (0/0 shown as complete). - **Expected:** Tracker SHR-007: "Not started" (or no onboarding) when there is none; "Complete" only when every activity is done. - **Evidence:** scratch/FB/shots/hrm_lifecycle_new_joinees.png; e2e `tests/feedback/onboarding/new-joiner.spec.ts` › "SHR-007 · New joinees does not show onboarding "Complete" while nothing has been done" (fails) ### ISS-491 · Tracker SHR-033 · Recruitment hires still sit at Checklist 0/0; with the stakeholder checklist, the manager's and candidate's items go to whoever started it - **Module:** Lifecycle → Onboarding · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** (a) As HR SPOC, Lifecycle → Onboarding → cards of Hire Probe ×2 and Vinay Yenduri. (b) As QA HR Head, Start onboarding for FB Test Org Joiner (reports to QA Department Head) with "Pre-boarding stakeholder checklist". - **Actual:** (a) The cards read "Checklist 0/0" with "Choose … checklist"; for HR SPOC and HR Manager the picker reads "(unavailable)" (403, ISS-536). (b) The template has the client's five groups, but the Reporting manager items (buddy, KRAs, 30-day KT plan, stakeholders, tools, office access) and the candidate's document items are assigned to QA HR Head (the starter); QA Department Head gets 0. The manager and HR Head get no notification. IT and Admin items now do go to QA IT / QA Admin (they went to "Onboarding Management" / "Harshit Bhalla" earlier the same night; ISS-247 is partly fixed). The reported "5/5 completed on creation" did not reproduce. - **Expected:** Tracker SHR-033: a recruitment hire arrives with the stakeholder checklist; each group's items go to that stakeholder (manager items to the joiner's manager) with a notification. - **Evidence:** scratch/FB/onboarding/shots/card-Hire_Probe.png, card-Vinay_Yenduri.png, panel-FB_Test_Joiner_A-0.png; e2e `tests/feedback/onboarding/onboarding-board.spec.ts` › "SHR-033 · no recruitment hire sits in onboarding with an empty 0/0 checklist" (fails); `new-joiner.spec.ts` › "SHR-033 · started with the stakeholder checklist, each stakeholder gets their own items" (fails: owners `{"Reporting manager":"QA HR Head"}`) ### ISS-492 · Tracker SHR-013 · IT gets nothing for a same-day joiner until HR starts onboarding by hand - **Module:** Lifecycle → Onboarding · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Create a DOJ-today joiner from Organization; check QA IT's Home, Inbox and bell. Then, as QA HR Head, Start onboarding with the stakeholder checklist. - **Actual:** Nothing reaches QA IT automatically. After the manual start, QA IT gets "IT asset preparation" and "DevOps and IT tools provisioning" under Home → "Your onboarding tasks" and a notification "…'s onboarding: 2 steps for you"; QA Admin gets 6. So the manual path works; the trigger doesn't exist (ISS-488). - **Expected:** Tracker SHR-013: the IT checklist starts for today's joiners without HR having to start it. - **Evidence:** scratch/FB/onboarding/shots/it.png; `GET /api/me/people/onboarding/tasks/mine` as it; e2e `tests/feedback/onboarding/new-joiner.spec.ts` › "SHR-013 · the IT team gets the IT checklist for a joiner starting today" (fails), "SHR-013 · once onboarding starts, IT is notified and has the IT items on Home" (passes) ### ISS-493 · Tracker SHR-090 · Probation questionnaire lacks six of the seven criteria, has no self rating or comment column, and never reaches the HR Head - **Module:** Lifecycle → Confirmation · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, Lifecycle → Confirmation → Question sets → open "confirmation-review" and "Probation confirmation — standard"; New set → Answer type; open Checklist Flowtest's review → Approval chain. - **Actual:** Both sets ask the same four questions: quality of work, collaboration, ownership (1–5) and a written summary. Communication (verbal/written), job knowledge, initiative in learning, application of skills, problem solving and interpersonal skills are missing. Answer types are only Rating 1–5, Written answer, Yes / no, so "Self rating / Rating / Comments" per criterion is impossible. The chain is Manager's recommendation → "Department Head, or HR" → "HR Partner · any one of 14"; there is no HR Head step, and the chain asks for a decision, not per-criterion input. 8 duplicate "Review questions" sets and an empty "Demo Question Set" are still listed (ISS-085). - **Expected:** Tracker SHR-090: the seven criteria, each with self rating, manager rating and comment, reviewed by Reporting Manager → Department Head → HR Head. - **Evidence:** scratch/FB/onboarding/shots/confirmation-list.png, confirmation-review-panel.png, question-set-new.png; e2e `tests/feedback/confirmation/probation-form.spec.ts` › "SHR-090 · the probation confirmation form lists the seven evaluation criteria", "SHR-090 · each criterion takes a self rating, a rating and a comment", "SHR-090 · the Reporting Manager, the Department Head and the HR Head each review the form" (all fail) ### ISS-494 · Tracker SHR-061 · Resignation: one flat 30-day notice for everyone, only the manager and HR Manager are told, and a same-day leaver still gets "stay conversation within two working days" - **Module:** Lifecycle → Exit / Exit workflow · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** (a) As qa.employee1 (Telangana, India), My journey → Resign (cancelled, never submitted). (b) As QA HR Head, raise a resignation for "FB Test Org Leaver" with last day today; check every stakeholder's bell (withdrawn afterwards). - **Actual:** Self-service resignation now exists (fixed). (a) The form says "Your 30-day notice ends 14 Nov 2026": the notice period is one company-wide `noticePeriodDays: 30` (Configure clearance / `GET /people/offboarding-template`), not 60 days for India. (b) The Exit run notified the reporting manager (2 notices) and QA HR Manager (1). QA HR Head, HR SPOC, IT, Accounts and Admin got nothing. The manager is told "Please hold the stay conversation within two working days … within 48 hours" although the last day is today. The run then waits at "Stay conversation recorded" on an override task for "Test HR Head" (ISS-543). The notice's link goes to the raw workers.dev host (ISS-545). - **Expected:** Tracker SHR-061: notice period by jurisdiction (India 60, other countries 14); every exit stakeholder notified at once; the wording fits the requested last day. - **Evidence:** scratch/FB/onboarding/shots/e1-resign-form.png; run `5c6135f8…` (`ntf-resignation-submitted` recipients: 2); e2e `tests/feedback/exit/exit-forms.spec.ts` › "SHR-061 · the notice period comes from the employee's location: 60 days in India", "SHR-061 · notice periods are set per jurisdiction (India 60 days, other countries 14)" (fail); `resignation-journey.spec.ts` › "SHR-061 · approvals and notifications reach every exit stakeholder as soon as someone resigns", "SHR-061 · the notification fits the requested last working day" (fail) ### ISS-495 · Tracker SHR-096 · HR can't start an exit for half the company; the form still asks for "Last working day" with no resignation date or reason for a changed date - **Module:** Lifecycle → Offboarding → Start exit · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, Offboarding → Start exit → open Employee and scroll; read the fields. As qa.employee1, Resign → pick a date two weeks earlier (cancelled). - **Actual:** The Employee picker offers 36 of 70 active employees (it loads `employees?limit=50` and search filters only that page; ISS-528). QA Employee One/Two, QA Manager, Vikram Raghavan and every recent hire are missing; the API `POST /people/lifecycle/exits` accepts them. HR's form asks Employee, Last working day (no default), Initiation; there's no resignation date and no calculated relieving date. On the employee form an earlier date shows "That is before your notice period ends — it is a request for an early release…" but no separate mandatory reason. Both forms say "Last working day", never "Relieving date". - **Expected:** Tracker SHR-096: any employee can be exited; the form takes the resignation date and works out the relieving date; changing it needs a reason; "Relieving date" wording. - **Evidence:** scratch/FB/onboarding/shots/hr-start-exit-form.png, e1-resign-date-changed.png; e2e `tests/feedback/exit/exit-forms.spec.ts` › "SHR-096 · HR can start an exit for any employee" (fails: 36 offered of 70 active), "SHR-096 · the exit form takes the resignation date and works out the relieving date", "SHR-096 · the forms say "Relieving date", not "Last working day"", "SHR-096 · changing the calculated relieving date asks for a reason for the change" (all fail) ### ISS-496 · Tracker SHR-109 · The exit workflow posts people's last days as announcements, with an email address and ISO dates - **Module:** Announcements (Exit workflow) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA Admin, To read → Announcements (`/me/to-read/announcements`). - **Actual:** Two posts titled "A change in the team": "Single Test One's last day with the team is 2026-10-16…" and "Bulk Test One's last day with the team is 2026-11-11…" (12 Oct). The exit workflow published them (`workflowInstanceId` set, author Kavya Raghunathan) to the Administration department. The second names the successor as a raw email "kavya.raghunathan@opsmaven.test". Dates are ISO, not the company format. - **Expected:** Tracker SHR-109: exits are not posted in Announcements (or only when HR chooses to, with a proper name and date). - **Evidence:** `GET /api/me/organization/announcements` as qadmin (ids `e82f6507…`, `be5bbe32…`); scratch/FB/onboarding/shots/qadmin_me_to_read_announcements.png; e2e `tests/feedback/exit/exit-forms.spec.ts` › "SHR-109 · a resignation or exit is not posted in Announcements" (fails) ### ISS-497 · Tracker SHR-094 · A regularised day looks like any other day: no colour, no legend entry, plain "HD" in the muster - **Module:** Attendance → My attendance / muster · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As qa.employee1, My attendance → 9 Oct (missed-punch correction approved). As HR, download the muster. - **Actual:** 9 Oct has the same `bg-amber-soft` colour as other half days; its label "Friday 9 October · Half day · 9:00 am–8:00 pm · 10.5h worked · 2h overtime — correct this day" says nothing about the correction. The legend has no "corrected" entry. The HR muster shows a plain "HD". - **Expected:** Tracker SHR-094: corrected days have their own colour and label, in the calendar and the muster. - **Evidence:** scratch/FB/shots/att_094_e1_calendar_9oct.png, att_094_hr_muster.png; e2e `tests/feedback/attendance/attendance-pr.spec.ts` › "SHR-094 · a corrected (regularised) day is colour-coded and labelled as corrected" (fails) ### ISS-498 · Tracker SHR-016 · "Request sent" names no approver and shows a route the request won't take - **Module:** Leave & time off → Apply · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, send 1 day of Floating Holidays (18 Jan); read the confirmation; open My leave → card → Approvers. - **Actual:** "Request sent 🎉 1 day of floating holidays, 18 Jan. Watch "My leave" for the decision. It goes through Manager approval (Manager, or HR Partner) → Department head approval (Department Head, or HR)." It doesn't say QA Manager has it and has no link; the department-head step is never reached for 1 day. My leave → Approvers (collapsed by default; skeleton for more than 5 s) does show "Manager approval · Awaiting · due 19 Oct, 3:00 pm · QA Manager". - **Expected:** Tracker SHR-016: after sending, the screen names who has the request now and links to where it is tracked; the route shown is this request's route (UX-026). - **Evidence:** scratch/FB/leave/evidence/SHR-016-request-sent.png, SHR-016-myleave-approvers-loading.png; e2e `tests/feedback/leave/leave-journeys.spec.ts` › "SHR-016 · after sending, the screen names the current approver and links to where the request is tracked" (fails) ### ISS-499 · Tracker SHR-018 · Women no longer see Paternity Leave on the form, but female employees still hold Paternity balances - **Module:** Leave → Balances · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2 (female), Apply → leave types. As QA HR Manager, `GET /api/company/leave/balances?limit=500`, Paternity Leave. - **Actual:** The form is fixed: female QA Employee Two isn't offered Paternity, male QA Employee Three isn't offered Maternity. But Kavya Raghunathan holds 5 days of Paternity Leave and Test Interviewer One 5 days (`policy_entitlement:2026`, never reversed). Same root as ISS-440. - **Expected:** Tracker SHR-018: gender-restricted types are neither offered nor credited to ineligible people; the wrong credits are reversed. - **Evidence:** balances API (15 Oct); e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-018 · a female employee is not offered Paternity Leave" (passes), "SHR-018 · no female employee holds a Paternity Leave balance" (fails) ### ISS-500 · Tracker SHR-019 · Bereavement and Wedding balances were repaired, but neither policy expires or blocks carry-forward, and Wedding allows 10 days per request - **Module:** Leave → Policies · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** `GET /api/company/leave/policies` for BLE and WEDDING-LEAVE; Leave → Balances. - **Actual:** Kavya's 20 bereavement / 14 wedding days were corrected on 14 Oct (`repair:duplicate_credit:2026`, `policy_change:wedding_granted_by_hr`); nobody now holds more than 10 / 7 (fixed). But both policies have `carryForwardRule: {}` (no lapse, no expiry), and Wedding Leave has `maxConsecutiveDays: 10` per request against a yearly cap of 7. - **Expected:** Tracker SHR-019: at most 10 bereavement / 7 wedding days, not carried forward, lapsing at year end; Wedding requests capped at 7. - **Evidence:** policies API; e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-019 · … not carried forward and expire", "SHR-019 · Wedding Leave is capped at 7 days" (both fail) ### ISS-501 · Tracker SHR-020 · The leave form lets 11 days of Bereavement be sent; only the server refuses it - **Module:** Leave & time off → Apply · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** HR credits 12 Bereavement days to qa.employee2 (reversed afterwards). Apply → Bereavement Leave → 12–26 Jan 2027 (11 working days). - **Actual:** The form shows "11 days bereavement leave, 12–26 Jan. Goes to your manager." with Send enabled and no cap message. The server refuses after Send (4xx naming 10). The summary says "Goes to your manager" although 3+ days go Manager → Department head (`gate_long` → `dept_head_approval`, which works). The reported "No working days" error no longer appears. - **Expected:** Tracker SHR-020: the form itself says Bereavement is capped at 10 days and disables Send; the summary shows both approval levels. - **Evidence:** scratch/FB/leave/evidence/SHR-020-bereavement-11-days-form.png; e2e `tests/feedback/leave/leave-journeys.spec.ts` › "SHR-020 · the form refuses Bereavement Leave of more than 10 days" (fails); "SHR-020 · the server refuses…" and "SHR-020 · a request of 3 days or more needs the manager and then the department head" (pass) ### ISS-502 · Tracker SHR-046 · Maternity end date isn't filled 182 days after the start, and men still hold 182-day Maternity balances - **Module:** Leave & time off → Apply / Leave → Balances · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, Apply → Maternity Leave → From 21 Dec 2026. As QA HR Manager, Balances → Maternity Leave. - **Actual:** Counting is right: day-count for 21 Dec 2026 – 20 Jun 2027 = `units 182, countsCalendarDays true`, and male QA Employee Three isn't offered Maternity. But To stays "Pick a date" after From is chosen. Aarav Krishnamurthy and Test Interviewer Two (male) hold 182 days of Maternity (ISS-440 still open). - **Expected:** Tracker SHR-046: the end date fills 182 calendar days after the start; no male employee holds Maternity. - **Evidence:** scratch/FB/leave/evidence/SHR-046-maternity-no-auto-end-date.png; e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-046 · … fills the end date 182 days later", "SHR-046 · no male employee holds a Maternity Leave balance" (both fail) ### ISS-503 · Tracker SHR-047 · Maternity requests skip the manager and department head and fan out as 14 tasks to every HR user - **Module:** Leave / Maternity Leave Approval workflow · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2 (Maternity credited by the test, reversed afterwards), apply for 5 days of Maternity (Jan–Feb 2027); read the run. Then QA HR Manager rejects on the run's own task. - **Actual:** The platform workflow "Maternity Leave Approval" has one step, `hr_approval (hr_partner)`, which created 14 tasks, one per HR user. There is no Reporting Manager step and no Department Head step, so the manager is never asked. When QA HR Manager rejected, the request ended `rejected` and the other 13 tasks were closed `skipped` (ISS-239 is fixed for this flow). - **Expected:** Tracker SHR-047: maternity goes Reporting manager → Department head (→ HR), with notifications; one decision closes it. - **Evidence:** runs "FB Test SHR-047 routing/HR rejection" (tasks `hr_approval` × 14); e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-047 · maternity leave goes to the reporting manager, then the department head" (fails); `leave-journeys.spec.ts` › "SHR-047 · a maternity request reaches the reporting manager first…" (fails), "SHR-047 · when HR rejects a maternity request it ends rejected…" (passes) ### ISS-504 · Tracker SHR-085 · (update to ISS-446 / ISS-450) Wedding Leave is now HR-only, but Floating Holidays and October PTO still went to 1 Oct joiners on 9 Oct - **Module:** Leave / accrual · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Leave → Balances → QA Employee Two (joined 1 Oct) → Balances and ledger. - **Actual:** Fixed: Wedding Leave accrual is `none` and every automatic grant was reversed on 14 Oct. Still reproducing on 15 Oct: Floating Holidays +2 on 9 Oct (8 days after joining, not 30) and PTO +1.25 `policy_entitlement:2026-10` on 9 Oct (should start 1 Nov). The same holds for QA Employee Three. - **Expected:** Tracker SHR-085: Floating Holidays credited 30 days after joining; PTO from the 1st of the month after joining; Wedding Leave only by HR. - **Evidence:** e2 ledger (`/api/company/leave/ledger?employeeId=…`); e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-085 · Floating Holidays are credited only 30 days after…", "SHR-085 · PTO is first credited on the 1st of the month after joining" (both fail); "SHR-085 · Wedding Leave is assigned by HR only…" (passes) ### ISS-505 · Tracker SHR-086 · (update to ISS-441) "Request comp-off" exists but every request is auto-rejected for having no comp-off balance - **Module:** Overtime & comp-off / Comp-Off Request workflow · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, Leave & attendance → Overtime & comp-off → Comp-off wallet → Request comp-off → day worked 12 or 13 Oct, full day, reason → send. - **Actual:** Still reproduces on 15 Oct: runs `14aa7dc9…`, `4e88c316…`, `192916cb…` ended `rejected` at `gate_balance` ("No comp-off to spend"). The form is there, but the request is never seen by anyone, so in practice there's still no way to request comp-off. - **Expected:** Tracker SHR-086: a request for a day worked reaches the approvers; the balance check belongs to spending comp-off, not earning it. - **Evidence:** runs above; scratch/FB/leave/q.ts output; e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-086 · an employee can request comp-off for a day worked" (passes for the option; routing covered by the SHR-092 tests, which fail) ### ISS-506 · Tracker SHR-087 · Leave Without Pay of 3+ days goes from the manager straight to 14 HR users, with no department head - **Module:** Leave / Leave Without Pay workflow · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, apply for 4 days of PTO and, separately, 4 days of LWP; QA Manager approves each. - **Actual:** PTO (Annual Leave Approval) goes to `dept_head_approval` (Test Department Head) after the manager: fixed. LWP (platform workflow) goes Manager → `hr_approval` with 14 HR tasks and no department head step, which is exactly "triggered to HR without dept head approval". - **Expected:** Tracker SHR-087: any leave of more than 3 days, LWP included, goes to the department head after the manager. - **Evidence:** runs "FB Test SHR-087 PTO/LWP"; e2e `tests/feedback/leave/leave-journeys.spec.ts` › "SHR-087 · leave without pay of more than 3 days goes to the department head…" (fails); `leave-rules.spec.ts` › "SHR-087 · leave without pay … also needs the department head" (fails); the PTO tests pass ### ISS-507 · Tracker SHR-068 · Cancelling approved leave of 3 days or fewer is credited back at once; the manager is never asked - **Module:** Leave / Leave Cancellation workflow · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, cancel an approved ½-day PTO (23 Dec 2026): My leave → Cancel this leave → reason → Request cancellation. - **Actual:** `gate_scope` sends `request.days > 3` to `mgr_cancel_review` and everything else to `credit_ledger`. The ½ day was cancelled and credited back within seconds, with no Inbox task for anyone. (In one run the cancellation then hung: ISS-556.) - **Expected:** Tracker SHR-068: every cancellation of approved leave goes to the reporting manager. - **Evidence:** scratch/FB/leave/evidence/SHR-068-cancel.png; run `b50a16ce-413a-444c-8023-600bd9ea91d3`; e2e `tests/feedback/leave/leave-journeys.spec.ts` › "SHR-068 · cancelling approved leave goes to the reporting manager instead of being approved automatically" (fails) ### ISS-508 · Tracker SHR-069 · (update to ISS-440 / ISS-446) 156 automatically credited special-leave balances are still in place; new joiners were credited after 8 days - **Module:** Leave / accrual · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, `GET /api/company/leave/balances?limit=500` and the ledgers of QA Employee Two / Three. - **Actual:** Since 14 Oct the special-leave policies have `accrual.frequency: none`, but the automatic credits were not reversed: 156 balances across the company still hold accrued Bereavement 10 / Examination 5 / Maternity 182 / Paternity 5 (e.g. Aarav, Aditya Ranganathan, Kavya). 1 Oct joiners got Floating Holidays +2 and PTO +1.25 on 9 Oct. Balances that payroll and approvals read are wrong for most of the company. - **Expected:** Tracker SHR-069: Floating Holidays and PTO only after their waiting periods; special leave only when HR assigns it; existing automatic credits reversed. - **Evidence:** ledger and balances API (15 Oct); e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-069 · FLOATING-HOLIDAYS is not credited before…", "…PAID-TIME-OFF-PTO…", "SHR-069 · special leaves … are never credited automatically" (all fail) ### ISS-509 · Tracker SHR-092 · Comp-off for an ordinary working day is accepted, and the chain has a single manager step - **Module:** Overtime & comp-off / Comp-Off Request workflow · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, Request comp-off for Tue 13 Oct 2026 (a regular working day). - **Actual:** `POST` 201; the run is then rejected only for having no comp-off balance (ISS-505), not because it was a working day. Future dates are refused ("Comp-off is for a day you have already worked"). The workflow has one step, `mgr_compoff (manager_or_hr_partner)`. - **Expected:** Tracker SHR-092: comp-off only for work on a weekly off or holiday; approval Reporting manager → Department head → HR SPOC → HR Head. - **Evidence:** runs `14aa7dc9-7df9-4c0a-ab89-4aeca2714c5f`, `192916cb-f82f-410b-a40e-b9cd8a71aa41`; e2e `tests/feedback/leave/leave-journeys.spec.ts` › "SHR-092 · comp-off for a regular working day is refused" (fails); `leave-rules.spec.ts` › "SHR-092 · comp-off requests go Reporting manager → Department head → HR SPOC → HR head" (fails) ### ISS-510 · Tracker SHR-093 · Half-day leave has no First half / Second half choice - **Module:** Leave & time off → Apply · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, Apply → PTO → one day. - **Actual:** The form has only a "Just a half day" switch, with no half selector. The switch itself can't be turned on (ISS-554), and the API stores every half day as `first_half` whatever is sent (ISS-555). The data model and request detail already show "(first half)/(second half)". - **Expected:** Tracker SHR-093: the employee picks First half or Second half, and it is stored. - **Evidence:** scratch/FB/leave/evidence/SHR-093-no-first-second-half.png; e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-093 · a half-day request lets the employee choose First half or Second half" (fails) ### ISS-511 · Tracker SHR-122 · Special leave types with nothing credited are offered on the form with "0 left" - **Module:** Leave & time off → Apply / balance cards · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As qa.employee3 (no special leave credited), Apply → leave type list; balance cards. - **Actual:** Bereavement, Examination, Paternity and Wedding Leave are offered, each "0 left", plus balance cards. A credited special leave does show correctly (qa.employee2: Bereavement "3 left"). - **Expected:** Tracker SHR-122: special types appear only once HR has credited them. - **Evidence:** scratch/FB/leave/evidence/SHR-122-special-types-shown-zero.png; e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-122 · special leave types with no credited balance are hidden…" (fails) ### ISS-512 · Tracker SHR-049 · The hiring-manager list is now limited to the department, but the server accepts a hiring manager from any department - **Module:** Recruitment → Requisition API · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** `POST /api/company/talent/recruitment/requisitions` for Delivery Manager / Delivery with `hiringManagerEmployeeId` = Aarav Krishnamurthy (Executive Office). - **Actual:** 201, REQ-2026-0156 created (cancelled by QA). The form is fixed: after "Delivery Manager" it offers 13 Delivery people. - **Expected:** Tracker SHR-049: the server refuses a hiring manager outside the position's department (400). - **Evidence:** feedback/findings/evidence/recruitment-requisition/req-mgr-hm-options.png; e2e `tests/feedback/recruitment-requisition/form.spec.ts` › "SHR-049 · the server refuses a hiring manager from another department" (fails) ### ISS-513 · Tracker SHR-054 · Hiring manager's "approved" notice claims a salary band was recorded; email delivery can't be seen - **Module:** Recruitment → Requisition notifications · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Take REQ-2026-0157 through approval; read QA Manager's bell. - **Actual:** In-app: "FB Test Req … is approved … with the salary band, the panel and the job description recorded". Requisition v3 records no salary band. Whether the email is sent can't be observed on QA (no outbox / channel API). - **Expected:** Tracker SHR-054: the hiring manager gets an accurate approval notice by email and in-app. - **Evidence:** feedback/findings/evidence/recruitment-requisition/journey-observations.json › approvedNotified.mgr; e2e `tests/feedback/recruitment-requisition/approval.spec.ts` › "SHR-054 · the hiring manager is notified when the requisition is approved (in-app; email is not observable on QA)" (passes for in-app) ### ISS-514 · Tracker SHR-072 · Returned requisition shows "Changes requested" now, but its progress says "Approved", and the manager gets two notices blaming the wrong person - **Module:** Recruitment → Requisition panel / notifications · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** QA HR Head sends REQ-2026-0157 back with a comment. As QA Manager, open it and read the bell. - **Actual:** Fixed: status "Changes requested" with "Sent back by the approver — "" — Edit the requisition, then submit it again". Still wrong: (1) Approval progress reads "Raised · Approved · Approval chain · Approved · Open for sourcing · Queued · No approval workflow is set up for this yet"; (2) two notices per return, one saying "The department head sent the requisition back" although the HR Head did; (3) the panel doesn't name who sent it back. - **Expected:** Tracker SHR-072: the returned requisition shows the step that returned it, one notice naming the approver, and their comment. - **Evidence:** feedback/findings/evidence/recruitment-requisition/journey-mgr-returned.png, req-detail-mgr-changes.png, journey-observations.json › returned.notes; e2e `tests/feedback/recruitment-requisition/approval.spec.ts` › "…approval progress … does not claim it was approved", "…the hiring manager is told who sent it back" (both fail) ### ISS-515 · Tracker SHR-073 · Recruiters are never told about approvals; the "department head approved" notice names the wrong next step; "Recruitment Head" resolves to nobody - **Module:** Recruitment → Requisition notifications / workflow · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Take REQ-2026-0157 / 0160 through Department Head → Management → HR Head; read the bells of the hiring manager, QA HR Head and QA HR Manager (recruiter) and the run events. - **Actual:** On department-head approval the hiring manager and HR Head get "Department head approved: REQ-… — now with HR for the final decision"; the next step is actually Management. QA HR Manager (recruiter) got nothing at any point. After final approval the HR Head gets no notice, and the notice to the "Recruitment Head" relationship resolved to nobody (event warning `some recipients resolved to nobody (6b92f0fb…)`). The sub-process "Recruitment Head names the recruiter" falls back to hr_admin Vikram Raghavan ("nobody here holds this role") on every approved requisition. - **Expected:** Tracker SHR-073: after department-head approval, the HR Head, hiring manager and all recruiters are told, with the real next step. - **Evidence:** feedback/findings/evidence/recruitment-requisition/journey-observations.json › dhNotified, approvedNotified, approvalWarnings; runs `970cb7fd…`, `3f0c1687…`; e2e `tests/feedback/recruitment-requisition/approval.spec.ts` › "SHR-073 · the recruiters are told…", "SHR-073 · once approved, the HR Head, hiring manager and recruiters are all told" (both fail) ### ISS-516 · Tracker SHR-074 · After approval the hiring manager can still post the job, start sourcing and edit the pre-onboarding checklist - **Module:** Recruitment → Requisition panel · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As QA Manager (hiring manager), open the approved REQ-2026-0157. - **Actual:** The notice and the approval details (steps, approvers, times) are there. But the panel offers "Post this role", "Start sourcing" and "Pre-onboarding checklist · Tweak items" (from draft to approved), because QA Manager has `recruitment.job.manage` and the panel treats him as the recruiting team. - **Expected:** Tracker SHR-074: the hiring manager sees the approved requisition read-only; posting and sourcing are the recruiters'. - **Evidence:** feedback/findings/evidence/recruitment-requisition/journey-mgr-approved.png, req-detail-mgr-approved2.png; e2e `tests/feedback/recruitment-requisition/approval.spec.ts` › "SHR-074 · the hiring manager cannot post the job or run sourcing…" (fails) ### ISS-517 · Tracker SHR-111 · An uploaded Word JD's H1 title arrives as literal "

…

" text - **Module:** Recruitment → Raise requisition → Upload JD · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As QA Manager, Raise requisition → Upload JD → `jd-structured.docx` (H1, H2, bullets, numbers, bold). - **Actual:** H2, bullets, numbers and bold come through. The H1 is HTML-escaped: the editor shows `

Delivery Manager

` as text (`/posts/description-text` response `html` starts with `<h1>`). - **Expected:** Tracker SHR-111: the uploaded JD keeps its layout, title included. - **Evidence:** feedback/findings/evidence/recruitment-requisition/req-jd-mgr.png; e2e `tests/feedback/recruitment-requisition/form.spec.ts` › "SHR-111 · an uploaded JD keeps its layout…" (fails) ### ISS-518 · Tracker SHR-022 · A résumé line "Name: Kabir" is saved as the candidate name "Name: Kabir", so every email greets "Hi Name: …" - **Module:** Recruitment → résumé parsing / candidate emails · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, Jobs → Import résumés → Talent pool, a résumé whose first line is "Name: Kabir Fbtest". - **Actual:** The candidate is saved as "Name: Kabir Fbtest". The "Application received" template itself is right (`Hi {candidate.full_name},`). Live: the 12 Oct offer reminder reads "Hi Name: Mahesh Lebaku," (candidate "Name: Mahesh Lebaku", who has offer OFR-2026-0062). Names can't be corrected afterwards (ISS-566). - **Expected:** Tracker SHR-022: the parser drops labels like "Name:"; the greeting uses the real name. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/sent-emails.json (id `01a12e9d…`), hrm-talent-pool-fbtest-names.png; e2e `tests/feedback/recruitment-pipeline/pool-import.spec.ts` › "SHR-022 · a résumé line "Name: Kabir" gives the name "Kabir"…" (fails) ### ISS-519 · Tracker SHR-078 · Candidate interview reminders print the time in UTC (10:42 am for a 4:12 pm IST interview) - **Module:** Recruitment → Interview round (TA SOP) emails · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, Templates → Emails → sent log → "Your interview for … is tomorrow". - **Actual:** The 14 Oct email reads "tomorrow at 14 Oct 2026, 10:42 am" for an interview at 10:42 UTC = 4:12 pm IST. The 9–13 Oct emails print the raw value "2026-10-13 10:50:00+00". The run context has `_timezone: Asia/Kolkata`, ignored. The Schedule dialog claims "Times are sent in the role's local time zone". A candidate who trusts the email turns up 5½ hours early or misses the interview. Slot-proposal and booking emails aren't in the sent log, so their format wasn't seen. - **Expected:** Tracker SHR-078: times in candidate and panel emails in the role's time zone (IST here), with the zone named. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/sent-emails.json (ids `01a13a00…`, `01a134e0…`, `01a132f9…`, `01a130be…`); e2e `tests/feedback/recruitment-pipeline/pipeline-pr.spec.ts` › "SHR-078 · the latest interview reminder email gives the interview time in IST, not UTC" (fails) ### ISS-520 · Tracker SHR-081 · Interviewer notifications link to /inbox?interview=, which opens the plain Approvals inbox - **Module:** Notifications / Inbox · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Open a panel notification (invite, reminder or scorecard nudge), i.e. `/inbox?interview=`. - **Actual:** The Inbox ignores the parameter and shows the plain "Approvals inbox"; there is no Hiring item and no way to reach the interview or the scorecard from it. - **Expected:** Tracker SHR-081: the notification opens the interview and its feedback form. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/hrm-inbox-interview-link.png; e2e `tests/feedback/recruitment-pipeline/pipeline-pr.spec.ts` › "SHR-081 · the interviewer's notification opens the interview and its feedback form" (fails) ### ISS-521 · Tracker SHR-102 · Résumés that start with a section heading are saved under that heading ("Professional Summary"), and candidates are emailed "Dear Professional Summary" - **Module:** Recruitment → résumé parsing · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, import résumés whose first line is "PROFESSIONAL SUMMARY" / "Professional Summary" (name below). - **Actual:** Saved as "PROFESSIONAL SUMMARY" and "Professional Summary" (a "CURRICULUM VITAE" heading is skipped correctly). Live data: candidates named "Professional Summary" (×2) and "Work Experience"; emails went out as "Dear Professional Summary," and "Dear Work Experience,". The names can't be corrected (ISS-566). - **Expected:** Tracker SHR-102: the parser takes the person's name, not a heading. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/hrm-talent-pool-fbtest-names.png, sent-emails.json (`01a132f9…`, `01a130be…`); e2e `tests/feedback/recruitment-pipeline/pool-import.spec.ts` › "SHR-102 · the parser takes the candidate's name, not a section heading" (fails, 2 of 3) ### ISS-522 · Tracker SHR-113 · Interviewers get a same-day in-app "feedback due" note, not an email after 24 hours - **Module:** Recruitment → Interview round (TA SOP) · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Read workflow `om_ta_interviews`, templates `ta_feedback_due` / `ta_feedback_overdue`, and QA Manager's `GET /notification-preferences?channel=email`. - **Actual:** The workflow waits for "Interviewer's feedback recorded by the end of the day" and sends in-app notifications "Your feedback on X is due today" / "… is overdue". It's a notification template, not an email, and QA Manager's email channel for "Scorecard pending" is off. Timing is same day, not 24 h. - **Expected:** Tracker SHR-113: an email reminder to the interviewer when feedback isn't in within 24 hours. - **Evidence:** workflow and template definitions; e2e `tests/feedback/recruitment-pipeline/pipeline-pr.spec.ts` › "SHR-113 · the feedback reminder reaches the interviewer by email…" (fails); "SHR-113 · the interviewer is reminded…" (passes) ### ISS-523 · Tracker SHR-126 · The recruiter sees only "Submitted · Hold · 4/5"; panel answers and comments are shown nowhere - **Module:** Recruitment → candidate profile → Interviews · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, Pipeline → M Srija → View profile → Interviews. - **Actual:** Each panelist shows only "Submitted · Hold · 4/5". The API gives the recruiter the full card (`scores`, `answers`, `recommendation`, `comments`, `blind:false`), but the UI never reads `/interviews/{id}/scorecards`. - **Expected:** Tracker SHR-126: the recruiter and permitted users see the full feedback: ratings, written answers, comments. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/hrm-msrija-profile-no-comments.png; e2e `tests/feedback/recruitment-pipeline/pipeline-pr.spec.ts` › "SHR-126 · the recruiter sees the full feedback…" (fails) ### ISS-524 · Tracker SHR-059 · Offer approval goes Hiring manager → HR review → Finance; it never goes to the HR Head - **Module:** Recruitment → Offer Approval workflow · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As super admin (read only), Settings → Workflows → Offer Approval (company copy, version `a7581f5a`); Runs for OFR-2026-0079, 0072, 0066, 0049. - **Actual:** Steps: `relationship:requisition_hiring_manager` → HR review → Finance signs the compensation; no step goes to the HR Head role. OFR-2026-0079 waits on Test Hiring Manager, 0072 and 0066 on Aarav Krishnamurthy, 0049 (super-admin offer) on the HR-admin fallback. The TA SOP flow that has an HR Head step never runs (ISS-572). - **Expected:** Tracker SHR-059: every offer approval goes to the HR Head, whatever the department. - **Evidence:** runs `68811a48…`, `e6c0815a…`, `43e37663…`, `28bf2363…`; feedback/findings/evidence/recruitment-pipeline/workflows-offer-interview.json; e2e `tests/feedback/recruitment-offer/offer-pr.spec.ts` › "SHR-059 · the offer approval goes to the HR Head, whatever the department" (fails) ### ISS-525 · Tracker SHR-060 · Offer approval item shows role and joining date only: no department, entity or CTC - **Module:** Inbox → offer approval · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Read the approval item of run `68811a48…` (OFR-2026-0079). - **Actual:** "Viveka Massey · OFR-2026-0079 · Delivery Manager · joining Monday 26 October". No department, no entity (OpsMaven Services Pvt. Ltd.), no CTC. The Inbox side panel has a detail block only for requisitions (`talent_requisition`), none for offers. Related: ISS-078. - **Expected:** Tracker SHR-060: the approver sees role, department, entity, CTC and date of joining. - **Evidence:** run `68811a48…` subject/subtitle; e2e `tests/feedback/recruitment-offer/offer-pr.spec.ts` › "SHR-060 · the offer approval shows role, department, entity, CTC and date of joining" (fails) ### ISS-526 · Tracker SHR-120 · Four offers are waiting for approval and none is in the HR Head's Inbox; some have waited on a non-HR approver for over a week - **Module:** Recruitment → Offer approval / Inbox · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, `GET /api/company/inbox`; compare with the offers pending approval. - **Actual:** QA HR Head has 0 pending offer items. OFR-2026-0079, 0072, 0066 and 0049 wait on the requisition's hiring manager (Test Hiring Manager, Aarav Krishnamurthy) or the HR-admin fallback (ISS-524). OFR-2026-0066 has waited on Aarav since 7 Oct, 0072 since 12 Oct, 0049 since 28 Sep; nothing escalates to HR. - **Expected:** Tracker SHR-120: a submitted offer appears in the HR Head's Inbox for approval. - **Evidence:** inbox API as hrh; runs as ISS-524; e2e `tests/feedback/recruitment-offer/offer-pr.spec.ts` › "SHR-120 · offers waiting for approval are in the HR Head's inbox" (fails) ### ISS-527 · Employee profile shows "No position / No location / No manager" for everyone past the first 50 names - **Module:** Organization → Employees → profile (every route in: list, global search, links from Lifecycle) · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, open `/employees/f4b4f6cb-fd04-40ae-9b59-57824a23e8f9/overview` (QA Employee Two) or QA Employee One's profile; compare with Aarav Testman's. - **Actual:** Header "No position · Operations / No location"; Employment POSITION —, DEPARTMENT —, LOCATION —, JURISDICTION —; Reporting lines "No manager — this person is at the top of the tree. Their leave has nowhere to route." `GET /api/company/people/employees/` returns `positionTitle: "Delivery Manager"`, `locationName: "Hyderabad HQ"`, `managerName: "QA Manager"`. The page resolves these from `GET /employees?limit=50&offset=0`, so anyone further down the alphabet is "not found". Aarav Testman (top of the list) shows correctly. HR sees wrong data and a false "leave has nowhere to route" warning for most of the roster (88 employees). - **Expected:** The profile shows the record's own position, location, jurisdiction and manager for every employee. - **Evidence:** scratch/FB/shots/org-SHR009-profile-no-position.png, hrm_employees_15f63196_a104_47e5_aa98_7f0a0b70bcba_overview.png vs hrm_employees_463b32b1_a74c_47d7_9dfe_5b28fec5ffad_overview.png; e2e `tests/feedback/organization/organization.spec.ts` › "SHR-009 · the profile opened from search shows the employee's position, location and manager" (fails) ### ISS-528 · People pickers silently stop at 20 or 50 people: Reports to, orientation Presenter, Start exit - **Module:** Organization → New employee; Lifecycle → Orientation; Lifecycle → Offboarding · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** (1) New employee → Reports to. (2) Orientation → Schedule session → Presenter, type "FB Test Joiner". (3) Offboarding → Start exit → Employee. - **Actual:** (1) Loads `manager-options?limit=20` and stops at "QA HR Manager"; QA Manager, Vikram Raghavan and others can't be chosen as manager. (2) Uses `employees?limit=50` (34 offered); typing filters only what was loaded, so "FB Test Joiner" and every QA persona can't present. (3) Same `limit=50`: 36 of 70 active employees offered; QA Employee One/Two, QA Manager, Vikram Raghavan and every recent hire are missing (the API accepts them). No hint that the list is incomplete. - **Expected:** Every eligible person can be picked, with server-side search. - **Evidence:** scratch/FB/onboarding/orient-opts.log, scratch/FB/onboarding/shots/presenter-typed.png, hr-start-exit-form.png; e2e `tests/feedback/exit/exit-forms.spec.ts` › "SHR-096 · HR can start an exit for any employee" (fails: 36 offered of 70 active) ### ISS-529 · Admin and manager Home stats are wrong: "Total employees 34" with 63 active, and "250% vs 30-day avg" - **Module:** Home (admin, manager) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Open Home as admin and as QA Manager, before anyone has clocked in. - **Actual:** Admin: "Total employees 34 · 209.1% vs last quarter"; the Headcount growth chart's October value is 42; Reports → Employees by status shows 63 active (88 in all); the employees API returns 88 rows. Attendance today: "0% ↘ 250% vs 30-day avg" (manager), "0% / 229%" (admin), which is impossible. - **Expected:** One consistent headcount; comparisons that are arithmetically possible, or none. - **Evidence:** scratch/FB/shots/gen_010_mgr_home_pending.png (top of page); Reports builder "Count by Status: active 63" ### ISS-530 · (update to ISS-052 / ISS-114) Home greeting, sidebar badge and Pending approvals card still disagree - **Module:** Home · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Open Home as QA Manager. - **Actual:** Still reproduces on 15 Oct: the greeting said "3 items are waiting in your inbox" while the card showed "Inbox zero"; later the greeting and the sidebar said 4 while the card listed one item. - **Expected:** The same number everywhere. - **Evidence:** scratch/FB/shots/gen_010_mgr_home_pending.png ### ISS-531 · Notifications: only the newest 50 can ever be read; paging parameters are ignored - **Module:** Notifications (bell, `GET /api/company/notifications`) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Call `GET /api/company/notifications?limit=200` (or with `offset`, `before`, `cursor`, `page`, `topic`), or scroll the bell. - **Actual:** Always the newest 50. The bell has no "load more". Admin has 689 unread and can see 50. - **Expected:** All notifications, paged. - **Evidence:** scratch/FB/general/n_*.json ### ISS-532 · An employee created by mistake can't be deleted or voided; removing a started onboarding strands them in Pre-boarding, where they can't be exited - **Module:** Organization → Employees / Lifecycle · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Create an employee (today's hire date), open ⋯ Actions; try `DELETE`, `PATCH status`. Start onboarding for them, then remove it; try Start exit. - **Actual:** Actions offers only Edit profile, Change manager, Offboard…. No DELETE route (404). `PATCH` status `exited` / `anonymised` / `pre_boarding` → 409 "This status change must use the employee lifecycle module" (or `INVALID_LIFECYCLE_TRANSITION`). A record created with "Generate login" off still gets a (disabled) user account. Start onboarding flips the employee to Pre-boarding; removing the onboarding leaves them in Pre-boarding, and a Pre-boarding employee can't be exited (`400 INVALID_REFERENCE "Employee is unavailable for exit"`). The only way out is a full exit workflow with approvals on real accounts. - **Expected:** A way to void a record created in error before any payroll or attendance exists; removing onboarding restores the previous status. - **Evidence:** scratch/FB/onboarding/shots/empA-actions.png; FB Test Joiner A (`0539873b-4158-44df-ac63-405e17cb5d47`) and FB Test Server Probe (`d240f1d3-823a-4ad6-a0a1-5d3941fa192e`) remain on the tenant for this reason ### ISS-533 · Employees list says "Can sign in" for 12 people who never accepted their invitation and 2 with no account - **Module:** Organization → Employees (Sign-in column) vs Settings → Users · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Employees → search "Role Test"; then Settings → Users → search "Role Test". - **Actual:** Employees list: "Can sign in" (`loginStatus: active`). Settings → Users: Invited, "Waiting on a first sign-in". Same for Aditya Ranganathan, Anant, Meera Kulkarni, Neera bv.aj, Onboarding Management, Pramod Singh, Probe Leaver (Demo), Rhea Menon (Demo), Ritika Chourasia. Abhishek Kumar and Kabir Anand show "Can sign in" with no account in this company. The re-send invitation API answers `status: "active"` for an invited account. This is how "credentials not generated" (SHR-006/031) looks to HR. - **Expected:** One state: "Invited — waiting for first sign-in" until the person signs in; "No login" when there's no account. - **Evidence:** scratch/FB/shots/ec-SHR006-role-test-can-sign-in.png, ec-SHR006-role-test-invited.png; e2e `tests/feedback/employee-creation/positions-import-access.spec.ts` › "SHR-006 · the Employees list says "Can sign in" only for people whose sign-in actually works" (fails) ### ISS-534 · Import and roster-upload previews mark rows "Ready" that the form or server refuses - **Module:** Employees → Import CSV / Excel; Attendance → Shifts & rosters → Upload roster · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** (a) Employees → Import → upload rows with: a name with brackets; personal email = work email; emergency name and number = the employee's own; hire date 2025-08-01; no manager for an Operations position; class Intern for HR Head (preview only, Cancel). (b) Upload roster → CSV with Employee No QAT-999. - **Actual:** (a) All 6 rows "Ready" ("Import 6 employees"); the preview checks only references and formats and makes no API call. Whether the server refuses them on Import was not tested (it would create employees). (b) "Ready"; after Upload: "0 saved · 1 refused by the server — Unknown employee number". - **Expected:** The preview applies the same rules as the form and server, so bad rows are flagged before import. - **Evidence:** scratch/FB/shots/import-preview.png, att_065_upload_bad_preview.png; scratch/FB/employee-creation/fb-import2.csv ### ISS-535 · 10 of 14 positions have no employee class (hiring into them is blocked), the CEO is "Operations", and converted hires carry class "standard" with no manager - **Module:** Organization → Positions; Recruitment → Pre-onboarding → Convert · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Organization → Positions; `GET /api/company/people/employees?limit=500`. - **Actual:** HR Manager, CTO, Compliance Officer, Recruiter and 6 more show "Class not set"; the New employee form says "This position has no employee class yet" and blocks hires into them. The CEO position is classed Operations, so a CEO would need a manager. Employees converted from recruitment 25 Sep – 8 Oct (Debarghya Das, Vinay Kumar, Abhishek Kumar, Phase/Checklist/Preboarding/Onboarding Flowtest, Probe Candidate) have class "standard" (not one of the five), no manager and, for several, an empty work email. - **Expected:** Every position has a class (CEO = Management); conversion applies the same class and manager rules as the form; old records repaired. - **Evidence:** Positions page; employees API (15 Oct) ### ISS-536 · HR Manager, HR SPOC and Admin can't apply an onboarding checklist: 403 templates.view - **Module:** Lifecycle → Onboarding · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager (or HR SPOC, or Admin), Lifecycle → Onboarding → Start onboarding; or open a card at "Checklist 0/0". - **Actual:** `GET /api/company/templates?kind=checklist&status=active` → 403 `requiredPermission templates.view`. The Checklist picker shows "None (unavailable)"; "Use checklist" reads "pre-boarding-stakeholder-checklist (unavailable)"; Edit template shows "(unavailable)". Only the HR Head and the super admin can apply checklists, which is why HR Ops SPOC (the SHR-033 reporter) sees 0/0. - **Expected:** HR Ops roles that run onboarding can pick and apply checklists. - **Evidence:** scratch/FB/onboarding/shots/start-onboarding-dialog.png, edit-template.png ### ISS-537 · Dates and relative times are worked out in UTC, so they're a day off after midnight IST - **Module:** Lifecycle → New joinees; Leave → My leave; Recruitment → requisition SLA (also ISS-519, ISS-547) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Between 00:00 and 05:30 IST: (a) Lifecycle → New joinees for a joiner with DOJ 15 Oct; (b) send leave at 00:50 IST and open My leave; (c) submit a requisition at 01:15 IST Thu and read the step's due date. - **Actual:** (a) "Starts in 1d" on the joining day (API `daysIn:-1`); UX-011 still open. (b) "Waiting for approval · sent yesterday" (submittedAt 2026-10-14 19:20 UTC). (c) "Two business days" from Thu 15 Oct 01:15 IST → `dueAt 2026-10-18T19:45Z`, a Sunday in UTC (shown as Mon 19 Oct 01:15 IST). Same root as the interview reminder in UTC (ISS-519) and punch times (ISS-547). - **Expected:** Dates, day counts and SLAs computed in the tenant's time zone (Asia/Kolkata). - **Evidence:** `GET /api/company/people/new-joinees`; scratch/FB/shots/leave-myleave-e3.png; requisition run chain (REQ-2026-0157) ### ISS-538 · New joinees lists people far outside the 7-day window and some twice; the orientation attendee picker repeats them - **Module:** Lifecycle → New joinees; Orientation → Schedule session · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Lifecycle → New joinees ("Everyone inside their first 7 days"); Orientation → Schedule session → Mandatory attendees. - **Actual:** Joiners on day 8, 9 and 12 are listed, and Meghana Iyengar at day 527 (hire date 2025-05-05). Vinay Yenduri, Phase Flowtest and Abhishek Kumar have duplicate onboarding records and appear twice in New joinees and in both attendee pickers. - **Expected:** Only people within their first 7 days, once each; duplicate onboarding records cleaned up. - **Evidence:** `GET /api/company/people/new-joinees` (items with `daysIn` 8, 9, 12, 527); scratch/FB/onboarding/shots/orientation-attendee-picker.png ### ISS-539 · Withdrawn exits are counted as "early exits moved to Offboarding" - **Module:** Lifecycle → New joinees · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Start an exit for a joiner inside the window, withdraw it, reload New joinees. - **Actual:** The banner went 5 → 7 → 8 as QA's three withdrawn FB Test exits were added. Most exits it counts are `withdrawn` (Ananya Sharma, Deepak Chauhan, Abhishek Kumar, Durgesh ×2…). - **Expected:** Only exits that are still open or completed. - **Evidence:** scratch/FB/onboarding/shots/runs/ (new-joiner, banner 7); `exitCases` statuses ### ISS-540 · Joiner panel's document drop accepts only .pdf and .png, so the checklist's own "HD photograph" (JPEG) can't be uploaded - **Module:** Lifecycle → Onboarding panel · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Open a joiner's panel → "Drop signed documents here". - **Actual:** ".pdf,.png · up to 2MB each". Recruitment → Pre-onboarding accepts .pdf, .docx, .txt, .jpg, .jpeg and .png. - **Expected:** The same file types in both places, at least JPEG. - **Evidence:** scratch/FB/onboarding/shots/pob-srija.png ### ISS-541 · Running confirmation reviews have an unresolved manager and send the HR step to "any one of 14", non-HR people included - **Module:** Lifecycle → Confirmation · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, Lifecycle → Confirmation → Checklist Flowtest (In review) → Approval chain. - **Actual:** MANAGER "—"; "Part of this chain has no approver — Manager's recommendation (Primary Manager: unresolved)". The HR step goes to any one of 14: Durgesh, Vikram Raghavan, HR Ops SPOC Testing, Test HR Head, QA HR SPOC, QA HR Manager, QA HR Head, Raju Rastogi, HR Manager Test(), Aarav Krishnamurthy., Harshit Bhalla, Anant, Kavya Raghunathan, Ops Maven. Related: ISS-087, ISS-088. - **Expected:** The review goes to the employee's reporting manager, then the department head, then the HR Head (SHR-090). - **Evidence:** scratch/FB/onboarding/shots/confirmation-review-panel.png ### ISS-542 · Duplicate active workflow definitions on the same trigger (probation, offer, interview, joiner) - **Module:** Settings → Workflows · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** `GET /api/company/workflows`. - **Actual:** Two active "Probation confirmation" (`2c517c16…`, `86c7dba4…`), both on `confirmation.due`, and two active "Probation Confirmation Review" (`67afdc2d…`, `0a8b7df0…`). Two active "Offer Approval", "Interview round (TA SOP)", "Offer process (TA SOP)", "Offer letter and acceptance (TA SOP)" and "Joiner" (platform + company copies; only the company copies are seen running). If both probation flows fire, one probation raises two questionnaires (not observed: nothing fell due today). Related: ISS-176. - **Expected:** One active definition per trigger, or a clear rule for which copy runs. - **Evidence:** workflows API (15 Oct) ### ISS-543 · Exit approvals are routed to single non-HR or test accounts: "Stay conversation" override to Test HR Head, termination legal gate to Vikram Raghavan - **Module:** Workflows → Exit / Termination · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, raise a resignation and a termination for FB Test Joiner A (both withdrawn); read the runs. - **Actual:** Every HR-raised resignation puts the "Stay conversation recorded" override on the HR Head role and it went to Test HR Head (`01a11a4f…`), not QA HR Head or Kavya. A termination's first gate "HR Legal validated" went to Vikram Raghavan via `relationship:role:executive`, and its legal-review notice fired at once. The reporting manager has no task at this stage, only notifications. - **Expected:** Exit steps go to the employee's own HR owner / the HR Head group and the manager, not to one arbitrary account. - **Evidence:** runs `5c6135f8…`, `24eed545…` (both cancelled) ### ISS-544 · Exit payroll lock date can fall before the exit is raised - **Module:** Lifecycle → Offboarding · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Raise an exit on 15 Oct with last day 15 Oct. - **Actual:** `payrollLockDate: 2026-10-10` ("five days before the last day"), already in the past when the exit is created; nothing warns. - **Expected:** The lock date isn't before the exit date, or HR is warned that payroll for the period may already be locked. - **Evidence:** exit `7ee7c4d0…` (withdrawn) ### ISS-545 · Resignation notification links to the internal workers.dev host and the Inbox, not the exit - **Module:** Notifications (`ntf-resignation-submitted`) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA Department Head, open the "FB Test Org Leaver … has resigned" notification. - **Actual:** "Open the exit: `https://satellite-hr-frontend-final-restructure.polished-mud-fefe.workers.dev/company/…/me/inbox`". The link uses the internal Cloudflare host instead of qa.satellitehr.com (the session isn't there, so the recipient lands on a sign-in) and goes to the Inbox, not the exit. - **Expected:** A link on the tenant's own host that opens the exit case. - **Evidence:** QA Department Head's notifications for exit `9f217dd1…` ### ISS-546 · Clock card sometimes doesn't update after clocking in, inviting a double punch - **Module:** Attendance → My attendance · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee1, My attendance → Clock in (from the prompt or "Clock in again") → In the office. Watch the card. - **Actual:** In 2 of 5 tries the card still read "You haven't clocked in yet / Clock in" (or "Clocked out at … / Clock in again") 4–6 s after `POST /api/me/attendance/my/clock/punch` returned 201. A reload showed the right state. An employee who clicks again punches twice. - **Expected:** The card switches to "On the clock since …" with Clock out as soon as the punch is saved. - **Evidence:** scratch/FB/shots/att_064_after_in.png ### ISS-547 · (update to ISS-422) Clock and punch times still carry a "Z" but hold IST wall-clock time - **Module:** Attendance API · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** At 00:36 IST (19:06 UTC on 14 Oct), `GET /api/me/attendance/my/clock`. - **Actual:** Still reproduces on 15 Oct: `"now":"2026-10-15T00:37:35Z"`; punches `occurredAt "2026-10-15T00:35:23Z"`; attendance rows `firstIn "2026-10-15 00:35:23+00"`. Anything that reads these as UTC (exports, payroll, integrations) is 5½ hours off. See ISS-455/456. - **Expected:** Real UTC, or an explicit +05:30 offset. - **Evidence:** API excerpt above (machine `date -u`: Wed Oct 14 19:06:26 UTC 2026) ### ISS-548 · Roster download and template put default-shift people on "General Shift" on Saturday and Sunday, and the template is pre-filled with every real employee - **Module:** Attendance → Shifts & rosters · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, Download → CSV; Upload roster → CSV template. - **Actual:** "EMP-9909, Abhishek Kumar, 2026-10-17, General Shift, Default shift" and the same for Sunday, for everyone on the default shift, while rostered people show "OFF, Day off" and attendance shows weekly_off. The template holds every employee's real current week (63 × 7 rows). Uploading it unchanged would roster default-shift people to work weekends. - **Expected:** Weekly offs exported as OFF; a template with headers and an example, not the live roster. - **Evidence:** scratch/FB/attendance/dl/hrm_roster-2026-10-12-to-2026-10-18.csv, hrm_tmpl_roster-template.csv ### ISS-549 · Admin role (qa.admin) can't open any Attendance page - **Module:** Attendance (permissions) · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As QA Admin, open /attendance/overview, /attendance/calendar, /attendance/shifts. - **Actual:** "This page is not yours to see" on all three. Super admin and HR Manager can open them. SHR-065/066 were raised by an admin, so either the role is meant to have these pages or the reporter's role needs clarifying. - **Expected:** Clarify which roles download attendance reports and rosters, and grant them. - **Evidence:** probe output for qadmin (15 Oct) ### ISS-550 · (update to ISS-454) The attendance calendar still offers 21 days before the joining date for correction - **Module:** Attendance → My attendance · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As qa.employee1 (joined 1 Oct), My attendance → Previous month. - **Actual:** Still reproduces on 15 Oct: all 21 September working days read "no attendance recorded — request a correction"; the server refuses them later (NOT_EMPLOYED). - **Expected:** Days before joining aren't offered. - **Evidence:** scratch/FB/shots/att_014_september.png; e2e `tests/feedback/attendance/attendance-pr.spec.ts` › "SHR-014 · days before the employee joined are not offered for correction" (fails) ### ISS-551 · (update to ISS-423) A full day stays "Half day" after an approved correction - **Module:** Attendance → My attendance / muster · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** Look at qa.employee1's 9 Oct (missed-punch correction approved, 09:00–20:00). - **Actual:** Still reproduces on 15 Oct: `workedHours: 10.5`, 2 h overtime, `dayStatus: "half_day"`; the muster counts it as HD. Payroll would dock half a day from someone who worked 10.5 hours. - **Expected:** Present. - **Evidence:** `GET /api/me/attendance/my?month=2026-10`; e2e `tests/feedback/attendance/attendance-pr.spec.ts` › "SHR-008 · a day with a full day of hours is not marked Half day" (fails) ### ISS-552 · Withdrawn corrections are stored as "rejected"; the list shows them as "upcoming" - **Module:** Attendance → My corrections · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Withdraw a pending correction (7 Oct), reload My attendance → My corrections. - **Actual:** API `regularizations[].status: "rejected"`. The list shows "Missed punch · 7 Oct / upcoming / Withdrawn by you / Withdrawn", although 7 Oct is past. Declined items show a lowercase "rejected" chip and a "Rejected" chip together. - **Expected:** Status "withdrawn" (as shift swaps use) and one chip. - **Evidence:** scratch/FB/shots/att_withdrawn_reads_rejected.png ### ISS-553 · Muster "Leave" total counts approved leave that hasn't happened yet; Absent is always 0 - **Module:** Attendance → Calendar → Download muster · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** On 15 Oct, download the October muster. - **Actual:** Ananya Iyer (Demo) has Leave = 18, which includes approved leave 16–31 Oct. Absent = 0 for everyone because unpunched working days are blank (GAPS row 3). - **Expected:** Totals up to the report date; unpunched working days without leave counted as absent. - **Evidence:** scratch/FB/attendance/dl/hrm_attendance-muster-2026-10.csv ### ISS-554 · "Just a half day" switch can't be turned on, so half-day leave can't be applied from the UI - **Module:** Leave & time off → Apply · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2 or qa.employee3, Paid Time Off (PTO), From = To = 5 Jan 2027 → click "Just a half day" (mouse and keyboard Space). - **Actual:** The switch stays `aria-checked="false"`; no `day-count?halfDay=true` call is made; the summary stays "1 day". Only the API (`halfDay: true`) creates a half day. - **Expected:** The switch turns on, the summary reads 0.5 day, and the request is sent as a half day. - **Evidence:** scratch/FB/leave/evidence/SHR-093-half-day-switch-stays-off.png; e2e `tests/feedback/leave/leave-rules.spec.ts` › "SHR-093 · the "Just a half day" switch turns on…" (fails) ### ISS-555 · Every half day is stored as "first half"; the requested half is ignored - **Module:** Leave API · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee2, `POST /api/me/leave {kind: application, PTO, startDate=endDate, halfDay: true, dayPart: "second_half"}`. - **Actual:** 201, units 0.5, stored `dayPart: "first_half"`. - **Expected:** `dayPart: "second_half"` stored (the request detail and CSV already have "Day part"). - **Evidence:** e2e `tests/feedback/leave/leave-journeys.spec.ts` › "SHR-093 · a second-half leave is recorded as the second half" (fails: received "first_half") ### ISS-556 · A leave cancellation run hung at "Cancellation confirmed" for 30+ minutes; the cancellation stayed Pending - **Module:** Leave / Leave Cancellation workflow · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** At 01:30 IST, qa.employee2 cancels an approved ½-day PTO on 23 Dec 2026 (My leave → Cancel this leave → reason → Request cancellation). - **Actual:** Events `gate_scope → credit_ledger (done) → step_started notify_cancel_done`, then nothing for 30+ minutes. The day was credited and the leave showed Cancelled, but the cancellation request stayed Pending (it would block later actions on those dates). A second identical cancellation 20 min later finished normally, so it is intermittent. Withdrawn by QA. - **Expected:** The run finishes; the cancellation shows Approved and the employee is told. - **Evidence:** request `c2b2a921-0de9-4f7a-9e52-a60cb1651105`, run `b48b7ab1-7ca6-4cd0-9e45-84a72f642c6a` ### ISS-557 · "Who's off soon" and the team calendar list cancellation records and WFH as time off - **Module:** Leave & time off → Who's off soon (`GET /api/me/leave/team-calendar`) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As qa.employee3, open Leave & time off. - **Actual:** "QA Employee One 26–30 Oct", "26 Oct", "28–29 Oct", "29 Oct – 3 Nov". These are approved cancellation records (e.g. `63dc5201…`, kind `cancellation`; the original LWP `afacfb92…` is Cancelled) and WFH requests (`4490e31a…`). Colleagues are told someone is off when they aren't. - **Expected:** Only approved leave still in force. - **Evidence:** team-calendar response (15 Oct) vs `/api/me/leave/my` of qa.employee1 ### ISS-558 · Leave is accepted for dates after the employee's last working day - **Module:** Leave / Exit · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** qa.employee3 is on notice (exit `dc016d01…`, termination, in clearance, last working day 9 Oct 2026). Apply 1 day of Floating Holidays for 8 Dec 2026. - **Actual:** Accepted and sent to QA Manager (request `a8bdf591…`, run `2ef1d972…`); withdrawn by QA. - **Expected:** Refused: the date is after the last working day. - **Evidence:** `GET /api/me/leave/a8bdf591…/instance` → `context.related.exit` ### ISS-559 · Leave Overview totals count WFH and cancellation records as Leave Without Pay - **Module:** Leave → Overview (`/api/company/leave/reports`) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Manager, Leave → Overview. - **Actual:** "Leave Without Pay 155 days" of 244 approved days. Most of it is WFH requests stored with type LWP (ISS-438) plus approved cancellation records, so company leave totals are inflated. - **Expected:** WFH and cancellations excluded from leave totals. - **Evidence:** reports API response (15 Oct) ### ISS-560 · Requisition submit isn't atomic: an interrupted submit leaves it "Pending approval" with no approval run, for good - **Module:** Recruitment → Requisition · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** As QA Manager, Jobs → draft REQ-2026-0152 → Submit for approval; the browser closed while the button still showed "Submitting…" (~5 s). - **Actual:** Status `pending_approval`, `workflowInstanceId: null`, `/chain` → `{steps: []}` for 13+ minutes; the panel says "Approval chain · Awaiting … No approval workflow is set up for this yet." Nobody can ever approve it (cancelled by QA). The submit itself takes 15–25 s, which makes interruption likely. - **Expected:** Either pending with a run, or still a draft. - **Evidence:** feedback/findings/evidence/recruitment-requisition/req-detail-mgr-stuck.png ### ISS-561 · Any manager can raise a requisition for any position in any department (CEO, CTO, HR Head…) - **Module:** Recruitment → Raise requisition · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA Manager (Delivery, Reporting Manager), Raise requisition → Position. - **Actual:** All 14 positions are offered, including CEO, CTO, HR Head and VP-HR, and can be raised; only the hiring-manager list follows the department. - **Expected:** A manager raises requisitions for their own department's positions (HR can raise for any). - **Evidence:** feedback/findings/evidence/recruitment-requisition/req-form-mgr.png ### ISS-562 · View-only HR SPOC is offered Edit on a requisition, which then fails with 403 - **Module:** Recruitment → Requisition panel · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As QA HR SPOC (only `recruitment.*.view`), open REQ-2026-0152 → Edit. - **Actual:** The API gives `canEdit: true`; the Edit button is offered; `PATCH` → 403 "recruitment.requisition.manage". - **Expected:** No Edit for view-only roles. - **Evidence:** REQ-2026-0152 detail response as spoc ### ISS-563 · Inbox "Send back for changes" didn't answer for 2+ minutes although the requisition was already returned - **Module:** Inbox → requisition · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, Inbox → FB Test requisition → Send back for changes with a comment. - **Actual:** No response after 120 s; the requisition's status had changed within seconds on the server. Same pattern as ISS-448 / ISS-443 / ISS-438. - **Expected:** The action confirms within a few seconds. - **Evidence:** approval journey run (15 Oct), feedback/findings/evidence/recruitment-requisition/inbox-hrh-changes-comment.png ### ISS-564 · Requisition justification refuses a colon or brackets; raise-options lists no locations although submit requires one - **Module:** Recruitment → Requisition API · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** `POST /requisitions` with justification "FB Test: e2e feedback verification run (safe to ignore)"; `GET /requisitions/raise-options`. - **Actual:** `400 "Justification: Letters, spaces and sentence punctuation only — remove 2."` (the colon and the bracket count as non-sentence punctuation). `raise-options` returns no locations. - **Expected:** Ordinary punctuation allowed; raise-options lists what the form needs. - **Evidence:** pipeline test run log (scratch/FB/recruitment-pipeline) ### ISS-565 · Interview reminder says "tomorrow" but goes out at booking time for a same-day interview, sometimes after it started - **Module:** Recruitment → Interview round (TA SOP) · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** Book an interview for today (or within 24 h); read the sent-email log. - **Actual:** The SOP's "The day before the interview" timer is already past, so the reminder fires at once and says "is tomorrow": Lavanya Y sent 10:41 UTC for a 10:42 UTC interview; "Professional Summary" sent 01:56 UTC for an interview that started at 01:55; "Work Experience" sent 15:32:16 for 15:32. Two reminder mechanisms exist (built-in "Reminder: your interview tomorrow — X" and the SOP "Your interview for X is tomorrow"), so candidates can get both. - **Expected:** No "tomorrow" reminder for a same-day interview; one reminder mechanism at a sensible lead time. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/sent-emails.json; run `a306956c…` (`wait_timer_reminder` due 13 Oct 03:30Z, acted 14 Oct 10:41Z) ### ISS-566 · Candidates can't be edited or deleted, so a wrongly parsed name is permanent - **Module:** Recruitment → candidates / Talent pool · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Try to correct "Professional Summary" or "Name: Mahesh Lebaku"; `GET/PATCH/DELETE /candidates/{id}`. - **Actual:** No screen to edit a candidate; the API has no `/candidates/{id}` route (404 for all three). Pool records only age out via retention (12 months inactive). Wrong names keep going out in emails (ISS-518, ISS-521). - **Expected:** Recruiters can correct a candidate's details and remove a record created in error. - **Evidence:** API probes (15 Oct); feedback/findings/evidence/recruitment-pipeline/hrm-talent-pool-fbtest-names.png ### ISS-567 · Scorecard answers are stored under keys that don't match the interview's questions - **Module:** Recruitment → scorecards · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** `GET /interviews?applicationId=…` and `GET /interviews/{id}/scorecards` for M Srija L1, Vinay Yenduri, Viveka Massey. - **Actual:** Cards hold answers `tech_gaps, tech_depth, tech_approach, beh_concerns, beh_ownership, beh_communication` ("the default six" in Settings) while the same interviews list questions `technical_skills, communication, body_language, job_change_reason` (the dialog's default four). Answers can't be paired with their questions; Settings and the dialog disagree on the default set. - **Expected:** Answers keyed to the interview's own questions; one default set. - **Evidence:** API responses (15 Oct) ### ISS-568 · Past interviews stay "scheduled · past — record the outcome" for days with no way to complete them - **Module:** Recruitment → interviews · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Open Kanakam Nagendrababu (7 Oct), Professional Summary (13 Oct), Probe Candidate (30 Sep), Abhishek Kumar (hired, 9 Oct). - **Actual:** All still `scheduled`. The recruiter can only Reschedule / Cancel / No-show; completion depends on every panel scorecard. - **Expected:** A past interview can be closed as held (or is closed once scorecards are in), so pipelines don't show stale "scheduled" rows. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/hrm-interview-actions.png ### ISS-569 · Three job posts are live on the careers site with an empty description - **Module:** Recruitment → posting · **Severity:** Low · **Found:** 15 Oct 2026 - **Steps:** Recruitment → Jobs → posts Delivery Manager (`delivery-manager`), Sr. Associate, Intern Recruiter (posted 6–8 Oct). - **Actual:** Live with no description. Publishing now requires one (SHR-055 fixed), but posts published before the rule were left as they are. - **Expected:** Existing live posts without a description are flagged or unpublished. - **Evidence:** posts API (15 Oct) ### ISS-570 · Super admin's workflow outbox returns other companies' rows and raw SQL with parameters - **Module:** Workflows → Ops outbox · **Severity:** Critical · **Found:** 15 Oct 2026 - **Steps:** As Ops Maven's super admin, `GET /api/company/workflows/ops/outbox?limit=20`. - **Actual:** Rows with `companyId: null` and `01a09014-64ed-…` (not Ops Maven's `82628593-…`), with `lastError` holding full SQL text and its parameters. A company-level admin can read another tenant's outbox data and the platform's SQL. - **Expected:** Only this company's rows; no SQL or parameters in API responses. - **Evidence:** API response (15 Oct, recruitment-pipeline probe) ### ISS-571 · The internal "offer released" mail says the candidate has accepted - **Module:** Recruitment → Templates (TA SOP) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** As QA HR Head, Templates → Emails → `ta_offer_released` (step "HR Operations, hiring manager, HR Head and Recruitment Head told by mail: offer released"). - **Actual:** Subject "{candidate} has accepted the offer for {title}", body "{candidate} has signed the offer … HR Operations now runs the onboarding". Sent on release, it would tell HR an offer was accepted when it was only sent. (The flow hasn't run yet: ISS-572.) - **Expected:** A release notice ("Offer released for for at ", as SHR-025 asks); acceptance has its own message. - **Evidence:** Library templates `offer_released`, `ta_offer_released`; e2e `tests/feedback/recruitment-offer/offer-pr.spec.ts` › "SHR-025 · the "offer released" mail reads "Offer released for for at "" (fails) ### ISS-572 · The Talent Acquisition offer SOP workflows never run - **Module:** Workflows → "Offer process (TA SOP)", "Offer letter and acceptance (TA SOP)" · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** `GET /api/company/workflows` → both definitions (platform and company copies). - **Actual:** `lastRunAt: null` on all copies, while offers are drafted, approved and accepted every day. The HR Head step the client expects ("HR Head told: ready for the numbers") exists only in this SOP, so it is never reached; offers go through "Offer Approval" instead (ISS-524). - **Expected:** One offer flow that runs, with the HR Head step. - **Evidence:** feedback/findings/evidence/recruitment-pipeline/workflows-offer-interview.json ### ISS-573 · (update to ISS-530) Home greeting and Inbox badge say items are waiting while the Pending approvals card says "Inbox zero" - **Module:** Home · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Sign in as QA Department Head and open Home; then as QA Manager. - **Actual:** Still reproduces on 15 Oct (recording of the General video). QA Department Head: the header says "3 items are waiting in your inbox, and 0 people are out today", the sidebar Inbox badge shows 3, and the Pending approvals card says "Inbox zero — No approvals waiting on you. Requests will appear here the moment they arrive." QA Manager: the header says "4 items are waiting", the badge shows 4, and the card lists one item. Same as ISS-530 (and ISS-052 / ISS-114), now also for the Department Head. - **Expected:** The greeting, the Inbox badge and the Pending approvals card show the same items and count. - **Evidence:** scratch/FB/frames/gen-80.jpg (QA Department Head), scratch/FB/frames/gen-16.jpg (QA Manager); output/final/fb-general.mp4 ### ISS-574 · (update to ISS-529) Home KPI trends are impossible: "Total employees 14 ↑1300% vs last quarter", "Attendance today 0% ↓363% vs 30-day avg" - **Module:** Home (KPI tiles) · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Open Home as QA Department Head and as QA Manager before anyone has clocked in. - **Actual:** Still reproduces on 15 Oct (recording of the General video). QA Department Head: "Total employees 14 ↑1300% vs last quarter" and "Attendance today 0% ↓363% vs 30-day avg". QA Manager: "Total employees 3" and "Attendance today 0% ↓250% vs 30-day avg". A fall from any average to 0% can't exceed 100%. The headcount tile also differs per role (3, 14, and 34 for admin in ISS-529) with no label saying what it is scoped to. - **Expected:** Trends that are arithmetically possible (or none when there is no baseline), and a headcount tile that says what it counts (my team / my department / company). - **Evidence:** scratch/FB/frames/gen-80.jpg, scratch/FB/frames/gen-16.jpg; output/final/fb-general.mp4 ### ISS-575 · QA Manager's Home "Headcount by department" card fails: "Couldn't load this right now." - **Module:** Home → Headcount by department · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** Sign in as QA Manager (Reporting Manager, Delivery) and open Home; scroll to "Headcount by department — Top 8 departments by size". - **Actual:** The card shows only "Couldn't load this right now." (Headcount and Teams tabs present, no data). The same card renders a chart for QA Department Head. Seen in the recording of the General video; the failing request was not captured. It may be a permission refusal for the Reporting Manager role shown as a generic error. - **Expected:** The card loads (at least the manager's own department), or isn't shown to a role that can't read it. - **Evidence:** scratch/FB/frames/gen-16.jpg (bottom of page) vs scratch/FB/frames/gen-80.jpg; output/final/fb-general.mp4 ### ISS-577 · Tracker SHR-112 · A second interview round can be booked while the first round's feedback is still pending - **Module:** Recruitment / interviews · **Severity:** Medium · **Found:** 15 Oct 2026 - **Steps:** e2e pipeline journey on our own records ("FB Test Pipeline …", REQ-2026-0176): candidate at the interview stage, T1 round booked (QA Manager chairs, QA Department Head on the panel), no scorecard submitted yet. As QA HR Manager (acting recruiter) book a second round for the next day: `POST /api/company/talent/recruitment/interviews`. - **Actual:** 201 `{"id":"28dbcbf6-…","conflicts":[]}`: the next round is booked with no warning while T1 has no feedback. (A FEEDBACK_PENDING check with an override reason was seen on another candidate, Lavanya Y, so the rule exists but does not hold here.) - **Expected:** Tracker SHR-112: the next round can't be scheduled until the previous interviewer has submitted feedback (409 FEEDBACK_PENDING, or an explicit recorded override). - **Evidence:** e2e `tests/feedback/recruitment-pipeline/pipeline-journey.spec.ts` "SHR-112 · the next round can't be scheduled before the previous round's feedback is in" (15 Oct 03:39 run, output/e2e-feedback-recruitment-2026-10-15.log) ### ISS-578 · The hiring manager who chairs an interview sees 0 candidates in Recruitment → Pipeline - **Module:** Recruitment / pipeline · **Severity:** High · **Found:** 15 Oct 2026 - **Steps:** e2e pipeline journey: requisition "FB Test Pipeline …" with hiring manager QA Manager, candidate at the interview stage, T1 round chaired by QA Manager. As QA Manager open Recruitment → Pipeline. - **Actual:** "0 candidates"; every column is empty ("Drop a candidate here"). The hiring manager and interview chair has no screen route to the candidate's profile, so they can't open "Submit my scorecard" from the app (the scorecard API itself accepts their submission). - **Expected:** Tracker SHR-074/097: the hiring manager sees the pipeline for their position (profiles, interviews, status) and each panelist can open the candidate and submit the scorecard from the app. - **Evidence:** output/evidence/ISS-578-hm-pipeline-empty.png; e2e `pipeline-journey.spec.ts` "SHR-097 · the panelist (here also the hiring manager) finds the candidate in Recruitment to open the scorecard"