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
2064 lines
55 KiB
JSON
2064 lines
55 KiB
JSON
[
|
|
{
|
|
"id": "T001",
|
|
"description": "Functional: Extend ContractWizardData with renewal mode, notice period, term months, and override toggle fields.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F001"
|
|
]
|
|
},
|
|
{
|
|
"id": "T002",
|
|
"description": "Functional: Initialize renewal fields in ContractWizard default state for new contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F002"
|
|
]
|
|
},
|
|
{
|
|
"id": "T003",
|
|
"description": "Functional: Hydrate renewal fields when resuming draft contracts in the wizard.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T004",
|
|
"description": "Functional: Hydrate renewal fields when editing existing contracts in the wizard.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F004"
|
|
]
|
|
},
|
|
{
|
|
"id": "T005",
|
|
"description": "Functional: Render Renewal Settings card in ContractBasicsStep when end date is present.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F005"
|
|
]
|
|
},
|
|
{
|
|
"id": "T006",
|
|
"description": "Functional: Render Evergreen Review settings card in ContractBasicsStep when end date is absent.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006"
|
|
]
|
|
},
|
|
{
|
|
"id": "T007",
|
|
"description": "Functional: Show renewal mode selector with values none/manual/auto in ContractBasicsStep.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F007"
|
|
]
|
|
},
|
|
{
|
|
"id": "T008",
|
|
"description": "Functional: Show notice period selector/input in ContractBasicsStep for renewal-enabled modes.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F008"
|
|
]
|
|
},
|
|
{
|
|
"id": "T009",
|
|
"description": "Functional: Show renewal term behavior input in ContractBasicsStep for auto-renew mode.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F009"
|
|
]
|
|
},
|
|
{
|
|
"id": "T010",
|
|
"description": "Functional: Hide auto-renew-specific term controls when renewal mode is not auto.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F010"
|
|
]
|
|
},
|
|
{
|
|
"id": "T011",
|
|
"description": "Functional: Validate renewal mode is required when an end date is set.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T012",
|
|
"description": "Functional: Validate notice period is a non-negative integer within configured bounds.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012"
|
|
]
|
|
},
|
|
{
|
|
"id": "T013",
|
|
"description": "Functional: Validate renewal term months is positive when explicitly provided.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F013"
|
|
]
|
|
},
|
|
{
|
|
"id": "T014",
|
|
"description": "Functional: Show inline validation errors for invalid renewal settings before wizard progression.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F014"
|
|
]
|
|
},
|
|
{
|
|
"id": "T015",
|
|
"description": "Functional: Include renewal fields in contract summary preview in ContractBasicsStep.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F015"
|
|
]
|
|
},
|
|
{
|
|
"id": "T016",
|
|
"description": "Functional: Include renewal fields in review step payload preview before submit.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T017",
|
|
"description": "Functional: Persist renewal fields in ClientContractWizardSubmission payload builder.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F017"
|
|
]
|
|
},
|
|
{
|
|
"id": "T018",
|
|
"description": "Functional: Persist renewal fields when saving draft contracts from wizard.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F018"
|
|
]
|
|
},
|
|
{
|
|
"id": "T019",
|
|
"description": "Functional: Add tenant default renewal mode field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F019"
|
|
]
|
|
},
|
|
{
|
|
"id": "T020",
|
|
"description": "Functional: Add tenant default notice period days field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F020"
|
|
]
|
|
},
|
|
{
|
|
"id": "T021",
|
|
"description": "Functional: Add tenant default due-date action policy field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F021"
|
|
]
|
|
},
|
|
{
|
|
"id": "T022",
|
|
"description": "Functional: Add tenant default renewal ticket board field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F022"
|
|
]
|
|
},
|
|
{
|
|
"id": "T023",
|
|
"description": "Functional: Add tenant default renewal ticket status field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F023"
|
|
]
|
|
},
|
|
{
|
|
"id": "T024",
|
|
"description": "Functional: Add tenant default renewal ticket priority field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T025",
|
|
"description": "Functional: Add tenant default renewal ticket assignee field to default billing settings model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F025"
|
|
]
|
|
},
|
|
{
|
|
"id": "T026",
|
|
"description": "Functional: Expose renewal defaults in getDefaultBillingSettings action response.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F026"
|
|
]
|
|
},
|
|
{
|
|
"id": "T027",
|
|
"description": "Functional: Persist renewal defaults in updateDefaultBillingSettings action writes.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F027"
|
|
]
|
|
},
|
|
{
|
|
"id": "T028",
|
|
"description": "Functional: Add use-tenant-defaults toggle to contract renewal settings payload.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F028"
|
|
]
|
|
},
|
|
{
|
|
"id": "T029",
|
|
"description": "Functional: Apply tenant defaults to contract assignment when override toggle is enabled.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F029"
|
|
]
|
|
},
|
|
{
|
|
"id": "T030",
|
|
"description": "Functional: Apply explicit contract-level override values when override toggle is disabled.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F030"
|
|
]
|
|
},
|
|
{
|
|
"id": "T031",
|
|
"description": "Functional: Enforce deterministic fallback precedence when override fields are partially missing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F031"
|
|
]
|
|
},
|
|
{
|
|
"id": "T032",
|
|
"description": "Functional: Expose effective renewal settings in contract assignment read APIs.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F032"
|
|
]
|
|
},
|
|
{
|
|
"id": "T033",
|
|
"description": "Functional: Compute decision_due_date for fixed-term assignments using end_date minus notice_period_days.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F033"
|
|
]
|
|
},
|
|
{
|
|
"id": "T034",
|
|
"description": "Functional: Compute next evergreen review anchor date from active contract anniversary rules.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F034"
|
|
]
|
|
},
|
|
{
|
|
"id": "T035",
|
|
"description": "Functional: Compute evergreen decision_due_date using anchor date minus notice_period_days.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F035"
|
|
]
|
|
},
|
|
{
|
|
"id": "T036",
|
|
"description": "Functional: Normalize decision_due_date calculations to date-only semantics used by client_contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F036"
|
|
]
|
|
},
|
|
{
|
|
"id": "T037",
|
|
"description": "Functional: Recompute decision_due_date when contract end_date changes.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T038",
|
|
"description": "Functional: Recompute decision_due_date when notice period changes.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F038"
|
|
]
|
|
},
|
|
{
|
|
"id": "T039",
|
|
"description": "Functional: Recompute decision_due_date when renewal mode changes between none/manual/auto.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F039"
|
|
]
|
|
},
|
|
{
|
|
"id": "T040",
|
|
"description": "Functional: Recompute decision_due_date when evergreen anchor basis changes.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F040"
|
|
]
|
|
},
|
|
{
|
|
"id": "T041",
|
|
"description": "Functional: Skip decision_due_date generation for terminated/expired contract assignments.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F041"
|
|
]
|
|
},
|
|
{
|
|
"id": "T042",
|
|
"description": "Functional: Skip decision_due_date generation when renewal mode is none and no evergreen review is configured.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F042"
|
|
]
|
|
},
|
|
{
|
|
"id": "T043",
|
|
"description": "Functional: Create one renewal cycle key per contract assignment cycle for deduplication.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F043"
|
|
]
|
|
},
|
|
{
|
|
"id": "T044",
|
|
"description": "Functional: Prevent duplicate active renewal work items for same tenant/client_contract_id/cycle key.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F044"
|
|
]
|
|
},
|
|
{
|
|
"id": "T045",
|
|
"description": "Functional: Persist cycle_start and cycle_end boundaries for each generated renewal cycle.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F045"
|
|
]
|
|
},
|
|
{
|
|
"id": "T046",
|
|
"description": "Functional: Expose days_until_due as derived queue field for UI sorting and badges.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F046"
|
|
]
|
|
},
|
|
{
|
|
"id": "T047",
|
|
"description": "Functional: Clamp past-due decision calculations into queue visibility without negative date corruption.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F047"
|
|
]
|
|
},
|
|
{
|
|
"id": "T048",
|
|
"description": "Functional: Add renewals tab value and metadata to billing tab configuration.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F048"
|
|
]
|
|
},
|
|
{
|
|
"id": "T049",
|
|
"description": "Functional: Add Renewals Tabs.Content route to BillingDashboard tab host.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F049"
|
|
]
|
|
},
|
|
{
|
|
"id": "T050",
|
|
"description": "Functional: Add Renewals queue page component under billing dashboard components.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F050"
|
|
]
|
|
},
|
|
{
|
|
"id": "T051",
|
|
"description": "Functional: Load renewal queue rows from server action on Renewals page mount.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F051"
|
|
]
|
|
},
|
|
{
|
|
"id": "T052",
|
|
"description": "Functional: Render default 90-day horizon rows in Renewals queue.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F052"
|
|
]
|
|
},
|
|
{
|
|
"id": "T053",
|
|
"description": "Functional: Render bucket quick filters for 0-30, 31-60, and 61-90 days.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053"
|
|
]
|
|
},
|
|
{
|
|
"id": "T054",
|
|
"description": "Functional: Render owner filter for assigned user in Renewals queue.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F054"
|
|
]
|
|
},
|
|
{
|
|
"id": "T055",
|
|
"description": "Functional: Render status filter for pending/renewing/non_renewing/snoozed/completed.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F055"
|
|
]
|
|
},
|
|
{
|
|
"id": "T056",
|
|
"description": "Functional: Render renewal mode filter for none/manual/auto.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F056"
|
|
]
|
|
},
|
|
{
|
|
"id": "T057",
|
|
"description": "Functional: Render contract type filter for fixed-term versus evergreen entries.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F057"
|
|
]
|
|
},
|
|
{
|
|
"id": "T058",
|
|
"description": "Functional: Sort queue by decision_due_date ascending by default.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F058"
|
|
]
|
|
},
|
|
{
|
|
"id": "T059",
|
|
"description": "Functional: Show days-remaining visual state for due-soon and overdue entries.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F059"
|
|
]
|
|
},
|
|
{
|
|
"id": "T060",
|
|
"description": "Functional: Add Upcoming Renewals summary widget to ClientContractsTab.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F060"
|
|
]
|
|
},
|
|
{
|
|
"id": "T061",
|
|
"description": "Functional: Show 90-day bucket counts in ClientContractsTab upcoming renewals widget.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F061"
|
|
]
|
|
},
|
|
{
|
|
"id": "T062",
|
|
"description": "Functional: Navigate from upcoming renewals widget to Renewals tab preserving filter context.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F062"
|
|
]
|
|
},
|
|
{
|
|
"id": "T063",
|
|
"description": "Functional: Refresh widget counts after queue action mutations complete.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F063"
|
|
]
|
|
},
|
|
{
|
|
"id": "T064",
|
|
"description": "Functional: Define queue status enum values pending/renewing/non_renewing/snoozed/completed in renewal work-item model.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F064"
|
|
]
|
|
},
|
|
{
|
|
"id": "T065",
|
|
"description": "Functional: Implement mark-renewing action that transitions pending entries to renewing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F065"
|
|
]
|
|
},
|
|
{
|
|
"id": "T066",
|
|
"description": "Functional: Implement mark-non-renewing action that transitions pending entries to non_renewing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F066"
|
|
]
|
|
},
|
|
{
|
|
"id": "T067",
|
|
"description": "Functional: Implement create-renewal-draft action for eligible queue entries.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F067"
|
|
]
|
|
},
|
|
{
|
|
"id": "T068",
|
|
"description": "Functional: Implement snooze action that sets status to snoozed with snoozed_until date.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F068"
|
|
]
|
|
},
|
|
{
|
|
"id": "T069",
|
|
"description": "Functional: Implement assign-owner action to set assigned_to on renewal work item.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F069"
|
|
]
|
|
},
|
|
{
|
|
"id": "T070",
|
|
"description": "Functional: Implement unsnooze transition back to pending when snooze period elapses.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F070"
|
|
]
|
|
},
|
|
{
|
|
"id": "T071",
|
|
"description": "Functional: Persist action actor user id on each queue mutation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F071"
|
|
]
|
|
},
|
|
{
|
|
"id": "T072",
|
|
"description": "Functional: Persist action timestamp on each queue mutation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F072"
|
|
]
|
|
},
|
|
{
|
|
"id": "T073",
|
|
"description": "Functional: Persist action reason/note text on queue mutation when provided.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F073"
|
|
]
|
|
},
|
|
{
|
|
"id": "T074",
|
|
"description": "Functional: Prevent invalid transition from completed back to pending without explicit reopen action.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F074"
|
|
]
|
|
},
|
|
{
|
|
"id": "T075",
|
|
"description": "Functional: Prevent invalid transition from non_renewing to renewing without explicit override action.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F075"
|
|
]
|
|
},
|
|
{
|
|
"id": "T076",
|
|
"description": "Functional: Enforce snooze date must be in the future on action validation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F076"
|
|
]
|
|
},
|
|
{
|
|
"id": "T077",
|
|
"description": "Functional: Expose queue row action availability based on current status.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F077"
|
|
]
|
|
},
|
|
{
|
|
"id": "T078",
|
|
"description": "Functional: Show optimistic UI state while queue actions are in-flight.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F078"
|
|
]
|
|
},
|
|
{
|
|
"id": "T079",
|
|
"description": "Functional: Refresh affected queue row state after successful action response.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F079"
|
|
]
|
|
},
|
|
{
|
|
"id": "T080",
|
|
"description": "Functional: Include linked draft contract id in queue row once renewal draft is created.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F080"
|
|
]
|
|
},
|
|
{
|
|
"id": "T081",
|
|
"description": "Functional: Include linked ticket id in queue row once due-date ticket is created.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F081"
|
|
]
|
|
},
|
|
{
|
|
"id": "T082",
|
|
"description": "Functional: Mark work item completed when renewed contract activation is confirmed.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F082"
|
|
]
|
|
},
|
|
{
|
|
"id": "T083",
|
|
"description": "Functional: Mark work item completed when non-renewal finalization is confirmed.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F083"
|
|
]
|
|
},
|
|
{
|
|
"id": "T084",
|
|
"description": "Functional: Create scheduled renewal processor that scans due decision windows for active contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F084"
|
|
]
|
|
},
|
|
{
|
|
"id": "T085",
|
|
"description": "Functional: Upsert renewal work items during scheduled processing for newly eligible cycles.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F085"
|
|
]
|
|
},
|
|
{
|
|
"id": "T086",
|
|
"description": "Functional: Respect tenant default due-date action policy during scheduled processing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F086"
|
|
]
|
|
},
|
|
{
|
|
"id": "T087",
|
|
"description": "Functional: Respect contract-level override due-date action policy during scheduled processing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F087"
|
|
]
|
|
},
|
|
{
|
|
"id": "T088",
|
|
"description": "Functional: Create internal ticket at decision due date when effective policy is create_ticket.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F088"
|
|
]
|
|
},
|
|
{
|
|
"id": "T089",
|
|
"description": "Functional: Call workflow runtime tickets.create action for renewal ticket creation path.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F089"
|
|
]
|
|
},
|
|
{
|
|
"id": "T090",
|
|
"description": "Functional: Populate renewal ticket title with client and contract context.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F090"
|
|
]
|
|
},
|
|
{
|
|
"id": "T091",
|
|
"description": "Functional: Populate renewal ticket description with due date and renewal settings context.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F091"
|
|
]
|
|
},
|
|
{
|
|
"id": "T092",
|
|
"description": "Functional: Populate renewal ticket routing fields from effective renewal ticket defaults.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F092"
|
|
]
|
|
},
|
|
{
|
|
"id": "T093",
|
|
"description": "Functional: Persist created ticket id on renewal work item after successful ticket creation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F093"
|
|
]
|
|
},
|
|
{
|
|
"id": "T094",
|
|
"description": "Functional: Use idempotency key per tenant/client_contract_id/cycle key for ticket creation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F094"
|
|
]
|
|
},
|
|
{
|
|
"id": "T095",
|
|
"description": "Functional: Skip duplicate ticket creation when idempotent renewal cycle already has linked ticket.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F095"
|
|
]
|
|
},
|
|
{
|
|
"id": "T096",
|
|
"description": "Functional: Record automation_error on work item when ticket creation fails.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F096"
|
|
]
|
|
},
|
|
{
|
|
"id": "T097",
|
|
"description": "Functional: Allow manual retry action to re-attempt ticket creation for failed work items.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F097"
|
|
]
|
|
},
|
|
{
|
|
"id": "T098",
|
|
"description": "Functional: Ensure due-date automation supports queue-only policy without creating tickets.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F098"
|
|
]
|
|
},
|
|
{
|
|
"id": "T099",
|
|
"description": "Functional: Publish/emit renewal-upcoming domain event payloads compatible with queue creation semantics.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F099"
|
|
]
|
|
},
|
|
{
|
|
"id": "T100",
|
|
"description": "Functional: Generate renewal queue entries for evergreen contracts based on annual review cycle.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F100"
|
|
]
|
|
},
|
|
{
|
|
"id": "T101",
|
|
"description": "Functional: Display evergreen contract type badge in queue rows.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F101"
|
|
]
|
|
},
|
|
{
|
|
"id": "T102",
|
|
"description": "Functional: Show evergreen cycle anchor date in queue row details.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F102"
|
|
]
|
|
},
|
|
{
|
|
"id": "T103",
|
|
"description": "Functional: Support mark-renewing action for evergreen queue entries.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F103"
|
|
]
|
|
},
|
|
{
|
|
"id": "T104",
|
|
"description": "Functional: Support mark-non-renewing action for evergreen queue entries.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F104"
|
|
]
|
|
},
|
|
{
|
|
"id": "T105",
|
|
"description": "Functional: Support create-renewal-draft action for evergreen queue entries.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F105"
|
|
]
|
|
},
|
|
{
|
|
"id": "T106",
|
|
"description": "Functional: Roll evergreen cycle forward to next annual window after completion.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F106"
|
|
]
|
|
},
|
|
{
|
|
"id": "T107",
|
|
"description": "Functional: Prevent duplicate evergreen cycle entries for the same annual period.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F107"
|
|
]
|
|
},
|
|
{
|
|
"id": "T108",
|
|
"description": "Functional: Respect evergreen-specific notice period overrides on decision date computation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F108"
|
|
]
|
|
},
|
|
{
|
|
"id": "T109",
|
|
"description": "Functional: Include evergreen entries in upcoming renewals widget counts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F109"
|
|
]
|
|
},
|
|
{
|
|
"id": "T110",
|
|
"description": "Functional: Extend contract expiration report action to expose decision_due_date alongside end_date where available.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F110"
|
|
]
|
|
},
|
|
{
|
|
"id": "T111",
|
|
"description": "Functional: Include renewal mode in expiration report row payload.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F111"
|
|
]
|
|
},
|
|
{
|
|
"id": "T112",
|
|
"description": "Functional: Include queue status in expiration report row payload when work item exists.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F112"
|
|
]
|
|
},
|
|
{
|
|
"id": "T113",
|
|
"description": "Functional: Keep existing expiration report rows for fixed-term contracts without renewal config.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F113"
|
|
]
|
|
},
|
|
{
|
|
"id": "T114",
|
|
"description": "Functional: Keep existing expiration report sort compatibility for existing report consumers.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F114"
|
|
]
|
|
},
|
|
{
|
|
"id": "T115",
|
|
"description": "Functional: Expose at-risk count based on decision_due_date windows for dashboard usage.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F115"
|
|
]
|
|
},
|
|
{
|
|
"id": "T116",
|
|
"description": "Functional: Align contract reports tab expiration copy to reference renewal decisions as well as expiration.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F116"
|
|
]
|
|
},
|
|
{
|
|
"id": "T117",
|
|
"description": "Functional: Ensure legacy auto_renew display derives from new renewal mode values.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F117"
|
|
]
|
|
},
|
|
{
|
|
"id": "T118",
|
|
"description": "Functional: Register renewal scheduled processing job in pg-boss on-prem scheduling path.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F118"
|
|
]
|
|
},
|
|
{
|
|
"id": "T119",
|
|
"description": "Functional: Register renewal scheduled processing workflow in Temporal hosted/EE scheduling path.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F119"
|
|
]
|
|
},
|
|
{
|
|
"id": "T120",
|
|
"description": "Functional: Use shared renewal processing core logic callable from both pg-boss and Temporal adapters.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F120"
|
|
]
|
|
},
|
|
{
|
|
"id": "T121",
|
|
"description": "Functional: Keep effective behavior parity for queue creation between pg-boss and Temporal runners.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F121"
|
|
]
|
|
},
|
|
{
|
|
"id": "T122",
|
|
"description": "Functional: Keep effective behavior parity for ticket creation idempotency between pg-boss and Temporal runners.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F122"
|
|
]
|
|
},
|
|
{
|
|
"id": "T123",
|
|
"description": "Functional: Honor existing JobRunnerFactory runtime selection without forcing edition-specific code forks in business logic.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F123"
|
|
]
|
|
},
|
|
{
|
|
"id": "T124",
|
|
"description": "Functional: Fallback gracefully to supported runner path when temporal bootstrap is unavailable.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F124"
|
|
]
|
|
},
|
|
{
|
|
"id": "T125",
|
|
"description": "Functional: Preserve tenant-scoped execution semantics in both runtime paths.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F125"
|
|
]
|
|
},
|
|
{
|
|
"id": "T126",
|
|
"description": "Functional: Enforce billing read permission on renewals queue list endpoints.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F126"
|
|
]
|
|
},
|
|
{
|
|
"id": "T127",
|
|
"description": "Functional: Enforce billing update permission on queue mutation endpoints.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F127"
|
|
]
|
|
},
|
|
{
|
|
"id": "T128",
|
|
"description": "Functional: Enforce billing settings update permission on renewal defaults update endpoints.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F128"
|
|
]
|
|
},
|
|
{
|
|
"id": "T129",
|
|
"description": "Functional: Apply tenant filter to all renewal work-item reads by default.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F129"
|
|
]
|
|
},
|
|
{
|
|
"id": "T130",
|
|
"description": "Functional: Apply tenant filter to all renewal work-item writes by default.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F130"
|
|
]
|
|
},
|
|
{
|
|
"id": "T131",
|
|
"description": "Functional: Audit renewal state transitions with actor id and transition metadata.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F131"
|
|
]
|
|
},
|
|
{
|
|
"id": "T132",
|
|
"description": "Functional: Audit ticket automation linkage with actor type system and timestamp metadata.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F132"
|
|
]
|
|
},
|
|
{
|
|
"id": "T133",
|
|
"description": "Functional: Audit renewal draft creation linkage with actor id and timestamp metadata.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F133"
|
|
]
|
|
},
|
|
{
|
|
"id": "T134",
|
|
"description": "Functional: Reject cross-tenant identifiers during queue mutation validation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F134"
|
|
]
|
|
},
|
|
{
|
|
"id": "T135",
|
|
"description": "Functional: Sanitize user-provided action notes before persistence and render.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F135"
|
|
]
|
|
},
|
|
{
|
|
"id": "T136",
|
|
"description": "Linkage correctness: 'Hydrate renewal fields when resuming draft contracts in the wizard.' stores created draft contract id on work item",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T137",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Render Evergreen Review settings card in ContractBasicsStep when end date is absent.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006"
|
|
]
|
|
},
|
|
{
|
|
"id": "T138",
|
|
"description": "Validation negative-path: Validate renewal mode is required when an end date is set.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T139",
|
|
"description": "Validation negative-path: Validate notice period is a non-negative integer within configured bounds.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012"
|
|
]
|
|
},
|
|
{
|
|
"id": "T140",
|
|
"description": "Validation negative-path: Validate renewal term months is positive when explicitly provided.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F013"
|
|
]
|
|
},
|
|
{
|
|
"id": "T141",
|
|
"description": "Linkage correctness: 'Persist renewal fields when saving draft contracts from wizard.' stores created draft contract id on work item",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F018"
|
|
]
|
|
},
|
|
{
|
|
"id": "T142",
|
|
"description": "Idempotency: repeated execution of 'Add tenant default renewal ticket board field to default billing settings model.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F022"
|
|
]
|
|
},
|
|
{
|
|
"id": "T143",
|
|
"description": "Idempotency: repeated execution of 'Add tenant default renewal ticket status field to default billing settings model.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F023"
|
|
]
|
|
},
|
|
{
|
|
"id": "T144",
|
|
"description": "Idempotency: repeated execution of 'Add tenant default renewal ticket priority field to default billing settings model.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T145",
|
|
"description": "Idempotency: repeated execution of 'Add tenant default renewal ticket assignee field to default billing settings model.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F025"
|
|
]
|
|
},
|
|
{
|
|
"id": "T146",
|
|
"description": "Validation negative-path: Enforce deterministic fallback precedence when override fields are partially missing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F031"
|
|
]
|
|
},
|
|
{
|
|
"id": "T147",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Compute next evergreen review anchor date from active contract anniversary rules.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F034"
|
|
]
|
|
},
|
|
{
|
|
"id": "T148",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Compute evergreen decision_due_date using anchor date minus notice_period_days.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F035"
|
|
]
|
|
},
|
|
{
|
|
"id": "T149",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Recompute decision_due_date when evergreen anchor basis changes.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F040"
|
|
]
|
|
},
|
|
{
|
|
"id": "T150",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Skip decision_due_date generation when renewal mode is none and no evergreen review is configured.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F042"
|
|
]
|
|
},
|
|
{
|
|
"id": "T151",
|
|
"description": "UI behavior: Expose days_until_due as derived queue field for UI sorting and badges. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F046"
|
|
]
|
|
},
|
|
{
|
|
"id": "T152",
|
|
"description": "UI behavior: Clamp past-due decision calculations into queue visibility without negative date corruption. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F047"
|
|
]
|
|
},
|
|
{
|
|
"id": "T153",
|
|
"description": "UI behavior: Add Renewals queue page component under billing dashboard components. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F050"
|
|
]
|
|
},
|
|
{
|
|
"id": "T154",
|
|
"description": "UI behavior: Load renewal queue rows from server action on Renewals page mount. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F051"
|
|
]
|
|
},
|
|
{
|
|
"id": "T155",
|
|
"description": "UI behavior: Render default 90-day horizon rows in Renewals queue. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F052"
|
|
]
|
|
},
|
|
{
|
|
"id": "T156",
|
|
"description": "UI behavior: Render bucket quick filters for 0-30, 31-60, and 61-90 days. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053"
|
|
]
|
|
},
|
|
{
|
|
"id": "T157",
|
|
"description": "UI behavior: Render owner filter for assigned user in Renewals queue. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F054"
|
|
]
|
|
},
|
|
{
|
|
"id": "T158",
|
|
"description": "UI behavior: Render status filter for pending/renewing/non_renewing/snoozed/completed. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F055"
|
|
]
|
|
},
|
|
{
|
|
"id": "T159",
|
|
"description": "Date constraint: snooze action rejects non-future dates for 'Render status filter for pending/renewing/non_renewing/snoozed/completed.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F055"
|
|
]
|
|
},
|
|
{
|
|
"id": "T160",
|
|
"description": "UI behavior: Render renewal mode filter for none/manual/auto. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F056"
|
|
]
|
|
},
|
|
{
|
|
"id": "T161",
|
|
"description": "UI behavior: Render contract type filter for fixed-term versus evergreen entries. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F057"
|
|
]
|
|
},
|
|
{
|
|
"id": "T162",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Render contract type filter for fixed-term versus evergreen entries.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F057"
|
|
]
|
|
},
|
|
{
|
|
"id": "T163",
|
|
"description": "UI behavior: Sort queue by decision_due_date ascending by default. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F058"
|
|
]
|
|
},
|
|
{
|
|
"id": "T164",
|
|
"description": "UI behavior: Navigate from upcoming renewals widget to Renewals tab preserving filter context. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F062"
|
|
]
|
|
},
|
|
{
|
|
"id": "T165",
|
|
"description": "UI behavior: Refresh widget counts after queue action mutations complete. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F063"
|
|
]
|
|
},
|
|
{
|
|
"id": "T166",
|
|
"description": "UI behavior: Define queue status enum values pending/renewing/non_renewing/snoozed/completed in renewal work-item model. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F064"
|
|
]
|
|
},
|
|
{
|
|
"id": "T167",
|
|
"description": "Date constraint: snooze action rejects non-future dates for 'Define queue status enum values pending/renewing/non_renewing/snoozed/completed in renewal work-item model.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F064"
|
|
]
|
|
},
|
|
{
|
|
"id": "T168",
|
|
"description": "UI behavior: Implement create-renewal-draft action for eligible queue entries. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F067"
|
|
]
|
|
},
|
|
{
|
|
"id": "T169",
|
|
"description": "Linkage correctness: 'Implement create-renewal-draft action for eligible queue entries.' stores created draft contract id on work item",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F067"
|
|
]
|
|
},
|
|
{
|
|
"id": "T170",
|
|
"description": "Date constraint: snooze action rejects non-future dates for 'Implement snooze action that sets status to snoozed with snoozed_until date.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F068"
|
|
]
|
|
},
|
|
{
|
|
"id": "T171",
|
|
"description": "Date constraint: snooze action rejects non-future dates for 'Implement unsnooze transition back to pending when snooze period elapses.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F070"
|
|
]
|
|
},
|
|
{
|
|
"id": "T172",
|
|
"description": "UI behavior: Persist action actor user id on each queue mutation. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F071"
|
|
]
|
|
},
|
|
{
|
|
"id": "T173",
|
|
"description": "UI behavior: Persist action timestamp on each queue mutation. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F072"
|
|
]
|
|
},
|
|
{
|
|
"id": "T174",
|
|
"description": "UI behavior: Persist action reason/note text on queue mutation when provided. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F073"
|
|
]
|
|
},
|
|
{
|
|
"id": "T175",
|
|
"description": "Validation negative-path: Enforce snooze date must be in the future on action validation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F076"
|
|
]
|
|
},
|
|
{
|
|
"id": "T176",
|
|
"description": "Date constraint: snooze action rejects non-future dates for 'Enforce snooze date must be in the future on action validation.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F076"
|
|
]
|
|
},
|
|
{
|
|
"id": "T177",
|
|
"description": "UI behavior: Expose queue row action availability based on current status. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F077"
|
|
]
|
|
},
|
|
{
|
|
"id": "T178",
|
|
"description": "UI behavior: Show optimistic UI state while queue actions are in-flight. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F078"
|
|
]
|
|
},
|
|
{
|
|
"id": "T179",
|
|
"description": "UI behavior: Refresh affected queue row state after successful action response. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F079"
|
|
]
|
|
},
|
|
{
|
|
"id": "T180",
|
|
"description": "UI behavior: Include linked draft contract id in queue row once renewal draft is created. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F080"
|
|
]
|
|
},
|
|
{
|
|
"id": "T181",
|
|
"description": "Linkage correctness: 'Include linked draft contract id in queue row once renewal draft is created.' stores created draft contract id on work item",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F080"
|
|
]
|
|
},
|
|
{
|
|
"id": "T182",
|
|
"description": "UI behavior: Include linked ticket id in queue row once due-date ticket is created. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F081"
|
|
]
|
|
},
|
|
{
|
|
"id": "T183",
|
|
"description": "Idempotency: repeated execution of 'Include linked ticket id in queue row once due-date ticket is created.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F081"
|
|
]
|
|
},
|
|
{
|
|
"id": "T184",
|
|
"description": "Idempotency: repeated execution of 'Create internal ticket at decision due date when effective policy is create_ticket.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F088"
|
|
]
|
|
},
|
|
{
|
|
"id": "T185",
|
|
"description": "Idempotency: repeated execution of 'Call workflow runtime tickets.create action for renewal ticket creation path.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F089"
|
|
]
|
|
},
|
|
{
|
|
"id": "T186",
|
|
"description": "Parity: 'Call workflow runtime tickets.create action for renewal ticket creation path.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F089"
|
|
]
|
|
},
|
|
{
|
|
"id": "T187",
|
|
"description": "Idempotency: repeated execution of 'Populate renewal ticket title with client and contract context.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F090"
|
|
]
|
|
},
|
|
{
|
|
"id": "T188",
|
|
"description": "Idempotency: repeated execution of 'Populate renewal ticket description with due date and renewal settings context.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F091"
|
|
]
|
|
},
|
|
{
|
|
"id": "T189",
|
|
"description": "Idempotency: repeated execution of 'Populate renewal ticket routing fields from effective renewal ticket defaults.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F092"
|
|
]
|
|
},
|
|
{
|
|
"id": "T190",
|
|
"description": "Idempotency: repeated execution of 'Persist created ticket id on renewal work item after successful ticket creation.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F093"
|
|
]
|
|
},
|
|
{
|
|
"id": "T191",
|
|
"description": "Idempotency: repeated execution of 'Use idempotency key per tenant/client_contract_id/cycle key for ticket creation.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F094"
|
|
]
|
|
},
|
|
{
|
|
"id": "T192",
|
|
"description": "Idempotency: repeated execution of 'Skip duplicate ticket creation when idempotent renewal cycle already has linked ticket.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F095"
|
|
]
|
|
},
|
|
{
|
|
"id": "T193",
|
|
"description": "Idempotency: repeated execution of 'Record automation_error on work item when ticket creation fails.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F096"
|
|
]
|
|
},
|
|
{
|
|
"id": "T194",
|
|
"description": "Idempotency: repeated execution of 'Allow manual retry action to re-attempt ticket creation for failed work items.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F097"
|
|
]
|
|
},
|
|
{
|
|
"id": "T195",
|
|
"description": "UI behavior: Ensure due-date automation supports queue-only policy without creating tickets. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F098"
|
|
]
|
|
},
|
|
{
|
|
"id": "T196",
|
|
"description": "Idempotency: repeated execution of 'Ensure due-date automation supports queue-only policy without creating tickets.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F098"
|
|
]
|
|
},
|
|
{
|
|
"id": "T197",
|
|
"description": "UI behavior: Publish/emit renewal-upcoming domain event payloads compatible with queue creation semantics. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F099"
|
|
]
|
|
},
|
|
{
|
|
"id": "T198",
|
|
"description": "UI behavior: Generate renewal queue entries for evergreen contracts based on annual review cycle. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F100"
|
|
]
|
|
},
|
|
{
|
|
"id": "T199",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Generate renewal queue entries for evergreen contracts based on annual review cycle.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F100"
|
|
]
|
|
},
|
|
{
|
|
"id": "T200",
|
|
"description": "UI behavior: Display evergreen contract type badge in queue rows. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F101"
|
|
]
|
|
},
|
|
{
|
|
"id": "T201",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Display evergreen contract type badge in queue rows.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F101"
|
|
]
|
|
},
|
|
{
|
|
"id": "T202",
|
|
"description": "UI behavior: Show evergreen cycle anchor date in queue row details. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F102"
|
|
]
|
|
},
|
|
{
|
|
"id": "T203",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Show evergreen cycle anchor date in queue row details.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F102"
|
|
]
|
|
},
|
|
{
|
|
"id": "T204",
|
|
"description": "UI behavior: Support mark-renewing action for evergreen queue entries. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F103"
|
|
]
|
|
},
|
|
{
|
|
"id": "T205",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Support mark-renewing action for evergreen queue entries.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F103"
|
|
]
|
|
},
|
|
{
|
|
"id": "T206",
|
|
"description": "UI behavior: Support mark-non-renewing action for evergreen queue entries. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F104"
|
|
]
|
|
},
|
|
{
|
|
"id": "T207",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Support mark-non-renewing action for evergreen queue entries.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F104"
|
|
]
|
|
},
|
|
{
|
|
"id": "T208",
|
|
"description": "UI behavior: Support create-renewal-draft action for evergreen queue entries. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F105"
|
|
]
|
|
},
|
|
{
|
|
"id": "T209",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Support create-renewal-draft action for evergreen queue entries.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F105"
|
|
]
|
|
},
|
|
{
|
|
"id": "T210",
|
|
"description": "Linkage correctness: 'Support create-renewal-draft action for evergreen queue entries.' stores created draft contract id on work item",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F105"
|
|
]
|
|
},
|
|
{
|
|
"id": "T211",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Roll evergreen cycle forward to next annual window after completion.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F106"
|
|
]
|
|
},
|
|
{
|
|
"id": "T212",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Prevent duplicate evergreen cycle entries for the same annual period.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F107"
|
|
]
|
|
},
|
|
{
|
|
"id": "T213",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Respect evergreen-specific notice period overrides on decision date computation.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F108"
|
|
]
|
|
},
|
|
{
|
|
"id": "T214",
|
|
"description": "Cycle rollover: evergreen behavior remains correct across year boundary for 'Include evergreen entries in upcoming renewals widget counts.'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F109"
|
|
]
|
|
},
|
|
{
|
|
"id": "T215",
|
|
"description": "UI behavior: Include queue status in expiration report row payload when work item exists. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F112"
|
|
]
|
|
},
|
|
{
|
|
"id": "T216",
|
|
"description": "UI behavior: Keep existing expiration report sort compatibility for existing report consumers. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F114"
|
|
]
|
|
},
|
|
{
|
|
"id": "T217",
|
|
"description": "Parity: 'Register renewal scheduled processing job in pg-boss on-prem scheduling path.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F118"
|
|
]
|
|
},
|
|
{
|
|
"id": "T218",
|
|
"description": "Parity: 'Register renewal scheduled processing workflow in Temporal hosted/EE scheduling path.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F119"
|
|
]
|
|
},
|
|
{
|
|
"id": "T219",
|
|
"description": "Parity: 'Use shared renewal processing core logic callable from both pg-boss and Temporal adapters.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F120"
|
|
]
|
|
},
|
|
{
|
|
"id": "T220",
|
|
"description": "UI behavior: Keep effective behavior parity for queue creation between pg-boss and Temporal runners. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F121"
|
|
]
|
|
},
|
|
{
|
|
"id": "T221",
|
|
"description": "Parity: 'Keep effective behavior parity for queue creation between pg-boss and Temporal runners.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F121"
|
|
]
|
|
},
|
|
{
|
|
"id": "T222",
|
|
"description": "Idempotency: repeated execution of 'Keep effective behavior parity for ticket creation idempotency between pg-boss and Temporal runners.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F122"
|
|
]
|
|
},
|
|
{
|
|
"id": "T223",
|
|
"description": "Parity: 'Keep effective behavior parity for ticket creation idempotency between pg-boss and Temporal runners.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F122"
|
|
]
|
|
},
|
|
{
|
|
"id": "T224",
|
|
"description": "Parity: 'Honor existing JobRunnerFactory runtime selection without forcing edition-specific code forks in business logic.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F123"
|
|
]
|
|
},
|
|
{
|
|
"id": "T225",
|
|
"description": "Parity: 'Fallback gracefully to supported runner path when temporal bootstrap is unavailable.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F124"
|
|
]
|
|
},
|
|
{
|
|
"id": "T226",
|
|
"description": "Parity: 'Preserve tenant-scoped execution semantics in both runtime paths.' behaves equivalently under pg-boss and Temporal paths",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F125"
|
|
]
|
|
},
|
|
{
|
|
"id": "T227",
|
|
"description": "Validation negative-path: Enforce billing read permission on renewals queue list endpoints.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F126"
|
|
]
|
|
},
|
|
{
|
|
"id": "T228",
|
|
"description": "UI behavior: Enforce billing read permission on renewals queue list endpoints. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F126"
|
|
]
|
|
},
|
|
{
|
|
"id": "T229",
|
|
"description": "Validation negative-path: Enforce billing update permission on queue mutation endpoints.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F127"
|
|
]
|
|
},
|
|
{
|
|
"id": "T230",
|
|
"description": "UI behavior: Enforce billing update permission on queue mutation endpoints. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F127"
|
|
]
|
|
},
|
|
{
|
|
"id": "T231",
|
|
"description": "Validation negative-path: Enforce billing settings update permission on renewal defaults update endpoints.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F128"
|
|
]
|
|
},
|
|
{
|
|
"id": "T232",
|
|
"description": "UI behavior: Apply tenant filter to all renewal work-item reads by default. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F129"
|
|
]
|
|
},
|
|
{
|
|
"id": "T233",
|
|
"description": "UI behavior: Apply tenant filter to all renewal work-item writes by default. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F130"
|
|
]
|
|
},
|
|
{
|
|
"id": "T234",
|
|
"description": "Idempotency: repeated execution of 'Audit ticket automation linkage with actor type system and timestamp metadata.' does not create duplicate tickets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F132"
|
|
]
|
|
},
|
|
{
|
|
"id": "T235",
|
|
"description": "Linkage correctness: 'Audit renewal draft creation linkage with actor id and timestamp metadata.' stores created draft contract id on work item",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F133"
|
|
]
|
|
},
|
|
{
|
|
"id": "T236",
|
|
"description": "Validation negative-path: Reject cross-tenant identifiers during queue mutation validation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F134"
|
|
]
|
|
},
|
|
{
|
|
"id": "T237",
|
|
"description": "UI behavior: Reject cross-tenant identifiers during queue mutation validation. persists after refresh/navigation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F134"
|
|
]
|
|
},
|
|
{
|
|
"id": "T238",
|
|
"description": "E2E fixed-term renewal: create contract with end date + manual renewal, verify queue row appears in correct 90-day bucket and can be marked renewing.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F005",
|
|
"F033",
|
|
"F052",
|
|
"F065"
|
|
]
|
|
},
|
|
{
|
|
"id": "T239",
|
|
"description": "E2E evergreen renewal: create evergreen contract with annual review settings, verify queue entry generation and annual cycle rollover after completion.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006",
|
|
"F100",
|
|
"F106"
|
|
]
|
|
},
|
|
{
|
|
"id": "T240",
|
|
"description": "E2E due-date automation ticketing: due entry creates exactly one ticket and links ticket id on renewal work item.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F088",
|
|
"F093",
|
|
"F094"
|
|
]
|
|
},
|
|
{
|
|
"id": "T241",
|
|
"description": "E2E queue action flow: mark renewing auto-creates draft, open editor, then complete work item after activation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F065",
|
|
"F067",
|
|
"F082"
|
|
]
|
|
},
|
|
{
|
|
"id": "T242",
|
|
"description": "E2E permissions: billing-read can view queue but cannot mutate, billing-update can execute queue actions.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F126",
|
|
"F127"
|
|
]
|
|
},
|
|
{
|
|
"id": "T243",
|
|
"description": "E2E defaults and overrides: tenant default create-ticket policy applies, then per-contract override to queue-only suppresses ticket creation.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F021",
|
|
"F030",
|
|
"F098"
|
|
]
|
|
},
|
|
{
|
|
"id": "T244",
|
|
"description": "Integration: latest migrations create required renewal queue status/audit columns on client_contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F136"
|
|
]
|
|
},
|
|
{
|
|
"id": "T245",
|
|
"description": "Integration: latest migrations create required renewal-cycle columns on client_contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F137"
|
|
]
|
|
},
|
|
{
|
|
"id": "T246",
|
|
"description": "Integration: latest migrations create required renewal automation/policy columns on client_contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F138"
|
|
]
|
|
},
|
|
{
|
|
"id": "T247",
|
|
"description": "Integration: latest migrations create required renewal default/policy columns on default_billing_settings.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F140"
|
|
]
|
|
},
|
|
{
|
|
"id": "T248",
|
|
"description": "Integration: migration backfill initializes deterministic renewal state for existing active client_contract rows.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F141"
|
|
]
|
|
},
|
|
{
|
|
"id": "T249",
|
|
"description": "Integration: listRenewalQueueRows executes successfully against migrated schema and no longer throws missing-column SQL errors.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F136",
|
|
"F137",
|
|
"F139",
|
|
"F143"
|
|
]
|
|
},
|
|
{
|
|
"id": "T250",
|
|
"description": "Integration: snoozeRenewalQueueItem updates status/snoozed_until and persists last_action audit fields for migrated rows.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F136",
|
|
"F139"
|
|
]
|
|
},
|
|
{
|
|
"id": "T251",
|
|
"description": "Integration: markRenewalQueueItemRenewing transitions pending->renewing and persists actor/timestamp metadata.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F136"
|
|
]
|
|
},
|
|
{
|
|
"id": "T252",
|
|
"description": "Integration: processRenewalQueueHandler computes and persists decision_due_date/cycle fields for eligible contracts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F137",
|
|
"F139",
|
|
"F141"
|
|
]
|
|
},
|
|
{
|
|
"id": "T253",
|
|
"description": "Integration: processRenewalQueueHandler creates/links at most one renewal ticket per tenant+client_contract+cycle key when policy=create_ticket.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F138",
|
|
"F140",
|
|
"F142"
|
|
]
|
|
},
|
|
{
|
|
"id": "T254",
|
|
"description": "Integration (guard case): renewal schema readiness guard rejects access with actionable error when required columns are intentionally absent.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F143"
|
|
]
|
|
},
|
|
{
|
|
"id": "T255",
|
|
"description": "Integration (happy path): renewal schema readiness guard passes after migrations and renewals queue endpoints remain operational.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F143",
|
|
"F144"
|
|
]
|
|
}
|
|
]
|