SatelliteHR e2e — bugs found

15 Oct 2026, 00:14 IST · qa.satellitehr.com · Attendance & Leave suite · full test report · BUGS.md

2 new failures · 14 open bugs · 7 sheet gaps · 0 now passing

65 passed · 23 failed · 2 skipped · run failed

New failures — drift or new bugs 2

Not tied to a logged issue in the test. A baseline failure means the tenant configuration changed: the diff shows what. Triage each one: log it in ISSUES.md, revert the change, or accept it by updating the baseline.

leave policies @pr › policy set matches the reviewed baseline

tests/contract/policies.spec.ts:21

Error: expect(string).toMatchSnapshot(expected) failed

  @@ -144,11 +144,11 @@
       "name": "Paid Time Off — handbook 16.1",
       "accrual": {
         "rate": 1.25,
         "frequency": "monthly",
         "proration": true,
  -      "waitingDays": 30
  +      "startNextMonth": true
       },
       "carryForward": {
         "maxDays": 30
       },

attendance capture @journey › web clock-in and clock-out record the day against the shift (rows 1–3)

tests/journeys/al01-al02-attendance.spec.ts:15

Error: expect(locator).toBeVisible() failed

Locator: getByRole('dialog').filter({ hasText: /Clocking in at/ }).last().getByText(/Today:/)
Expected: visible
Timeout: 30000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" getByRole('dialog').filter({ hasText: /Clocking in at/ }).last().getByText(/Today:/) with timeout 30000ms
  - waiting for getByRole('dialog').filter({ hasText: /Clocking in at/ }).last().getByText(/Today:/)
    - found getByRole('dialog').filter({ hasText: 'Start today\'s clock' }), intercepting action to run the handler
    - locator handler has finished, waiting for getByRole('dialog').filter({ hasText: 'Start today\'s clock' }) to be hidden
    - interception handler has finished, continuing
screenshot at failure

Open bugs — still reproduce 14

Logged in ISSUES.md. Each assertion states the correct behaviour; the error shows what the platform did instead.

known bugs: data integrity @pr @known-bug › ISS-422 · punch times are stored as real UTC

ISS-422: the server stores IST wall time with a Z suffix (5h30 ahead)

ISS-422 · tests/contract/data-integrity.spec.ts:15

Error: server "now" 2026-10-15T00:14:28Z vs real UTC 2026-10-14T18:44:28.537Z

expect(received).toBeLessThan(expected)

Expected: < 10
Received:   329.99105

known bugs: data integrity @pr @known-bug › ISS-440 · nobody is credited leave types restricted to another gender, or more than the yearly entitlement

ISS-440: male employees hold Maternity Leave; Wedding/Floating/Bereavement credited twice

ISS-440 · tests/contract/data-integrity.spec.ts:22

Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 6

- Array []
+ Array [
+   "Aarav Krishnamurthy.: maternity 182",
+   "Kavya Raghunathan: paternity 5",
+   "Test Interviewer One: paternity 5",
+   "Test Interviewer Two: maternity 182",
+ ]

known bugs: data integrity @pr @known-bug › ISS-446 · no PTO is credited before the policy’s waiting period ends

ISS-446: a 1 Oct joiner was credited October PTO on 9 Oct, inside the waiting period (waitingDays 30, now startNextMonth)

ISS-446 · tests/contract/data-integrity.spec.ts:45

Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 3

- Array []
+ Array [
+   "2026-10-09 1.25 policy_entitlement:2026-10",
+ ]

known bugs: data integrity @pr @known-bug › ISS-445 · "Your shift" shows the shift on a working day, not "Off today"

ISS-445: the panel says "Off today — enjoy the day" on working days

ISS-445 · tests/contract/data-integrity.spec.ts:62

Error: expect(locator).not.toContainText(expected) failed

Locator: locator('#main-content').getByText('Your shift', { exact: true }).locator('xpath=ancestor::*[3]')
Expected pattern: not /Off today/
Received string: "Your shiftFrom your team’s work scheduleSwap a shiftOff today — enjoy the dayGeneral hoursSwap with QA Employee Two · in 6 days · cancelledSwap with QA Employee Two · 12 Nov · cancelledSwap with QA Employee Two · 22 Oct · rejectedSwap with QA Employee Two · 12 Nov · approvedSwap with QA Employee Two · 12 Nov · cancelledSwap with QA Employee Two · 29 Oct · cancelledSwap with QA Employee Two · 4 Nov · rejectedSwap with QA Employee Two · 11 Nov · approvedSwap with QA Employee Two · 11 Nov · cancelledSwap with QA Employee Two · 16 Nov · cancelledSwap with QA Employee Two · 27 Oct · rejectedSwap with QA Employee Two · 26 Oct · cancelledSwap with QA Employee Two · 28 Oct · cancelledSwap with QA Employee Two · 17 Nov · cancelledSwap with QA Employee Two · 4 Nov · rejectedSwap with QA Employee Two · 18 Nov · approvedSwap with QA Employee Two · 3 Nov · cancelledSwap with QA Employee Two · 18 Nov · cancelledSwap with QA Employee Two · 11 Nov · rejectedSwap with QA Employee Two · 23 Oct · approvedSwap with QA Employee Two · 23 Oct · approvedSwap with QA Employee Two · 22 Oct · cancelledSwap with QA Employee Two · 12 Nov · cancelledSwap with QA Employee Two · 22 Oct · rejectedSwap with QA Employee Two · in 6 days · approved"
Timeout: 30000ms

Call log:
  - Expect "not toContainText" locator('#main-content').getByText('Your shift', { exact: true }).locator('xpath=ancestor::*[3]') with timeout 30000ms
  - waiting for locator('#main-content').getByText('Your shift', { exact: true }).locator('xpath=ancestor::*[3]')
    63 × locator resolved to <div class="rounded-lg border border-edge bg-surface shadow-xs">…</div>
       - unexpected value "Your shiftFrom your team’s work scheduleSwap a shiftOff today — enjoy the dayGeneral hoursSwap with QA Employee Two · in 6 days · cancelledSwap with QA Employee Two · 12 Nov · cancelledSwap with QA Employee Two · 22 Oct · rejectedSwap with QA Employee Two · 12 Nov · approvedSwap with QA Employee Two · 12 Nov · cancelledSwap with QA Employee Two · 29 Oct · cancelledSwap with QA Employee Two · 4 Nov · rejectedSwap with QA Employee Two · 11 Nov · approvedSwap with QA Employee Two · 11 Nov · cancelledSwap with QA Employee Two · 16 Nov · cancelledSwap with QA Employee Two · 27 Oct · rejectedSwap with QA Employee Two · 26 Oct · cancelledSwap with QA Employee Two · 28 Oct · cancelledSwap with QA Employee Two · 17 Nov · cancelledSwap with QA Employee Two · 4 Nov · rejectedSwap with QA Employee Two · 18 Nov · approvedSwap with QA Employee Two · 3 Nov · cancelledSwap with QA Employee Two · 18 Nov · cancelledSwap with QA Employee Two · 11 Nov · rejectedSwap with QA Employee Two · 23 Oct · approvedSwap with QA Employee Two · 23 Oct · approvedSwap with QA Employee Two · 22 Oct · cancelledSwap with QA Employee Two · 12 Nov · cancelledSwap with QA Employee Two · 22 Oct · rejectedSwap with QA Employee Two · in 6 days · approved"
screenshot at failure

known bugs: data integrity @pr @known-bug › ISS-447 · the Service Leave policy form shows its rule without a validation error

ISS-447: blank accrual and "Entitlement can't be negative" on open

ISS-447 · tests/contract/data-integrity.spec.ts:76

Error: expect(locator).toHaveCount(expected) failed

Locator:  getByRole('dialog').filter({ hasText: /Edit policy/ }).last().getByText(/Entitlement can't be negative/)
Expected: 0
Received: 1
Timeout:  30000ms

Call log:
  - Expect "toHaveCount" getByRole('dialog').filter({ hasText: /Edit policy/ }).last().getByText(/Entitlement can't be negative/) with timeout 30000ms
  - waiting for getByRole('dialog').filter({ hasText: /Edit policy/ }).last().getByText(/Entitlement can't be negative/)
    62 × locator resolved to 1 element
       - unexpected value "1"
screenshot at failure

known gaps: permissions @pr @known-bug › ISS-444 · mgr can save the roster it is shown (rows 36–37)

ISS-444: reporting managers, department heads and HR SPOC are refused (403) on roster saves

ISS-444 · tests/contract/permissions.spec.ts:41

Error: expect(received).toBe(expected) // Object.is equality

Expected: false
Received: true

known gaps: permissions @pr @known-bug › ISS-444 · dh can save the roster it is shown (rows 36–37)

ISS-444: reporting managers, department heads and HR SPOC are refused (403) on roster saves

ISS-444 · tests/contract/permissions.spec.ts:41

Error: expect(received).toBe(expected) // Object.is equality

Expected: false
Received: true

known gaps: permissions @pr @known-bug › ISS-444 · spoc can save the roster it is shown (rows 36–37)

ISS-444: reporting managers, department heads and HR SPOC are refused (403) on roster saves

ISS-444 · tests/contract/permissions.spec.ts:41

Error: expect(received).toBe(expected) // Object.is equality

Expected: false
Received: true

leave policies @pr › PTO: 1.25 days a month after 30 days, carry-forward 30, LOP fallback (rows 48–51, 60)

ISS-450: since 14 Oct the PTO policy has startNextMonth instead of the 30-day waiting period

ISS-450 · tests/contract/policies.spec.ts:28

Error: expect(received).toMatchObject(expected)

- Expected  - 1
+ Received  + 0

  Object {
    "frequency": "monthly",
    "rate": 1.25,
-   "waitingDays": 30,
  }

known bugs: workflows @pr @known-bug › ISS-452 · the long-leave threshold used by leave approval is a visible parameter

ISS-452: routing works since 14 Oct, but param lv.long_leave_days is still not defined, so the 3-day threshold is a hidden default no one can see or change

ISS-452 · tests/contract/workflows.spec.ts:105

Error: expect(received).toContain(expected) // indexOf

Expected value: "lv.long_leave_days"
Received array: ["ext.ceo_pack_sla", "ext.clearance_trigger", "ext.counteroffer_issue_sla", "ext.counteroffer_response_sla", "ext.damage_assessment_sla", "ext.escalate_to_hr_sla", "ext.exit_docs_sla", "ext.ffs_clear_sla", "ext.ffs_gratuity_target", "ext.ffs_l1", …]

known bugs: workflows @pr @known-bug › ISS-441 · earning comp-off does not require an existing comp-off balance

ISS-441: Comp-Off Request rejects when employee.balance <= 0 and debits the ledger on approval

ISS-441 · tests/contract/workflows.spec.ts:112

Error: expect(received).toBe(expected) // Object.is equality

Expected: false
Received: true

known bugs: leave @journey @known-bug › ISS-453 · a pending Leave Without Pay request can be withdrawn (row 18)

ISS-453: withdrawing a pending LWP request is refused with 403 PROTECTED_RUN ("forced by the platform tier")

ISS-453 · tests/journeys/al04-al05-leave.spec.ts:181

Error: timed out waiting for request withdrawn
screenshot at failure

known bugs: leave @journey @known-bug › ISS-437/439 · approved leave with confirmed unpaid days is posted and stays approved (row 15)

ISS-437/439: post_ledger fails with "Insufficient balance" and the request ends rejected

ISS-437 · ISS-439 · tests/journeys/al04-al05-leave.spec.ts:201

Error: timed out waiting for request decided

known bugs: comp-off @journey @known-bug › ISS-441 · a request to earn comp-off for a weekend reaches the manager (rows 29–30)

ISS-441: Request comp-off is rejected for having no comp-off balance

ISS-441 · tests/journeys/al08-al09-compoff-balances.spec.ts:35

Error: timed out waiting for manager task

Gaps against the workflow sheet 7

The Attendance & Leave sheet asks for this; the platform does not do it (GAPS.md).

known gaps: permissions @pr @known-bug › GAPS row 33 · HR SPOC can adjust special leave balances

HR SPOC has no balance-adjust right on this tenant (GAPS.md row 33)

GAPS.md row 33 · tests/contract/permissions.spec.ts:46

Error: expect(received).toBe(expected) // Object.is equality

Expected: false
Received: true

known gaps: permissions @pr @known-bug › GAPS row 34 · HR SPOC can change leave configuration

HR SPOC is view-only on leave policies on this tenant (GAPS.md row 34)

GAPS.md row 34 · tests/contract/permissions.spec.ts:50

Error: expect(received).toBe(expected) // Object.is equality

Expected: false
Received: true

known gaps: configuration @pr @known-bug › GAPS row 1 · days under 8 hours count as half days

Half-day cut-off is 4 hours on this tenant; the sheet asks for 8 (GAPS.md row 1)

tests/contract/policies.spec.ts:76

Error: expect(received).toBe(expected) // Object.is equality

Expected: 8
Received: 4

known gaps: work from home @journey @known-bug › GAPS row 22 · back-dated work from home is refused

Back-dated WFH is accepted and sent to the manager (GAPS.md row 22)

GAPS.md row 22 · tests/journeys/al06-wfh.spec.ts:79

Error: expect(received).toBeGreaterThanOrEqual(expected)

Expected: >= 400
Received:    201

known gaps: work from home @journey @known-bug › GAPS row 25 · long WFH gets an HR SPOC review

No HR SPOC step in the WFH workflow (GAPS.md row 25)

GAPS.md row 25 · tests/journeys/al06-wfh.spec.ts:87

Error: timed out waiting for HR SPOC task

known gaps: shifts @journey @known-bug › GAPS row 43 · the teammate is asked to accept a swap first

No peer acceptance: the swap goes straight to the manager (GAPS.md row 43)

GAPS.md row 43 · tests/journeys/al10-al11-shifts.spec.ts:87

Error: timed out waiting for teammate task

known gaps: shifts @journey @known-bug › GAPS row 42 · a swap between identical shifts is refused

Eligibility does not check identical shifts (GAPS.md row 42)

GAPS.md row 42 · tests/journeys/al10-al11-shifts.spec.ts:100

Error: expect(received).toBeGreaterThanOrEqual(expected)

Expected: >= 400
Received:    201