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
309 lines
12 KiB
JSON
309 lines
12 KiB
JSON
[
|
|
{
|
|
"id": "T001",
|
|
"description": "Preflight inventory lists every runtime use of `template_contract_id`, `contracts.is_template`, and `contract_lines.is_template` called out in the plan scope",
|
|
"implemented": false,
|
|
"featureIds": ["F002"]
|
|
},
|
|
{
|
|
"id": "T002",
|
|
"description": "DB-backed verification confirms every legacy template row in `contracts` has a canonical row in `contract_templates` before cleanup proceeds",
|
|
"implemented": false,
|
|
"featureIds": ["F003"]
|
|
},
|
|
{
|
|
"id": "T003",
|
|
"description": "DB-backed verification confirms every legacy template-line artifact needed by runtime has a canonical `contract_template_line*` equivalent before cleanup proceeds",
|
|
"implemented": false,
|
|
"featureIds": ["F003"]
|
|
},
|
|
{
|
|
"id": "T004",
|
|
"description": "The plan explicitly resolves whether `client_contracts.template_contract_id` is provenance-only or removed, with no remaining ambiguous runtime use",
|
|
"implemented": false,
|
|
"featureIds": ["F004"]
|
|
},
|
|
{
|
|
"id": "T005",
|
|
"description": "Billing engine contract-line resolution no longer joins `contracts` via `coalesce(cc.template_contract_id, cc.contract_id)`",
|
|
"implemented": false,
|
|
"featureIds": ["F005"]
|
|
},
|
|
{
|
|
"id": "T006",
|
|
"description": "Billing engine contract-line resolution still returns the expected instantiated contract lines for a client-assigned contract created from a template",
|
|
"implemented": false,
|
|
"featureIds": ["F005", "F007"]
|
|
},
|
|
{
|
|
"id": "T007",
|
|
"description": "Billing discount resolution no longer joins `client_contracts` using `template_contract_id OR contract_id` fallback logic",
|
|
"implemented": false,
|
|
"featureIds": ["F006"]
|
|
},
|
|
{
|
|
"id": "T008",
|
|
"description": "DB-backed invoice generation for a contract instantiated from a template succeeds after the source template is modified, proving runtime billing uses cloned contract data only",
|
|
"implemented": false,
|
|
"featureIds": ["F006", "F007", "F030"]
|
|
},
|
|
{
|
|
"id": "T009",
|
|
"description": "Template instantiation clones all required line/service/config/rate data so a newly instantiated contract remains self-contained",
|
|
"implemented": false,
|
|
"featureIds": ["F007", "F008"]
|
|
},
|
|
{
|
|
"id": "T010",
|
|
"description": "Changing template-side pricing or service configuration after instantiation does not alter billing for the existing instantiated contract",
|
|
"implemented": false,
|
|
"featureIds": ["F007", "F008"]
|
|
},
|
|
{
|
|
"id": "T011",
|
|
"description": "Contract list endpoints return only instantiated contracts and exclude template rows/resources",
|
|
"implemented": false,
|
|
"featureIds": ["F009"]
|
|
},
|
|
{
|
|
"id": "T012",
|
|
"description": "Template list endpoints return only template resources and do not depend on `IContract` compatibility projection",
|
|
"implemented": false,
|
|
"featureIds": ["F009", "F010"]
|
|
},
|
|
{
|
|
"id": "T013",
|
|
"description": "A contract lookup by ID no longer falls back to a template lookup when the contract does not exist",
|
|
"implemented": false,
|
|
"featureIds": ["F009", "F011"]
|
|
},
|
|
{
|
|
"id": "T014",
|
|
"description": "UI detail routing distinguishes template detail from contract detail without a mixed fallback-by-ID path",
|
|
"implemented": false,
|
|
"featureIds": ["F011", "F015"]
|
|
},
|
|
{
|
|
"id": "T015",
|
|
"description": "Template DTOs are no longer flattened into `IContract`-shaped responses in billing action loaders",
|
|
"implemented": false,
|
|
"featureIds": ["F010", "F029"]
|
|
},
|
|
{
|
|
"id": "T016",
|
|
"description": "Template line CRUD uses template-specific repositories/actions and no longer passes through mixed contract-line abstractions",
|
|
"implemented": false,
|
|
"featureIds": ["F012", "F013"]
|
|
},
|
|
{
|
|
"id": "T017",
|
|
"description": "Contract line CRUD uses instantiated-contract repositories/actions and no longer needs to detect whether the parent ID is a template",
|
|
"implemented": false,
|
|
"featureIds": ["F012", "F013"]
|
|
},
|
|
{
|
|
"id": "T018",
|
|
"description": "Repository tests prove no mixed helper accepts a single ID space for both templates and instantiated contracts after refactor",
|
|
"implemented": false,
|
|
"featureIds": ["F012", "F013"]
|
|
},
|
|
{
|
|
"id": "T019",
|
|
"description": "Deleting a template no longer deletes or mutates any `contract_lines` rows belonging to instantiated contracts",
|
|
"implemented": false,
|
|
"featureIds": ["F014"]
|
|
},
|
|
{
|
|
"id": "T020",
|
|
"description": "Deleting a template no longer deletes or mutates any `contract_line_service_*` rows belonging to instantiated contracts",
|
|
"implemented": false,
|
|
"featureIds": ["F014"]
|
|
},
|
|
{
|
|
"id": "T021",
|
|
"description": "Billing dashboard template views and contract views use explicit loaders/types rather than branching on a shared `is_template` contract shape",
|
|
"implemented": false,
|
|
"featureIds": ["F015", "F029"]
|
|
},
|
|
{
|
|
"id": "T022",
|
|
"description": "Client contract actions/models no longer backfill `template_contract_id` from `contract_id` as live state",
|
|
"implemented": false,
|
|
"featureIds": ["F016"]
|
|
},
|
|
{
|
|
"id": "T023",
|
|
"description": "Renewal flows no longer depend on hybrid template/contract runtime fallback semantics",
|
|
"implemented": false,
|
|
"featureIds": ["F017"]
|
|
},
|
|
{
|
|
"id": "T024",
|
|
"description": "API services no longer backfill or require `template_contract_id` as a runtime lookup fallback",
|
|
"implemented": false,
|
|
"featureIds": ["F018"]
|
|
},
|
|
{
|
|
"id": "T025",
|
|
"description": "The legacy verification script is either retired or rewritten so it validates the normalized end state instead of duplicated storage",
|
|
"implemented": false,
|
|
"featureIds": ["F019"]
|
|
},
|
|
{
|
|
"id": "T026",
|
|
"description": "The legacy contract-template decoupling script is either retired or rewritten so it no longer preserves hybrid runtime behavior",
|
|
"implemented": false,
|
|
"featureIds": ["F020"]
|
|
},
|
|
{
|
|
"id": "T027",
|
|
"description": "Cleanup migrations are ordered so runtime cutover lands before any destructive schema removal",
|
|
"implemented": false,
|
|
"featureIds": ["F021"]
|
|
},
|
|
{
|
|
"id": "T028",
|
|
"description": "Cleanup migration for `contracts.is_template` is gated by a precondition proving no live runtime code path still requires legacy template rows",
|
|
"implemented": false,
|
|
"featureIds": ["F021", "F022", "F031"]
|
|
},
|
|
{
|
|
"id": "T029",
|
|
"description": "Cleanup migration for `contract_lines.is_template` is gated by a precondition proving template-line separation is complete",
|
|
"implemented": false,
|
|
"featureIds": ["F021", "F023", "F031"]
|
|
},
|
|
{
|
|
"id": "T030",
|
|
"description": "If `template_contract_id` is removed, the migration preserves the chosen provenance semantics without breaking contract assignment reads",
|
|
"implemented": false,
|
|
"featureIds": ["F004", "F024"]
|
|
},
|
|
{
|
|
"id": "T031",
|
|
"description": "DB-backed post-cutover validation proves legacy template rows in `contracts` can be quarantined or removed without changing invoice-generation behavior",
|
|
"implemented": false,
|
|
"featureIds": ["F025", "F031", "F032"]
|
|
},
|
|
{
|
|
"id": "T032",
|
|
"description": "DB-backed post-cutover validation proves legacy template-line rows in `contract_lines` can be quarantined or removed without changing invoice-generation behavior",
|
|
"implemented": false,
|
|
"featureIds": ["F026", "F031", "F032"]
|
|
},
|
|
{
|
|
"id": "T033",
|
|
"description": "Operator runbook covers preflight inventory, cutover order, blocking conditions, and post-cutover validation commands",
|
|
"implemented": false,
|
|
"featureIds": ["F027"]
|
|
},
|
|
{
|
|
"id": "T034",
|
|
"description": "Documentation clearly distinguishes template authoring tables from runtime contract tables after normalization",
|
|
"implemented": false,
|
|
"featureIds": ["F028"]
|
|
},
|
|
{
|
|
"id": "T035",
|
|
"description": "Types/tests prove template DTOs and instantiated contract DTOs are no longer interchangeable at the action/API boundary",
|
|
"implemented": false,
|
|
"featureIds": ["F029"]
|
|
},
|
|
{
|
|
"id": "T036",
|
|
"description": "QuickBooks/export/accounting adapter paths continue to use invoice and instantiated contract data only after template fallback removal",
|
|
"implemented": false,
|
|
"featureIds": ["F030"]
|
|
},
|
|
{
|
|
"id": "T037",
|
|
"description": "Revenue/discount/invoice behavior for a contract instantiated from a template is unchanged after removing template fallback from runtime reads",
|
|
"implemented": false,
|
|
"featureIds": ["F005", "F006", "F030"]
|
|
},
|
|
{
|
|
"id": "T038",
|
|
"description": "No billing-engine code path joins `contract_templates` or legacy template-marked `contracts` rows as part of live billing execution after cutover",
|
|
"implemented": false,
|
|
"featureIds": ["F005", "F006", "F031", "F032"]
|
|
},
|
|
{
|
|
"id": "T039",
|
|
"description": "No contract API route returns template-backed data through contract-shaped compatibility adapters after cutover",
|
|
"implemented": false,
|
|
"featureIds": ["F009", "F010", "F011", "F031"]
|
|
},
|
|
{
|
|
"id": "T040",
|
|
"description": "No template CRUD path mutates instantiated contract tables after cutover",
|
|
"implemented": false,
|
|
"featureIds": ["F014", "F031"]
|
|
},
|
|
{
|
|
"id": "T041",
|
|
"description": "DB-backed sanity: canonical `contract_templates` rows exist while legacy template rows are absent or unreachable in the final normalized state",
|
|
"implemented": false,
|
|
"featureIds": ["F019", "F025", "F032"]
|
|
},
|
|
{
|
|
"id": "T042",
|
|
"description": "DB-backed sanity: canonical `contract_template_lines` and related child rows exist while legacy template-marked `contract_lines` are absent or unreachable in the final normalized state",
|
|
"implemented": false,
|
|
"featureIds": ["F019", "F026", "F032"]
|
|
},
|
|
{
|
|
"id": "T043",
|
|
"description": "Regression guard: contract detail screens still show correct instantiated contract lines and assignments after API/type separation",
|
|
"implemented": false,
|
|
"featureIds": ["F011", "F015", "F029"]
|
|
},
|
|
{
|
|
"id": "T044",
|
|
"description": "Regression guard: template detail screens still show correct template lines and services after API/type separation",
|
|
"implemented": false,
|
|
"featureIds": ["F010", "F015", "F029"]
|
|
},
|
|
{
|
|
"id": "T045",
|
|
"description": "Regression guard: renewal draft creation from a template-origin contract still retains intended provenance while billing uses only instantiated data",
|
|
"implemented": false,
|
|
"featureIds": ["F004", "F017", "F030"]
|
|
},
|
|
{
|
|
"id": "T046",
|
|
"description": "Regression guard: contract line repository callers no longer require `isTemplateContract()` or equivalent mixed-type probes after separation",
|
|
"implemented": false,
|
|
"featureIds": ["F012", "F013"]
|
|
},
|
|
{
|
|
"id": "T047",
|
|
"description": "Migration gate fails closed when any tenant still has runtime-only legacy template artifacts that are not represented canonically in `contract_template*` tables",
|
|
"implemented": false,
|
|
"featureIds": ["F003", "F021", "F031"]
|
|
},
|
|
{
|
|
"id": "T048",
|
|
"description": "Post-cutover validation proves no remaining source grep hits for the documented forbidden fallback patterns (`coalesce(template_contract_id, contract_id)`, mixed OR joins, template-to-contract adapters) in live paths",
|
|
"implemented": false,
|
|
"featureIds": ["F002", "F005", "F006", "F010", "F031"]
|
|
},
|
|
{
|
|
"id": "T049",
|
|
"description": "The plan and runtime design describe template instantiation as a one-way authoring-to-runtime transfer boundary with no reverse-sync semantics",
|
|
"implemented": false,
|
|
"featureIds": ["F033"]
|
|
},
|
|
{
|
|
"id": "T050",
|
|
"description": "Editing a template after a contract has been instantiated does not change invoice generation or runtime contract configuration for the existing contract",
|
|
"implemented": false,
|
|
"featureIds": ["F034"]
|
|
},
|
|
{
|
|
"id": "T051",
|
|
"description": "Deleting a template after one or more contracts have been instantiated does not change billing behavior or mutate runtime contract data for those contracts",
|
|
"implemented": false,
|
|
"featureIds": ["F035"]
|
|
}
|
|
]
|