Skip to content

Complete Philadelphia property-tax benefit library - #541

Merged
prestoncabe merged 13 commits into
mainfrom
270-add-library-benefits-and-eligibility-checks-for-property-tax-benefits
Oct 6, 2026
Merged

prestoncabe merged 13 commits into
mainfrom
270-add-library-benefits-and-eligibility-checks-for-property-tax-benefits

Conversation

@prestoncabe

@prestoncabe prestoncabe commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

The library lacked three of Philadelphia's six supported property-tax benefits. Add Low-Income Tax Freeze, LOOP, and the Real Estate Tax Installment Plan (RETIP), with the reusable and composite checks needed to import their eligibility rules into a screener. All six benefits now expose callable checks and builder-compatible OpenAPI compositions.

  • Separate applicant/spouse income for tax-freeze eligibility from household income for LOOP and RETIP. Share the household income-limit logic, and use the existing spouse relationship lookup for age and marital-status rules.
  • Check LOOP ownership duration, assessment increases, historical abatements, and tax-payment status. Homestead recipients can qualify for LOOP; they must remove Homestead when enrolling.
  • Treat an explicitly empty enrollment list as no enrollments while retaining unknown for unanswered inputs. Update the example screener's guidance and generate supported household-size values in API examples.
  • Keep the editor usable after failed loads and retries, preserve unsaved form edits during refetches, and allow navigation back to the screeners list.

Closes #270
Closes #387
Closes #389
Closes #537

Verification

  • Frontend suite: 152 tests passed.
  • Library JVM suite: 16 tests passed, including discovery and resolvable compositions for all six benefits.
  • Example screener import and seed tests: 9 tests passed.
  • Bruno collection against an isolated library service: 170 requests and 334 assertions passed, covering eligibility failures, unknown inputs, income boundaries, spouse pathways, and assessment alternatives.
  • git diff --check passed.

A clean library build reports zero diagram-validation warnings. Imported helper-function shapes, requirement coverage, and edge geometry were also checked.

Documentation impact

  • Updated the example screener README and its enrollment helper text to explain the new meaning of “None of these.” New input schemas and rule descriptions are defined in the DMN models.

prestoncabe and others added 12 commits October 6, 2026 13:32
Implement Low-Income Tax Freeze, LOOP, and RETIP with reusable income, age, ownership, assessment, abatement, and payment-plan checks. Publish builder-compatible compositions for all six benefits, document policy inputs and sources, and cover eligibility boundaries with Bruno tests.

Treat an explicitly empty enrollment list as no enrollments while preserving unknown for unanswered inputs.
Keep failed loads from throwing during editor rendering. Show a return link and retry action for stale screener URLs, and test both recovery paths.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The city requires Homestead recipients to remove that exemption when they
enroll in LOOP, so current enrollment should not make them ineligible.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Low-Income Tax Freeze limit covers the applicant's and spouse's income,
not the household total that LOOP and RETIP use, so it reads a new
applicantAndSpouseIncome field. Marriage now comes from relationships via
the shared spouse id BKM, matching the age checks, and the unused
simpleChecks.isMarried field is removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Example payloads used 42 for every number, so household-size checks
returned null and the endpoint smoke test was loosened to accept that.
Generate size fields as 1 and restore the non-null checkResult assertion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Show the loading state while retrying a failed load, keep the loaded
editor open when a later refetch fails, and stop refetches from
replacing unsaved form edits with the server copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The library now treats an empty enrollment list as not enrolled in any
program, so the seed form and README no longer warn that None of these
leaves enrollment unknown.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Navigating away clears screenerId while the editor is still mounted, so
the title read of the loaded screener threw and blocked navigation, and
the resource refetched with no ID. Skip fetching without an ID and read
the title defensively.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the imported spouse and income helper shapes and connect their knowledge requirements to the output decisions. Clean DMN validation now reports no diagram warnings.
@prestoncabe
prestoncabe merged commit 4b5f0ad into main Oct 6, 2026
5 checks passed
@prestoncabe
prestoncabe deleted the 270-add-library-benefits-and-eligibility-checks-for-property-tax-benefits branch October 6, 2026 19:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant