Property Tax Appeal Skill
An evidence-led Agent Skill that triages US residential property-tax assessment disputes and prepares market-value review and appeal packets from two minimum inputs:
- Property address
- A value shown on the current assessment notice
The skill identifies whether that number is market, appraised, assessed, equalized, or taxable value; verifies the parcel and appeal rules; researches comparable sales, APNs, and stable transaction IDs; derives a defensible requested value; fact-checks the record; and generates matching upload-ready English Markdown and PDF files.
Scope is intentionally limited to cases where market value is a material appeal ground. The skill stops after route, form, and deadline research for unequal/non-uniform appraisal, exemption, classification, ownership, or other disputes that require a different evidence model.
Install
Use the portable Agent Skills installer for Codex, Claude Code, Cursor, OpenCode, and other compatible agents:
npx --yes skills@1.5.23 add https://github.com/mushanyoung/property-tax-appeal-skll/tree/v3.1.0 \
--skill prepare-property-tax-appeal
The tag-qualified URL is locked after the associated GitHub immutable release is published. Commands that add the repository as a native plugin track the repository's current default branch; use the attested, versioned release archives when reproducible installation is required.
Other native installation options:
| Platform | Installation |
|---|---|
| OpenAI Codex plugin | codex plugin marketplace add mushanyoung/property-tax-appeal-skll, then codex plugin add property-tax-appeal@property-tax-appeal-skll |
| Claude Code plugin | /plugin marketplace add mushanyoung/property-tax-appeal-skll, then /plugin install property-tax-appeal@property-tax-appeal-skll |
| Gemini CLI extension | gemini extensions install https://github.com/mushanyoung/property-tax-appeal-skll |
| GitHub Copilot / GitHub CLI | gh skill install mushanyoung/property-tax-appeal-skll prepare-property-tax-appeal@v3.1.0 |
See INSTALL.md for agent-specific paths, scopes, and dependency details.
Public Listings
These listings were checked on August 19, 2026. Registry-specific version labels can differ from the repository's SemVer release when a registry assigns its own version.
| Registry | Listing | Status |
|---|---|---|
| GitHub Releases | Immutable v3.1.0 release | Live |
| skills.sh | prepare-property-tax-appeal | Live |
| ClawHub | prepare-property-tax-appeal | Live; registry package licensed MIT-0 |
| Tessl | mushan/prepare-property-tax-appeal 3.1.0 | Live; moderation and security checks passed |
| askill | Skill 703844 | Live |
| Agent Skill Hub | mushanyoung/prepare-property-tax-appeal | Live as 2026.08.19.1 |
Marketplace Reviews
These review states were confirmed by the publisher on August 19, 2026. A pending review is not a public listing and does not imply approval.
| Marketplace | Status |
|---|---|
| OpenAI Plugins Directory | Deferred; not submitted |
| Claude official marketplace | Submitted; review pending |
| Cursor Marketplace | Submitted; review pending |
Core Method
- Verify the jurisdiction, valuation date, filing path, deadline, subject APN, and property characteristics from current sources.
- Require an explicit residential-use verification supported by a parcel-record source; stop packet generation for non-residential or unverified-use subjects.
- Explicitly designate the sales-comparable market value and preserve assessed, equalized, capped, exemption-adjusted, and authority-specific taxable values as sourced nodes.
- Define the legally usable sale-date window from current official guidance before screening comparable sales.
- Build and record a neutral comparable pool before selecting advocacy evidence.
- Give every candidate a stable transaction or recording ID; repeated APNs with different sales are not duplicates.
- Prefer exact bedroom and bathroom matches when enough credible inventory exists.
- Optionally exclude sales above the current market-value comparison basis from the final table only after one-schema scoring; equally or more relevant omitted evidence is automatically disclosed.
- Treat a reported sale-price range as an interval, never describe its lower endpoint as exact consideration, and exclude provisional endpoints from point statistics.
- Separate the requested value from the realistic likely-outcome range.
- Require explicit owner approval before rendering any declaration or signature block.
- Accept owner-provided MLS or closing records as locator-free private transaction evidence only when each comparable also has an independent public parcel record.
- Generate private, matching Markdown and PDF without clobbering existing files, then compare the facts and visually inspect every PDF page.
Nationwide Coverage
The skill includes a routing registry for market-value appeals in all 50 states and the District of Columbia. It maps each state to the common local filing structure, including assessor review, boards of equalization, appraisal review boards, value adjustment boards, boards of revision, tax boards, grievance proceedings, abatement applications, and state-level appeal ladders. A forum named a board of equalization does not imply that this builder supports a separate unequal-appraisal claim.
Look up the initial route for a state with:
python3 skills/prepare-property-tax-appeal/scripts/lookup_jurisdiction.py --state CA
python3 skills/prepare-property-tax-appeal/scripts/lookup_jurisdiction.py --state Texas --json
The registry is a routing aid, not a deadline database. Every case must verify the exact county, city, township, parish, borough, or district authority; current official form; filing deadline; valuation date; evidence window; submission method; and whether an informal review preserves formal appeal rights.
Repository Layout
gemini-extension.json
plugin.json
plugins/property-tax-appeal/
.codex-plugin/plugin.json
.claude-plugin/plugin.json
assets/property-tax-appeal-icon.png
skills/prepare-property-tax-appeal/
skills/prepare-property-tax-appeal/
.tessl-plugin/plugin.json
SKILL.md
agents/openai.yaml
assets/case-example.json
assets/case-template.json
references/
scripts/
tests/
marketplace/submission.json
marketplace/README.md
PRIVACY.md
SECURITY.md
SUPPORT.md
TERMS.md
.agents/plugins/marketplace.json
.claude-plugin/marketplace.json
Local Use
Read skills/prepare-property-tax-appeal/SKILL.md,
copy the fail-closed assets/case-template.json, research and cite the case facts, and change each
human-review gate only after performing that check. assets/case-example.json is a fictional test
fixture, not a pre-approved starting point. Then run:
python3 skills/prepare-property-tax-appeal/scripts/build_appeal_packet.py case.json \
--output-dir output \
--basename property-address-appeal
The builder creates private files and refuses to overwrite an existing packet by default. Markdown
retains the case's complete Unicode text. PDF output uses only the unembedded PDF Base 14
Helvetica and Helvetica-Bold fonts. Before creating a PDF, the builder verifies every character
against its supported WinAnsi glyph set. If any character is unsupported, PDF generation stops,
lists the affected Unicode code points, and directs the user to use an official English spelling or
generate Markdown only with --no-pdf. Use --force only after confirming that the existing
Markdown/PDF pair belongs to the same case.
Python Support
Version 3 supports CPython 3.11 through 3.14 and tests every supported minor version on each pull request and push. Python 3.14 additionally runs coverage, security, repository, and PDF smoke checks. Dependency locks are universal across the supported range and are installed with hashes. No weekly Python test matrix or Python 3.15 development job is used.
The deprecated v2 font-bearing release and tag were retired so new clones do not download that font through Git history. Repository checks fetch and inspect complete reachable history, reject font-program paths, and verify that the retired font blob is absent from the local object database.
Install the PDF dependency when needed:
python3 -m pip install --require-hashes \
-r skills/prepare-property-tax-appeal/scripts/requirements.lock
Scope
This repository prepares an evidence attachment and filing analysis. It does not replace legal advice, appraisal services, official forms, or verification of current local deadlines and submission requirements. A property owner must review the final facts and sign or submit any required government form.
The project operates no case-data backend. Review the public privacy policy, terms of use, support policy, and security policy before using it with private documents. Do not place real assessment notices, owner records, addresses, account numbers, or appeal packets in public issues.
Release Maintenance
The root skills/ directory is canonical. Synchronize and validate the self-contained plugin copy before committing:
python3 scripts/sync_distributions.py
python3 scripts/check_repo.py
Build deterministic .skill and .zip release assets with:
python3 scripts/package_skill.py
Release packaging refuses tracked skill, plugin, or version inputs that differ from HEAD.
Testing
The test suite covers ratio-state value separation, closed-world schema and typed-source validation, locator-free private owner attachments, bounded adversarial candidate sets and diagnostics, linear transaction indexing, contrary-evidence handling, truth-conditional prose, adversarial Markdown/URL input, DNS-rebinding-resistant link checks, malformed HTTP boundaries, Unicode-preserving Markdown, safe rejection of unsupported PDF characters, unembedded Base 14 font enforcement, failure-atomic output, all jurisdiction-router modes, deterministic secure archives, clean universal hash-locked installs, distribution synchronization, security scans, release-branch ancestry, and release metadata contracts.
python3 -m pip install --require-hashes -r requirements-test.lock
python3 scripts/check_repo.py
python3 -m coverage erase
python3 -m coverage run -m unittest discover -s tests -v
python3 -m coverage report
CI enforces at least 88% combined statement and branch coverage across the repository's deterministic Python scripts.