Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
637 lines
19 KiB
JSON
637 lines
19 KiB
JSON
[
|
||
{
|
||
"id": "T001",
|
||
"description": "The PRD and scratchpad explicitly state that multiple concurrent active `client_contracts` assignments for one client are allowed.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F001",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T002",
|
||
"description": "The PRD and scratchpad explicitly state that invoices remain scoped to exactly one `client_contract_id` even when a client has multiple active contracts.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F002",
|
||
"F003",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T003",
|
||
"description": "Plan/runbook notes explicitly record that historical schema/migrations never enforced a single-active-contract uniqueness rule at the database layer.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F004",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T004",
|
||
"description": "The mixed-currency rule has an explicit documented disposition in the plan instead of remaining an accidental side effect of the singleton rule.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F005",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T005",
|
||
"description": "Wizard basics allows selecting a client that already has another active contract.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F006"
|
||
]
|
||
},
|
||
{
|
||
"id": "T006",
|
||
"description": "Quick-add/edit contract dialog allows selecting a client that already has another active contract.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F007"
|
||
]
|
||
},
|
||
{
|
||
"id": "T007",
|
||
"description": "Wizard UI no longer shows the warning instructing users to terminate the current contract or save as draft before creating another active contract.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F008"
|
||
]
|
||
},
|
||
{
|
||
"id": "T008",
|
||
"description": "Quick-add/edit dialog no longer disables submit because another active contract exists for the selected client.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F009"
|
||
]
|
||
},
|
||
{
|
||
"id": "T009",
|
||
"description": "ClientContractsTab restore flow succeeds even when the client already has another active contract.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F010"
|
||
]
|
||
},
|
||
{
|
||
"id": "T010",
|
||
"description": "ClientContractsTab set-to-active flow succeeds even when the client already has another active contract.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F011"
|
||
]
|
||
},
|
||
{
|
||
"id": "T011",
|
||
"description": "Alternate `Contracts.tsx` restore/set-active actions no longer reject solely because another active contract exists.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F012"
|
||
]
|
||
},
|
||
{
|
||
"id": "T012",
|
||
"description": "Static/wiring coverage proves no live billing UI flow still passes active-contract-derived `disabledClientIds` or singleton checks to block client selection.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F006",
|
||
"F007",
|
||
"F013",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T013",
|
||
"description": "`updateContract(... status: 'active')` no longer rejects because another active contract exists for one of the assigned clients.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F014"
|
||
]
|
||
},
|
||
{
|
||
"id": "T014",
|
||
"description": "Expired contract reactivation no longer rejects because a different active contract exists for the same client.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F015"
|
||
]
|
||
},
|
||
{
|
||
"id": "T015",
|
||
"description": "Static or unit coverage proves `hasActiveContractForClient(...)` is removed or no longer used by activation/write flows as a business invariant.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F016",
|
||
"F023",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T016",
|
||
"description": "Static or unit coverage proves `getClientIdsWithActiveContracts(...)` is removed or no longer used to block product flows.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F017",
|
||
"F013",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T017",
|
||
"description": "Billing contract model wrappers around singleton helper functions are removed or reduced to non-blocking diagnostics-only behavior.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F018"
|
||
]
|
||
},
|
||
{
|
||
"id": "T018",
|
||
"description": "Billing wizard create path and clients assignment path both allow the same concurrent active assignment state instead of diverging by entry point.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F019",
|
||
"F023"
|
||
]
|
||
},
|
||
{
|
||
"id": "T019",
|
||
"description": "Shared assignment create flow allows overlapping active assignments for the same client when all other invariants are satisfied.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F020"
|
||
]
|
||
},
|
||
{
|
||
"id": "T020",
|
||
"description": "Shared assignment update flow allows overlapping active assignments for the same client when all other invariants are satisfied.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F021"
|
||
]
|
||
},
|
||
{
|
||
"id": "T021",
|
||
"description": "Existing invoiced-period guard still blocks moving assignment dates across already invoiced service periods after singleton rule removal.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F022"
|
||
]
|
||
},
|
||
{
|
||
"id": "T022",
|
||
"description": "Packages/clients create/update code delegates to the shared assignment validation path instead of maintaining duplicate overlap/singleton enforcement.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F023"
|
||
]
|
||
},
|
||
{
|
||
"id": "T023",
|
||
"description": "`packages/clients` assignment selection state supports two active rows with the same `contract_id` because identity is keyed by `client_contract_id`.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F024"
|
||
]
|
||
},
|
||
{
|
||
"id": "T024",
|
||
"description": "Assignment create/apply flow uses the returned `client_contract_id` instead of re-finding the first assignment by `contract_id`.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F025"
|
||
]
|
||
},
|
||
{
|
||
"id": "T025",
|
||
"description": "DB-backed integration proves client contract-line reads are assignment-scoped and do not duplicate or cross-associate rows when two active assignments share the same `contract_id`.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F026"
|
||
]
|
||
},
|
||
{
|
||
"id": "T026",
|
||
"description": "Contract-line add flow carries explicit `client_contract_id` context from UI to action layer.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F027",
|
||
"F028"
|
||
]
|
||
},
|
||
{
|
||
"id": "T027",
|
||
"description": "Contract-line edit flow is explicit about assignment scope versus shared line scope and no longer presents assignment-scoped editing on top of line-scoped mutation implicitly.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F027",
|
||
"F028"
|
||
]
|
||
},
|
||
{
|
||
"id": "T028",
|
||
"description": "Contract-line remove flow targets the intended active assignment and cannot silently act on a sibling active assignment.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F027",
|
||
"F028"
|
||
]
|
||
},
|
||
{
|
||
"id": "T029",
|
||
"description": "BillingConfiguration and related clients screens refresh lines and overlap data immediately after assignment create/edit/deactivate actions.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F029"
|
||
]
|
||
},
|
||
{
|
||
"id": "T030",
|
||
"description": "Assignment detail dialogs, line counts, and line names derive from the selected `client_contract_id` only.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F030"
|
||
]
|
||
},
|
||
{
|
||
"id": "T031",
|
||
"description": "Disambiguation help/copy no longer promises a hidden most-recent-assignment fallback.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F031"
|
||
]
|
||
},
|
||
{
|
||
"id": "T032",
|
||
"description": "Audit coverage or focused tests prove no remaining targeted `packages/clients` UI flow relies on `contract_id` as the unique active assignment identity.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F032"
|
||
]
|
||
},
|
||
{
|
||
"id": "T033",
|
||
"description": "Recurring due-work returns separate invoice candidates for two active assignments on the same client and invoice window.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F033"
|
||
]
|
||
},
|
||
{
|
||
"id": "T034",
|
||
"description": "Previewing one selected client-cadence recurring candidate includes only charges for its `client_contract_id`.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F034",
|
||
"F038"
|
||
]
|
||
},
|
||
{
|
||
"id": "T035",
|
||
"description": "Generating one selected client-cadence recurring candidate creates an invoice only for its `client_contract_id`.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F035",
|
||
"F038"
|
||
]
|
||
},
|
||
{
|
||
"id": "T036",
|
||
"description": "Regression coverage proves recurring preview no longer re-expands a selected candidate into all due work for the same client and invoice window.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F034"
|
||
]
|
||
},
|
||
{
|
||
"id": "T037",
|
||
"description": "Regression coverage proves recurring generation no longer re-expands a selected candidate into all due work for the same client and invoice window.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F035"
|
||
]
|
||
},
|
||
{
|
||
"id": "T038",
|
||
"description": "Fixed recurring charges from concurrent assignments that share the same base contract/template line stay separated by `client_contract_id` and do not collapse onto the first assignment.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F036"
|
||
]
|
||
},
|
||
{
|
||
"id": "T039",
|
||
"description": "A client-cadence materialization gap on one assignment blocks only that assignment’s candidate and not unrelated candidates for the same client window.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F037"
|
||
]
|
||
},
|
||
{
|
||
"id": "T040",
|
||
"description": "If mixed-assignment charges accidentally reach invoice generation, the preserved single-assignment invariant fails explicitly with a user-readable error rather than silent misattribution.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F038"
|
||
]
|
||
},
|
||
{
|
||
"id": "T041",
|
||
"description": "Recurring preview rendering distinguishes concurrent contracts that share the same display name.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F039"
|
||
]
|
||
},
|
||
{
|
||
"id": "T042",
|
||
"description": "Invoice query and contract-detail surfaces continue to show a generated invoice under the correct contract assignment for a client with multiple active contracts.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F040"
|
||
]
|
||
},
|
||
{
|
||
"id": "T043",
|
||
"description": "PO overage and consumption remain tied to `invoice.client_contract_id` and are unaffected by sibling active assignments for the same client.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F003",
|
||
"F040"
|
||
]
|
||
},
|
||
{
|
||
"id": "T044",
|
||
"description": "Recurring due-work grouping continues to use `purchaseOrderScopeKey = client_contract_id` so contract-scoped invoices remain separable for multi-active clients.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F002",
|
||
"F003",
|
||
"F033"
|
||
]
|
||
},
|
||
{
|
||
"id": "T045",
|
||
"description": "BillingCycles summary shows multiple active assignments or an explicit multi-assignment representation instead of collapsing to the first active contract row.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F041"
|
||
]
|
||
},
|
||
{
|
||
"id": "T046",
|
||
"description": "Bucket usage with multiple overlapping eligible assignments fails explicitly or requires disambiguation instead of silently choosing the latest-start assignment.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F042"
|
||
]
|
||
},
|
||
{
|
||
"id": "T047",
|
||
"description": "Contract report/dashboard wording is updated where assignment counts were previously mislabeled as billable clients or singular contracts.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F043"
|
||
]
|
||
},
|
||
{
|
||
"id": "T048",
|
||
"description": "Audit notes and focused tests record which reporting/export/accounting surfaces are already assignment-safe and confirm no hidden active-contract selector remains in the targeted files.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F044",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T049",
|
||
"description": "`createFixedPlanAssignment` or equivalent billing fixture helper can explicitly seed concurrent assignments with header and assignment lifecycle knobs.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F045"
|
||
]
|
||
},
|
||
{
|
||
"id": "T050",
|
||
"description": "A dedicated test helper can create two or more concurrent assignments for one client via direct DB inserts or `TestContext.createEntity(...)` without guarded production APIs.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F046"
|
||
]
|
||
},
|
||
{
|
||
"id": "T051",
|
||
"description": "Legacy tests that query `where({ client_id }).first()` or depend on latest-assignment semantics are updated to assert explicit assignment IDs instead.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F047"
|
||
]
|
||
},
|
||
{
|
||
"id": "T052",
|
||
"description": "Static guard coverage fails if new billing or clients code reintroduces singleton UI/action patterns such as active-contract client disabling or 'already has an active contract' write blockers.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T053",
|
||
"description": "`docs/billing/billing.md` no longer states that assigning a contract to a client must ensure no overlap with other active contracts.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T054",
|
||
"description": "The contract purchase order plan/runbook language is updated to reflect preserved single-assignment invoice scope without treating 'single active contract per client' as a prerequisite.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F003",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T055",
|
||
"description": "End-to-end billing flow: both the full wizard and quick-add path can create a second active contract for the same client.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F006",
|
||
"F007",
|
||
"F008",
|
||
"F009",
|
||
"F019"
|
||
]
|
||
},
|
||
{
|
||
"id": "T056",
|
||
"description": "End-to-end clients billing flow: two active assignments for the same client render separately and remain independently selectable even when they share the same base `contract_id`.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F024",
|
||
"F025",
|
||
"F026",
|
||
"F030",
|
||
"F032"
|
||
]
|
||
},
|
||
{
|
||
"id": "T057",
|
||
"description": "Adding a line to one active assignment does not leak that line into a sibling assignment’s rendered line set.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F026",
|
||
"F027",
|
||
"F028"
|
||
]
|
||
},
|
||
{
|
||
"id": "T058",
|
||
"description": "Editing or removing a line in one active assignment does not unexpectedly mutate sibling assignment rendering or targeting.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F027",
|
||
"F028",
|
||
"F029",
|
||
"F030"
|
||
]
|
||
},
|
||
{
|
||
"id": "T059",
|
||
"description": "Client service overlap matrix or equivalent overlap rendering shows explicit assignment identity for concurrent assignments instead of a collapsed contract view.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F026",
|
||
"F029",
|
||
"F030",
|
||
"F032"
|
||
]
|
||
},
|
||
{
|
||
"id": "T060",
|
||
"description": "A same-client pair of active contracts using different cadence ownership models both materialize and remain independently invoiceable without candidate contamination.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F033",
|
||
"F034",
|
||
"F035",
|
||
"F037",
|
||
"F040"
|
||
]
|
||
},
|
||
{
|
||
"id": "T061",
|
||
"description": "Invoice preview, generation, and invoice history for a client with two active contracts show two separate invoices linked back to the correct contract assignments.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F034",
|
||
"F035",
|
||
"F040"
|
||
]
|
||
},
|
||
{
|
||
"id": "T062",
|
||
"description": "The mixed-currency rule behavior matches the plan’s documented decision and no longer piggybacks implicitly on the removed single-active-contract guard.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F005",
|
||
"F019",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T063",
|
||
"description": "Repo-wide static or search-based coverage proves no live write/activation path still uses `hasActiveContractForClient(...)` to block concurrent active assignments.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F016",
|
||
"F023",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T064",
|
||
"description": "Repo-wide static or search-based coverage proves no live product flow still uses `getClientIdsWithActiveContracts(...)` to disable selection or submission.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F017",
|
||
"F013",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T065",
|
||
"description": "BillingCycles ordering and summary rendering do not hide sibling active assignments for the same client when one starts later than the other.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F041"
|
||
]
|
||
},
|
||
{
|
||
"id": "T066",
|
||
"description": "Bucket usage ambiguity failure includes enough assignment/context information for a user or engineer to resolve the conflict instead of silently billing the wrong contract.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F042"
|
||
]
|
||
},
|
||
{
|
||
"id": "T067",
|
||
"description": "Recurring preview/grouping with same-named concurrent contracts remains visually distinct through explicit assignment or contract context labels.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F039"
|
||
]
|
||
},
|
||
{
|
||
"id": "T068",
|
||
"description": "DB-backed integration proves billing-flow-created and clients-flow-created concurrent active assignments persist with the same final allowed state and no hidden asymmetry.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F019",
|
||
"F023"
|
||
]
|
||
},
|
||
{
|
||
"id": "T069",
|
||
"description": "Contract header activation/reactivation continues to work based on header and assignment lifecycle state and is not blocked by sibling active assignments.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F014",
|
||
"F015"
|
||
]
|
||
},
|
||
{
|
||
"id": "T070",
|
||
"description": "The wizard’s mixed-currency behavior is explicitly covered by tests or documented non-goal handling rather than remaining an incidental blocker of multi-active contracts.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F005",
|
||
"F019"
|
||
]
|
||
},
|
||
{
|
||
"id": "T071",
|
||
"description": "Runbook/migration notes explicitly record that invoice tables already snapshot `client_contract_id`, so removing the singleton rule does not require a schema redesign to preserve single-assignment invoices.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F002",
|
||
"F003",
|
||
"F004",
|
||
"F048"
|
||
]
|
||
},
|
||
{
|
||
"id": "T072",
|
||
"description": "Assignment-safe reporting/export/accounting surfaces show no functional regression after singleton rule removal and only receive wording updates where necessary.",
|
||
"implemented": true,
|
||
"featureIds": [
|
||
"F043",
|
||
"F044"
|
||
]
|
||
}
|
||
]
|