{"skill":{"slug":"construction-law","displayName":"Construction Law: FIDIC, PSSCOC, SIA & Singapore SOP Act","summary":"FIDIC (Red/Yellow/Silver), PSSCOC, SIA, and Singapore SOP Act toolkit. Generate notices, claims, EOT applications, and obligations registers. Computes statut...","description":"---\nname: construction-law\ndescription: \"FIDIC (Red/Yellow/Silver), PSSCOC, SIA, and Singapore SOP Act toolkit. Generate notices, claims, EOT applications, and obligations registers. Computes statutory deadlines against eGazette-verified holiday data. Use when (1) analysing contract clauses, risk allocation, or obligations; (2) preparing or reviewing claims (delay, disruption, prolongation, EOT, loss & expense); (3) comparing contract forms or advising on procurement strategy; (4) drafting or reviewing notices, correspondence, or contract documents; (5) building obligations registers or notice calendars; (6) discussing dispute resolution (DAB/DAAB, adjudication, arbitration, mediation, CAB); (7) Singapore-specific construction law (SOP Act, BCA, SIArb); (8) MDB procurement frameworks (ADB, World Bank). NOT for: non-construction commercial contracts, pure property/real-estate conveyancing, or insurance law.\"\n---\n\n# Construction Law: FIDIC, PSSCOC, SIA & Singapore SOP Act\n\n<!-- Remove v2.11.0 banner after 2026-08-17 -->\n> **⚠️ v2.11.0 users — action required if you computed non-SG deadlines.**\n> v2.11.0 shipped with bundled best-effort holiday data for AE, MY, and GB that was **not verified against authoritative sources**. If you ran the FIDIC Deadline Calculator against a non-SG seat using v2.11.0, **re-check those deadlines** against your jurisdiction’s official gazette. From v2.11.1 onward, only Singapore holidays are bundled (gazette-verified); other jurisdictions require `--holidays-file` with your own verified data. See the [FIDIC Deadline Calculator](#fidic-deadline-calculator) section for details.\n\nAnalyze construction contracts, claims, notices, payment timelines, risk allocation, and dispute pathways across major standard forms, with strong international and Singapore-focused coverage.\n\n## Why install this?\n\n- ✅ Avoid missed notice deadlines and time-bar mistakes\n- ✅ Structure claims and EOT submissions faster\n- ✅ Compare contract risk and obligations more consistently\n- ✅ Prompts for the correct contract form **and edition** before analysis\n\n## Who this skill is for\n\nThis skill is built for:\n\n- Construction lawyers\n- In-house counsel\n- Contract managers\n- Commercial managers\n- Quantity surveyors\n- Claims consultants\n- Project managers\n\n## What this skill does\n\nUse this skill to:\n\n- Identify the correct contract form and edition before analysis\n- Review clauses for obligations, rights, risks, and time-bars\n- Generate notice calendars and obligations registers\n- Draft structured claim, EOT, variation, and payment templates\n- Compare FIDIC forms across key topics\n- Calculate Singapore SOP Act payment timelines\n- Assess delay events, concurrency, EOT exposure, and LD risk\n- Triage dispute resolution pathways\n\n## Supported forms and frameworks\n\n- FIDIC Red Book 2017 (Construction)\n- FIDIC Yellow Book 2017 (Plant & Design-Build)\n- FIDIC Silver Book 2017 (EPC/Turnkey)\n- PSSCOC (Construction Works)\n- SIA Conditions (9th Edition)\n- NEC (NEC3, NEC4) — notice calendar only\n- JCT — pending\n- Singapore SOP Act workflows\n\n## Why this skill matters\n\nConstruction outcomes often turn on details such as:\n\n- the exact contract form and edition\n- amended or bespoke clauses\n- notice timing\n- record quality\n- causation\n- quantification\n- governing law\n\nThis skill helps you structure analysis quickly and consistently so you can spot risks early and avoid missing critical deadlines.\n\n> 🇸🇬 **Singapore matters — BCA circular awareness:** BCA frequently updates SOP Act timelines, plan fees, CORENET-X procedures, BC1/structural codes, cost-sharing schemes, productivity grants, and buildability rules through circulars at https://www1.bca.gov.sg/resources/circulars/. If you maintain a local mirror (e.g. `bca-circulars/` in your workspace, refreshed via a weekly heartbeat task), check it before relying on general knowledge. See `references/singapore.md` for details.\n>\n> ℹ️ This skill does not fetch live BCA updates itself. If you maintain a local circulars mirror in your workspace, use it as an up-to-date reference alongside the skill.\n\n## CLI overview\n\n```\nConstruction Law Skill — Unified CLI\n\nUsage: construction_law.py <command> [options]\n\nAvailable commands:\n\n  intake       🏗️ Matter intake — guided issue triage (recommended starting point)\n  wizard       🧙 Interactive guided prompts for tools\n  notices      Generate notice/obligations calendar for a contract form\n  claims       Generate claim notice/EOT/VO/disruption letters\n  sop          Singapore SOP Act payment timeline calculator\n  compare      Compare FIDIC contract forms side-by-side\n  obligations  Generate party-by-party obligations register\n  register     Generate Excel workbook of obligations + notices\n  delay        Delay analysis & EOT entitlement calculator\n  deadline     FIDIC deadline calculator — Singapore bundled; bring-your-own-holidays for other seats\n\nRun any command with --help for its specific options, e.g.:\n  python3 construction_law.py notices --help\n  python3 construction_law.py claims --help\n```\n\n---\n\n## Start here\n\n### Recommended for all users: Matter Intake\n\nThe intake mode triages a construction issue and produces a professional report with clause buckets, deadline checks, amendment warnings, confidence labels, and recommended next steps.\n\n```bash\npython3 scripts/construction_law.py intake\n# or\npython3 scripts/intake.py\n```\n\nSupports non-interactive mode for automation:\n```bash\npython3 scripts/intake.py --file matter.json --output report.md --save-matter answers.json\n```\n\nUse non-interactive mode for repeatable internal workflows, templates, or batch matter intake.\n\n### Sample Matter Intake output\n\nExample: delay / EOT issue under FIDIC Red 1999\n\n```text\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n MATTER INTAKE — OUTPUT REPORT\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nContract:   FIDIC Red 1999\nGoverning:  Singapore\nParty:      Contractor\nIssue:      Delay / Extension of Time (EOT)\nObjective:  Both EOT and additional payment\n\n1. ISSUE SUMMARY\nThis appears to be a delay / EOT issue arising from late\naccess to site. The likely focus is notice compliance,\nEOT entitlement, causation, and supporting records.\n\n2. LIKELY CLAUSE BUCKETS\n- Clause 2.1   Right of Access to Site\n- Clause 8.4   Extension of Time\n- Clause 20.1  Contractor's Claims\n\n3. DEADLINE / TIME-BAR CHECK\nTrigger:   Awareness of delaying event\nDeadline:  28 days from awareness\nStatus:    ⚠️ Notice not confirmed\nRisk:      Potential time-bar if late notice applies\n\n4. AMENDMENT SENSITIVITY FLAGS\n- Notice periods may be amended\n- EOT wording may be narrowed\n- Particular Conditions may override the standard form\n\n5. RECOMMENDED NEXT STEPS\n- confirm exact clause wording and edition\n- verify whether notice was served in time\n- gather programme and contemporaneous records\n- prepare claim narrative and supporting documents\n\n6. CONFIDENCE LABELS\nDeadline calculation:      High confidence\nClause identification:     High confidence\nEntitlement position:      Needs review\n\nThis is a workflow and analysis aid only. It is not legal advice.\n```\n\n> 🎯 **For strategic claim planning**, see the companion skill `construction-claim-strategy` on ClawHub (v1.5.0). It covers the 7-Dimension strategy framework, argument ranking, delay analysis methods (SCL Protocol, TIA, Windows Analysis), concurrent delay strategy, disruption claims, quantum calculation examples (Eichleay/Hudson/Emden/Measured Mile), ADR strategy (adjudication vs arbitration), notice compliance, expert engagement, risk assessment, pacing delays, legal precedents, and 22 printable reference documents — all BEFORE you select clauses or start drafting.\n\n### Interactive Wizard\n\nFor tool-specific tasks (notices, claims, SOP calculator, etc.), use the wizard:\n\n```bash\npython3 scripts/construction_law.py wizard\n# or\npython3 scripts/wizard.py\n```\n\n### For power users: Unified CLI\n\n```bash\npython3 scripts/construction_law.py --list\npython3 scripts/construction_law.py notices --form fidic-red\npython3 scripts/construction_law.py notices --form fidic-silver\npython3 scripts/construction_law.py claims --form fidic-red --type disruption-claim\npython3 scripts/construction_law.py claims --form fidic-yellow --type eot-application\npython3 scripts/construction_law.py claims --form fidic-silver --type notice-of-claim\npython3 scripts/construction_law.py sop --claim-date 2026-05-15\npython3 scripts/construction_law.py compare --forms red,yellow,silver --topic claims\npython3 scripts/construction_law.py obligations --form fidic-silver --party both\npython3 scripts/construction_law.py register --form fidic-red --type both --output reg.xlsx\npython3 scripts/construction_law.py register --form fidic-silver --type both --output silver.xlsx\npython3 scripts/construction_law.py delay --baseline-start 2026-05-01 --baseline-end 2026-12-31\npython3 scripts/construction_law.py deadline --seat SG --trigger 2026-05-15 --period 28 --mode exclude_ph\npython3 scripts/construction_law.py deadline --seat AE --trigger 2026-03-18 --period 28 --mode exclude_ph --holidays-file ae_holidays.json\n```\n\n> 💡 **All three FIDIC colours supported:** `fidic-red`, `fidic-yellow`, `fidic-silver`. Also: `psscoc`, `sia`.\n\n## Critical rule: always confirm the contract edition first\n\nBefore any clause analysis, confirm:\n\n- contract form\n- edition/year\n- governing law\n- amendments or particular conditions\n- whether bespoke terms override the standard form\n\nDo not assume the latest edition applies.\n\n### Common editions still in use\n\n- PSSCOC: 2017, 2020\n- PSSCOC D&B: 2014, 2020\n- FIDIC: 1999, 2017\n- SIA: 9th Ed, 11th Ed\n- NEC: NEC3, NEC4\n\n## Core workflows\n\n### 1. Clause analysis\n\nFor any clause question, this skill helps you:\n\n- identify the relevant clause\n- explain the obligation, entitlement, or risk\n- flag notice periods and time-bars\n- cross-reference related clauses\n- highlight where amendments may change the default position\n\n### 2. Claims and EOT analysis\n\nFor delay, disruption, prolongation, and related claims, use this structure:\n\n1. Entitlement\n2. Causation\n3. Notice compliance\n4. Substantiation\n5. Quantification\n\n### 3. Notice calendars\n\nBuild notice calendars that capture:\n\n- clause reference\n- trigger event\n- notice period\n- recipient\n- consequence of non-compliance\n\n### 4. Risk allocation review\n\nAssess whether risk is allocated to the party best able to:\n\n1. identify it\n2. control it\n3. mitigate it\n4. absorb it\n\n### 5. Delay and LD exposure\n\nReview:\n\n- delay event chronology\n- criticality\n- concurrency\n- potential EOT entitlement\n- potential liquidated damages exposure\n\n## Included tools\n\n### Interactive Wizard\n\nGuided prompts for common tasks.\n\n```bash\npython3 scripts/wizard.py\n```\n\n### Notice Calendar Generator\n\nGenerate notice and obligations calendars.\n\n```bash\npython3 scripts/notice_calendar.py --form fidic-red --format md\npython3 scripts/notice_calendar.py --form fidic-yellow --format md\npython3 scripts/notice_calendar.py --form fidic-silver --format md\npython3 scripts/notice_calendar.py --form psscoc --format csv --output notices.csv\n```\n\n### Claims Template Generator\n\nGenerate structured templates for claim notices and related submissions.\n\n```bash\npython3 scripts/claims_template.py --list\npython3 scripts/claims_template.py --form fidic-red --type notice-of-claim --output notice.md\npython3 scripts/claims_template.py --form fidic-yellow --type eot-application --output eot_yellow.md\npython3 scripts/claims_template.py --form fidic-silver --type notice-of-claim --output notice_silver.md\npython3 scripts/claims_template.py --form psscoc --type eot-application --output eot.md\n```\n\n### Obligations Register Generator\n\nCreate obligations registers by party and category.\n\n```bash\npython3 scripts/obligations_register.py --form fidic-red --party both --format md\npython3 scripts/obligations_register.py --form fidic-yellow --party contractor --format md\npython3 scripts/obligations_register.py --form fidic-silver --party both --format md\npython3 scripts/obligations_register.py --form psscoc --party contractor --format csv --output obligations.csv\n```\n\n### SOP Act Payment Timeline Calculator\n\nCalculate statutory payment deadlines from a Singapore payment claim date.\n\n```bash\npython3 scripts/sop_calculator.py --claim-date 2026-06-30\npython3 scripts/sop_calculator.py --claim-date 2026-06-30 --response-period 14 --format csv --output timeline.csv\n```\n\n### FIDIC Contract Comparator\n\nCompare FIDIC forms side by side.\n\n```bash\npython3 scripts/fidic_comparator.py --forms red,yellow,silver --topic risk\npython3 scripts/fidic_comparator.py --forms red,yellow,silver --topic all --format csv --output comparison.csv\n```\n\nTopics: `overview`, `risk`, `claims`, `disputes`, `payment`, `termination`, `all`\n\n### FIDIC Deadline Calculator (Seat-Aware)\n\nCompute contractual deadlines based on the seat country's public holidays.\n\n> The FIDIC Deadline Calculator supports Singapore out of the box, with holiday data verified against the eGazette. Singapore data covers gazetted years (currently 2025–2026); the 2027 entry is provisional until MOM gazettes it (expected late 2026). For projects with a seat in any other jurisdiction, you must supply your own holiday list — the tool will not ship pre-loaded holiday data for non-Singapore seats. This is deliberate: holiday calendars vary by sub-jurisdiction (Malaysian state, UK constituent country, individual emirate), shift by moon-sighting, and are gazetted by your own government's authoritative source. Use that source, not ours.\n\nSupports three day-counting modes:\n- **calendar** — calendar-day counting; use where the relevant clause defines or operates on calendar days\n- **exclude_ph** — calendar days excluding public holidays of the seat country\n- **working** — excludes weekends AND public holidays (for contracts defining \"working day\")\n\n```bash\npython3 scripts/fidic_deadline.py --list-seats\npython3 scripts/fidic_deadline.py --seat SG --trigger 2026-05-15 --period 28\npython3 scripts/fidic_deadline.py --seat SG --trigger 2026-05-15 --period 28 --mode exclude_ph\npython3 scripts/fidic_deadline.py --seat AE --trigger 2026-03-18 --period 28 --mode exclude_ph --holidays-file ae_holidays.json\npython3 scripts/fidic_deadline.py --seat MY --trigger 2026-02-15 --period 28 --mode working --holidays-file my_holidays.json\n```\n\nBundled seat: `SG` (Singapore — gazette-verified). For any other jurisdiction, supply `--holidays-file`. See `docs/holiday-file-format.md` for the JSON schema and a worked example.\n\n> 💡 **Which mode to use?** Check your contract's definition of \"day\". FIDIC 2017 standard = calendar days. If Particular Conditions amend this to exclude public holidays, use `exclude_ph`. If the contract uses \"working days\", use `working`.\n\n### Delay Analysis Calculator\n\nAssess delay events, concurrency, EOT exposure, and LD risk.\n\n```bash\npython3 scripts/delay_calculator.py --baseline-start 2026-05-11 --baseline-end 2030-05-10 \\\n  --add \"Late access|2026-06-01|2026-06-30|employer|critical\" \\\n  --add \"Weather|2026-07-15|2026-07-25|neutral|critical\"\n```\n\n### Excel Register Generator\n\nExport notice calendars and obligations registers to .xlsx.\n\n```bash\npython3 scripts/excel_register.py --form fidic-red --type both --output contract_admin.xlsx --commencement 2026-05-11\npython3 scripts/excel_register.py --form fidic-yellow --type both --output yellow_admin.xlsx\npython3 scripts/excel_register.py --form fidic-silver --type both --output silver_admin.xlsx\npython3 scripts/excel_register.py --form psscoc --type obligations --output obligations.xlsx\n```\n\nRequires: `openpyxl` (`pip3 install openpyxl`)\n\n## Example outputs\n\n### Notice calendar — concrete sample\n\n```\nClause:    FIDIC 20.2.1\nTrigger:   Event giving rise to claim\nDeadline:  28 days from awareness\nRecipient: Engineer\nRisk:      Late notice may prejudice entitlement (time-bar)\n```\n\n### Notice calendar — fields\n\n- Clause reference\n- Trigger event\n- Notice deadline\n- Recipient\n- Time-bar consequence\n\n### Claims template\n\n- Background\n- Contract basis\n- Event chronology\n- Causation\n- Notice compliance\n- Relief sought\n- Reservation of rights\n- Supporting documents\n\n### Obligations register\n\n- Clause\n- Obligation\n- Responsible party\n- Timing\n- Priority\n- Status\n- Notes\n\n## Best use cases\n\n- preliminary clause review\n- contract administration checklists\n- claim structure and document preparation\n- notice and deadline tracking\n- form comparison\n- SOP timeline calculation\n- delay event triage\n\n## Important limitations\n\nThis skill is a workflow and analysis aid. It is not a substitute for legal advice.\n\nUse caution where:\n\n- the contract is heavily amended\n- bespoke EPC or project-specific drafting applies\n- governing law may materially change the outcome\n- local statutory regimes override standard form assumptions\n- adjudication, arbitration, or court submissions require final review\n\nAlways verify:\n\n- the contract edition\n- amendments and particular conditions\n- governing law\n- notice requirements\n- jurisdiction-specific treatment of concurrency, good faith, prevention, and time-bars\n\n## Key principles\n\n- Read the contract first\n- Standard form positions mean little if amended\n- Time-bars can be fatal\n- Notice compliance should be checked before merits\n- Concurrency treatment differs by jurisdiction\n- Good faith is jurisdiction-specific\n- Prevention issues may affect LD exposure\n- Fitness for purpose and reasonable skill and care must be distinguished carefully\n\n## Reference files\n\n- references/fidic.md\n- references/singapore.md\n- references/claims.md\n- references/disputes.md\n- references/procurement.md\n\n## Live knowledge sources (Singapore)\n\nFor up-to-date Singapore regulatory context, consult the **BCA circulars page** — the authoritative source for changes to SOP Act timelines, plan fees, CORENET-X, BC1/structural codes, cost-sharing schemes, productivity grants, and buildability requirements:\n\n- **Source:** https://www1.bca.gov.sg/resources/circulars/\n- **Recommended setup:** Maintain a local PDF mirror (e.g. `bca-circulars/` in your workspace) refreshed weekly via a heartbeat or cron task. Track seen titles in a `seen.json` index to detect new circulars.\n\nWhen advising on Singapore matters touching SOP Act timelines, plan fees, CORENET-X, BC1/structural codes, cost-sharing schemes, productivity grants, or buildability requirements, **check the latest circulars first** before relying on general knowledge — BCA updates can change deadlines, rates, and procedural requirements.\n\nIf your local mirror looks stale (>2 weeks old), trigger a fresh fetch.\n\n## 🔒 Security and safety\n\nAll Python scripts in this skill are designed as safe, local template and register generators.\n\n- ✅ **No network access** — no API calls, no HTTP requests\n- ✅ **No subprocess execution** — no shell commands, no external programs\n- ✅ **No dynamic code loading** — sibling scripts are imported as plain Python modules (no `importlib`, no `exec`, no `eval`)\n- ✅ **No telemetry from skill code** — the bundled scripts do not collect or transmit data. (Note: your LLM provider’s normal data handling still applies.)\n- ✅ **No filesystem traversal** — only writes to the user-specified `--output` path\n- ✅ **Read-only static reference data** — contract clauses bundled with the skill\n- ✅ **ClawScan:** Benign\n- ✅ **Static analysis:** Benign\n- ℹ️ VirusTotal status is shown on the listing page\n\n**Safe to install and use.** 🛡️\n\n### Files written\n\nScripts write files **only** when you pass explicit output flags. If no output flag is provided, all output goes to stdout.\n\n| Script | Flag | What is written | Format |\n|--------|------|----------------|--------|\n| Any script | `--output FILE` | Generated report/template/calendar | UTF-8 (Markdown, CSV, or plain text) |\n| `excel_register.py` | `--output FILE.xlsx` | Obligations/notices workbook | Excel (.xlsx, requires openpyxl) |\n| `claims_template.py` | `--output FILE.docx` | Claim letter | Word (.docx, requires python-docx) |\n| `sop_calculator.py` | `--output FILE` | SOP payment timeline | UTF-8 Markdown or CSV |\n| `fidic_deadline.py` | `--output FILE` | Deadline calculation | UTF-8 text or Markdown |\n\nNo files are created, modified, or read beyond the explicit input flags (`--file`, `--holidays-file`, `--events-csv`).\n\n## Dependencies\n\nCore scripts use only the Python standard library. Optional features require:\n\n| Package | Required For | Install |\n|---------|-------------|--------|\n| `openpyxl` | Excel register output | `pip3 install openpyxl` |\n| `python-docx` | Word document export | `pip3 install python-docx` |\n\nDeclared in `pyproject.toml` as optional extras:\n```bash\npip3 install .[excel]    # Excel only\npip3 install .[all]      # Excel + Word\npip3 install .[test]     # pytest + hypothesis\n```\n\n## Testing\n\nThe skill includes a multi-layer test suite (73 tests):\n\n**Layer 1 — Golden file** (`test_sop_golden.py`): 8 hand-computed scenarios frozen in `tests/data/golden_timelines.csv`. Covers CNY cluster, Vesak/Hari Raya Haji, Christmas/New Year cross-year, National Day in-lieu, baseline, claim-on-PH, 14-day response, and s.17(2) +7 extension.\n\n**Layer 2 — Property-based** (`test_sop_properties.py`): Hypothesis tests over 2025–2027 date range. Properties: deadline never on PH, strictly monotonic, round-trip sop_days_between, adding a holiday can only push later, result ≥ N calendar days.\n\n**Layer 3 — Boundary** (`test_sop_boundary.py`): End-of-month, end-of-year, s.17(2) extension (verified as SOP days with PH skipping), claim on PH, consecutive holidays (3+ non-SOP days), out-of-range year (fails loud), Silver Book fitness-for-purpose assertion.\n\n**Register tests** (`test_registers.py`): All forms produce valid MD/CSV, Silver Book has no Engineer, entry structure validation.\n\n```bash\ncd skills/construction-law\npip3 install .[test]\npython3 -m pytest tests/ -v\n# or without pytest:\npython3 -m unittest discover tests\n```\n\n## Changelog\n\n### v2.11.5 (May 2026)\n- **MUST-FIX:** `_check_year_coverage` now called from all public functions (`is_sop_day`, `add_sop_days`, `sop_days_between`) — previously only called from `calc_timeline`. Dates in uncovered years (e.g. 2028) now raise `ValueError` instead of silently treating all days as working days. Year-crossing within `add_sop_days` also checked.\n- **Docs:** `is_sop_day` docstring clarifies: returns True for Saturdays/Sundays (they count as SOP days); raises ValueError for uncovered years (does not silently return False); ad-hoc holidays (e.g. Polling Day) require manual addition\n- **Docs:** `add_sop_days(start, 0)` semantics documented (returns start unchanged; caller responsible for whether start is a working day)\n- **Docs:** Ad-hoc holiday warning added to timeline output\n- **Docs:** Error message now uses actual config path (`_HOLIDAY_JSON.name`) instead of hardcoded string\n- **Tests:** 73 → 85. New: `TestSaturdayDeadline` (deadline on Saturday stays), `TestInLieuCollision` (synthetic collision sets exercise while-loop), `TestOutOfRangeYear` expanded (4 new: `add_sop_days`, `is_sop_day`, `sop_days_between`, year-crossing), golden row 9 (Saturday deadline + Labour Day PH skip)\n- **Tests:** Property test date bounds tightened (`MAX_DATE_FOR_ADD = 2027-10-01`) to avoid crossing into uncovered 2028\n\n### v2.11.4 (May 2026)\n- **Security:** Sanitised test docstrings and comments — removed function-call patterns that static analysis scanners match against English text\n\n### v2.11.3 (May 2026)\n- **Security:** Replaced string-grep forbidden-imports check with `ast.parse` tree-walking — properly catches `compile(...)`, `exec(...)`, `eval(...)` regardless of whitespace or indirection; no longer false-positives on comments, docstrings, or strings containing those words\n\n### v2.11.2 (May 2026)\n- **Title:** Updated to \"Construction Law: FIDIC, PSSCOC, SIA & Singapore SOP Act\"\n- **Advisory:** Added v2.11.0 user advisory banner for non-SG deadline re-check\n- **Docs:** Added CLI overview (`--help` output) to SKILL.md so users can evaluate commands without installing\n- **Docs:** Tightened \"No telemetry\" statement to distinguish skill code from LLM provider data handling\n- **Docs:** Added \"Files written\" section documenting exactly what each script writes and when\n- **Docs:** SKILL.md changelog backfilled with v2.10.0–v2.11.1 entries (CHANGELOG.md remained the source of truth; SKILL.md was out of sync)\n- **Security:** Added `test_security.py` — scans all 13 scripts for forbidden imports (subprocess, socket, requests, urllib.request, http.client, importlib, pickle, marshal, os.system, exec, eval, compile), enforcing the no-network/no-subprocess/no-dynamic-code claim at test time\n- **Docs:** Recommend `python3 -m unittest` (stdlib) alongside pytest\n\n### v2.11.1 (May 2026)\n- **Scope correction:** Removed bundled best-effort holiday data for AE, MY, GB — shipping unverified holiday data in a legal-deadline tool was the wrong call\n- **FIDIC Deadline Calculator** now ships with **Singapore holidays only** (gazette-verified). Other jurisdictions: supply your own verified holiday data via `--holidays-file`\n- Added `docs/holiday-file-format.md` with JSON schema, worked example, and source guidance\n- Reduced golden deadline tests to Singapore-only; retained generic property tests\n\n### v2.11.0 (May 2026)\n- **New:** FIDIC Deadline Calculator (`fidic_deadline.py`) — computes contractual deadlines in three modes: `calendar` (calendar-day counting), `exclude_ph` (excludes public holidays only), and `working` (excludes weekends + public holidays)\n- **Singapore calendar bundled and maintained** — verified against eGazette / MOM source data\n- **Important:** Holiday data covers **Singapore only**. For all other jurisdictions, users must supply their own gazette-verified holiday file via `--holidays-file`. The tool will prompt clearly if a non-SG seat is used without one.\n\n### v2.10.1 (May 2026)\n- Reconciled CHANGELOG v2.8.1/v2.9.1 duplication\n- Recategorized out-of-range ValueError as legal accuracy change\n- Added per-year eGazette URL, MOM gazette cite, and holiday names to `data/sg_holidays.json`\n- Added moon sighting notes for Hari Raya Puasa / Hari Raya Haji dates\n\n### v2.10.0 (May 2026)\n- **3-layer test suite (57+ tests):** golden-file, Hypothesis property-based, and boundary tests for SOP calculator; register tests for all forms\n- **Out-of-range year protection:** Calculator now raises ValueError with a clear message when claim date's year has no holiday data (no silent wrong answers)\n- **`pyproject.toml`** with optional extras (`[excel]`, `[word]`, `[all]`, `[test]`)\n- **`data/sg_holidays.json`** as single source of truth with per-year provenance\n- **Disclaimer injection** on all generated templates (visible text + HTML comment)\n- **Deprecated:** `--add` pipe-delimited flag; replaced with `--add-event` (structured) and `--events-csv` (batch)\n- **Added:** `CHANGELOG.md` with categorized convention\n\n### v2.9.0 (May 2026)\n- **FIDIC Silver Book (EPC/Turnkey) 2017 added as a fully-supported form.** All 7 claim templates now have fidic-silver versions (notice-of-claim, eot-application, variation-claim, interim-claim, disruption-claim, loss-and-expense, final-account). Templates are tailored to EPC/Turnkey context: no Engineer (Employer administers directly via Employer's Representative), narrower EOT grounds under Sub-Clause 8.5, Contractor's broader risk assumption, lump sum pricing, fitness for purpose obligations, and design responsibility under Sub-Clause 5.\n- **fidic-silver obligations register added** — 33 contractor obligations (including EPC-specific design, fitness for purpose, higher physical conditions threshold) and 11 employer obligations.\n- **fidic-silver notice calendar added** — 12 key notices (claims, design, variations, disputes, payment) with Silver Book-specific recipients (Employer, not Engineer).\n- **Excel register now produces fidic-silver sheets** for both obligations and notices.\n- Full support matrix is now **35 combos** (7 claim types × 5 forms: fidic-red, fidic-yellow, fidic-silver, psscoc, sia). NEC4 and JCT remain pending.\n- Updated cross-references to companion skill `construction-claim-strategy` v1.5.0.\n\n### v2.8.1 (May 2026) — SOP holiday correctness fix\n- **Sunday → Monday in-lieu rule now applied automatically.** Under the Holidays Act 1998 s.4(2), when a public holiday falls on a Sunday the following Monday is a public holiday in lieu. The previous bundled holiday list missed four such Mondays (1 Jun 2026 — Vesak in-lieu; 10 Aug 2026 — National Day in-lieu; 9 Nov 2026 — Deepavali in-lieu; 8 Feb 2027 — CNY Day 2 in-lieu). The SOP day arithmetic now derives in-lieu Mondays from the gazetted Sunday holidays automatically, so future gazette updates won't drift.\n- This affects any SOP timeline whose computed window crosses a Sunday public holiday — deadlines could be off by one day under v2.8.0 and earlier. Re-run any SOP timelines you generated previously if the period crossed those dates.\n\n### v2.8.0 (May 2026)\n- **FIDIC Yellow Book 2017 added as a fully-supported form.** All 7 claim templates now have fidic-yellow versions (notice-of-claim, eot-application, variation-claim, interim-claim, disruption-claim, loss-and-expense, final-account). Templates are tailored to Plant & Design-Build context: design responsibility (Cl. 5), Employer's Requirements (Cl. 1.9), milestone-based payment (Schedule of Payments), Tests after Completion (Cl. 12), and the 8.5 EOT grounds.\n- **fidic-yellow obligations register added** — 33 contractor obligations (including design-specific clauses 5.1–5.8) and 12 employer obligations.\n- **Excel register now produces fidic-yellow obligations sheets** in addition to notices.\n- All new templates are edition-tagged in the HTML comment header and visible body.\n- Full support matrix is now **28 combos** (7 claim types × 4 forms: fidic-red, fidic-yellow, psscoc, sia). NEC4 and JCT remain pending.\n\n### v2.7.0 (May 2026)\n- **6 new claim templates** filling the PSSCOC + SIA gap: `eot-application`, `variation-claim`, and `interim-claim` now have full PSSCOC (7th Ed., 2014 rev. 2020) and SIA (9th Ed., 2010 rep. 2016) versions.\n- All new templates are **edition-tagged** in an HTML comment header and in the visible body, so users know exactly which standard form edition the clauses correspond to.\n- Interim-claim templates explicitly dual-purpose as SOP Act s.10 payment claims with the s.10(3) requirements ticked off.\n- Full support matrix is now **21 combos** (7 claim types × 3 forms).\n\n### v2.6.0 (May 2026)\n- **SOP calculator now holiday-aware.** Periods are computed in SOP days (excluding Singapore public holidays per SOP Act s.2 read with the Holidays Act 1998). Previously used calendar-day arithmetic which silently produced wrong dates around holiday clusters.\n- **SOP timeline conceptual fix.** Removed misleading min/max determination and payment-due rows; replaced with single statutory deadlines and an explicit s.17(2) +7-day extension note.\n- **Argparse no longer crashes** on `claims_template.py` for `fidic-yellow`, `nec4`, or `jct` — unsupported forms are now rejected at parse time with a pointer to `--list`. Unsupported (form, type) combos within registered forms also fail with a helpful message.\n- **Excel register no longer writes half-empty workbooks.** Pre-flight coverage check refuses combos like `--form fidic-yellow --type obligations` and prints what is supported.\n- **Version sprawl resolved.** New `scripts/version.py` is the single source of truth; intake.py / wizard.py / delay_calculator.py / sop_calculator.py footers all aligned to v2.6.\n\n","tags":{"latest":"2.11.5","adjudication":"2.8.1","arbitration":"2.8.1","claims":"2.8.1","construction":"2.8.1","delay":"2.8.1","disruption":"2.8.1","eot":"2.8.1","fidic":"2.8.1","fidic-yellow":"2.8.1","interim-payment":"2.7.0","jct":"2.8.1","law":"2.8.1","nec":"2.8.1","notice-calendar":"2.8.1","obligations":"2.8.1","plant-design-build":"2.8.1","psscoc":"2.8.1","sia":"2.8.1","singapore":"2.8.1","sop-act":"2.8.1","variation":"2.7.0"},"stats":{"comments":0,"downloads":981,"installsAllTime":1,"installsCurrent":1,"stars":1,"versions":30},"createdAt":1777856423508,"updatedAt":1779014507594},"latestVersion":{"version":"2.11.5","createdAt":1779013417998,"changelog":"v2.11.5: CRITICAL FIX — _check_year_coverage wired into all public SOP functions (is_sop_day, add_sop_days, sop_days_between). Previously only called from calc_timeline — direct callers got silent wrong answers for uncovered years. Tests 73→85: Saturday-deadline golden, in-lieu collision, year-coverage on all entry points. Ad-hoc holiday warning. Docstrings.","license":"MIT-0"},"metadata":null,"owner":{"handle":"redkiwi1688-prog","userId":"s17amvshtfxjppkedfhxdzt9s1855xxx","displayName":"redkiwi1688-prog","image":"https://avatars.githubusercontent.com/u/277466521?v=4"},"moderation":null}