# SKILL — lfcs-incl-excl-draft

**Version:** v3 (2026-05-06)
**Previous:** v2 (in `_Log.md`)

## Purpose

Generate `Inclusions-Exclusions.md` — the bid-submission Inclusions / Exclusions / Qualifications draft — from `00-Bid-Prep.md` + `boq-normalised.json` + `Drawing-Index.md`. Output conforms to the **three-tier exclusion architecture** codified in `lfcs-standards/templates/letter-of-offer-structure.md`. Pre-call draft; refined after Tuesday QS call.

## v3 changes (2026-05-06)

- **Output structure now matches Hammond Canal Bridge LoO** — three explicit tiers: Standard Exclusions / Preliminaries Assumptions / Detailed Exclusions+Assumptions+Inclusions.
- **Standard Exclusions pulled verbatim** from `templates/standard-exclusions-boilerplate.md`. Skill must NOT generate, paraphrase, or reorder the boilerplate list.
- **Detailed section split into three sub-sections** in this order: Exclusions → Assumptions → Inclusions (matching Liam's LoO format).
- **Mandatory clauses** added — every output must include (where applicable): discrepancy callout, scope-gap callout, cranage delineation, hire-duration assumption, optional-rate flag.
- **Regression fixture upgraded** — `letter-of-offer-template.docx` (Hammond Canal Bridge) is now the third reference fixture alongside 2602 and 2626.

## Trigger

User says any of:
- "Draft inclusions and exclusions for [job]"
- "Build the incl-excl doc"
- "Run incl-excl on [job]"

Or invoked at end of bid-intake skill chain by cowork-lfcs after `lfcs-precall-questions`.

## Inputs

Required:
- `job_folder` — absolute path

Implicit:
- `00-brief.md`, `00-Bid-Prep.md`, `Drawing-Index.md`, `boq-normalised.json`
- `lfcs-standards/templates/standard-exclusions-boilerplate.md` (mandatory read)
- `lfcs-standards/templates/letter-of-offer-structure.md` (mandatory read)

## Behaviour

1. **Pre-flight** inputs. Abort if any missing.

2. **Read the spec files first** — `letter-of-offer-structure.md` and `standard-exclusions-boilerplate.md`. The output structure is dictated by the spec, not by historical job patterns.

3. **Build STANDARD EXCLUSIONS section** (Tier 1):
   - **Pull verbatim** from `standard-exclusions-boilerplate.md` Section "The list".
   - Do NOT paraphrase, reorder, add items, or remove items. If a boilerplate item is genuinely irrelevant for this job (rare), keep it in Standard Exclusions and add the carve-out as an Assumption in Tier 3.
   - Heading exactly: `## Standard Exclusions`

4. **Build PRELIMINARIES ASSUMPTIONS section** (Tier 2):
   - **Pull verbatim** from `standard-exclusions-boilerplate.md` Section "Standard Preliminaries Assumptions".
   - Same no-paraphrase rule.
   - Heading exactly: `## Preliminaries Assumptions`

5. **Build DETAILED section** (Tier 3) — three sub-headings, in this order:

   ### 5a. `### Exclusions` (project-specific)
   - From BOQ explicit notes: any line marked "Cranage Not Included", "By others", "Supply by others", "Excluded".
   - Material/element supply assumed by others (any "Install" line → corresponding supply is excluded unless confirmed in Pre-Pricing-Grill).
   - Disciplines outside scope (civil, stormwater, services, pavement) — extract from drawing-index `lfcs_scope: reference-only` drawings.
   - Design / professional services (geotech, structural design, hydraulic, pavement, survey).
   - Demolition or removal of any existing concrete structures (default exclusion unless explicitly priced).
   - Concrete supply / pump supply / grout supply / curing compounds / debonding materials / joint materials and dowels (default exclusions for FRP-install jobs).
   - All cranage (default exclusion unless cranage scope explicitly priced).
   - Sub-base placement and compaction (FCR, etc.).
   - Concrete washout area + silica bins + slurry disposal.

   ### 5b. `### Assumptions` (pricing-protective)
   - **Mandatory clause: discrepancy callout** — IF take-off quantities differ from HC's BOQ → include "We have noted discrepancy in quantities from our take off and the pricing schedule. We have updated the submission schedule and highlighted our changes in quantities."
   - **Mandatory clause: scope-gap callout** — IF LFCS noticed missing scope (any `ADDED` rows in the BOQ) → include "We have added {item} at the {location}, which is missing from the pricing schedule."
   - **Mandatory clause: cranage delineation** — IF job involves any lift (Super-T, precast, scaffolding) → include "Assumes cranage will be provided by the client for installation and removal of {scope}."
   - **Mandatory clause: hire-duration assumption** — IF job has hire items (scaffolding, edge protection, walkways) → include "Allows for {N} week hire of {item}. We have provided rates for weekly hire of {item}, if hire period of over {N} weeks is required."
   - **Mandatory clause: optional-rate flag** — IF any `OPTION` rows in BOQ → include "We have provided optional rate for {item}."
   - Working-pattern assumptions (e.g. "Assumes both abutments can be poured at the same time", "Assumes both wing walls can be poured at the same time"). Pull from Pre-Pricing-Grill answers.
   - Discipline-boundary assumptions (e.g. "Assumes Item 7.2.2.3 Bridge deck drainage system to be PVC pipe fixed to the super T flanges and less than 300mm diameter"). Pull from drawing-index ambiguities.

   ### 5c. `### Inclusions` (what LFCS IS pricing)
   - For every `boq-normalised` line where description starts with action verbs ("Place", "Pour", "Fix", "Erect", "Strip", "Install", "Saw-cut", "Demolish") AND row is NOT marked EXCLUDED → add to inclusions.
   - Group by section heading from BOQ (Substructure / Superstructure / Approach Slab / Barrier / etc.) for readability, OR flatten to a single bullet list matching Liam's LoO format. Default: flatten (matches LoO).
   - Add general inclusions: SWMS, daily diary, dockets, photos, ITP sign-offs, TfNSW QA compliance, AS5100 / domain code compliance, inductions, PPE, clean-up.
   - **Class 2 finish (or domain-equivalent finish standard) explicit.** Architectural finishes (honing, etc.) explicitly excluded with the "all other architectural finishes such as honing etc. are excluded" qualifier.

6. **Build QUALIFICATIONS section** — submission caveats (pre-existing v2 logic, retained):
   - NFC drawings clause (if drawings stamped "Issue for Information") — re-rate per VO schedule.
   - Rate validity period (default 30 days, adjustable — must match Letter of Offer validity).
   - Programme assumption.
   - Pile / Super-T / etc. coordination dependencies (if applicable per drawing-index).
   - Existing service location ownership.
   - Specs assumed (concrete grades, reo grades).
   - State LSL levy (NSW: included in rates; confirm head-contract treatment).

7. **Build ITEMS PENDING TUESDAY CALL section** — pull from `Pre-Call-Questions-{date}.md` if exists.

8. **Build SUBMISSION ATTACHMENT LIST** — fixed template (incl-excl, priced BOQ, VO schedule, programme assumption, company info, references, insurances).

9. **Write `{job_folder}/02 - Scope and Pricing/02a - Quotes and Estimates/Inclusions-Exclusions.md`** with frontmatter (`title`, `job`, `created`, `created_by`, `status: draft-pre-call`, `related: [00-brief, 00-Bid-Prep, Pre-Call-Questions, letter-of-offer-structure, standard-exclusions-boilerplate]`).

10. **Append project log + daily note.**

11. **After vault writes commit, invoke `lfcs-airtable-sync mode=audit-only`** for the audit log.

## Files to read (in order)

```
HQ-Vault/_System/CLAUDE.md
HQ-Vault/11_OpsMan_LFCS/Operations/lfcs-standards/templates/letter-of-offer-structure.md  ← v3 mandatory
HQ-Vault/11_OpsMan_LFCS/Operations/lfcs-standards/templates/standard-exclusions-boilerplate.md  ← v3 mandatory
HQ-Vault/11_OpsMan_LFCS/Operations/lfcs-standards/templates/letter-of-offer-template.docx  ← regression fixture
HQ-Vault/11_OpsMan_LFCS/Operations/Jobs/Upcoming/2602 - Dec Projects - Munmorah Bridge/02 - Scope and Pricing/02a - Quotes and Estimates/Inclusions-Exclusions.md  ← regression fixture #1
HQ-Vault/11_OpsMan_LFCS/Operations/Jobs/Upcoming/2626 - Mack Civil - Stormwater Pit EXA01A-08/02 - Scope and Pricing/02a - Quotes and Estimates/Inclusions-Exclusions.md  ← regression fixture #2
{job_folder}/00-brief.md
{job_folder}/00-Bid-Prep.md
{job_folder}/03 - Plans and Specifications/03a - Issued for Construction/Drawing-Index.md
{job_folder}/02 - Scope and Pricing/02b - BOQ and Rate Schedules/boq-normalised.json
{job_folder}/02 - Scope and Pricing/02b - BOQ and Rate Schedules/Pre-Pricing-Grill-*.md  ← if exists, informs Assumptions section
{job_folder}/06 - Correspondence/06c - Meeting Minutes/Pre-Call-Questions-*.md  ← optional, may not exist yet
```

## Airtable behaviour

- **Reads:** `Jobs`, `Bid Line Items` (if any exist for this job's `Active Bid`), `Specifications` (to assert spec compliance lines).
- **Writes:** none directly. Calls `lfcs-airtable-sync mode=audit-only` for the audit log.
- **Idempotency:** N/A.

## Output format

To user:

```
✓ Inclusions-Exclusions.md generated for {job_no}
  Tier 1 — Standard Exclusions: {n boilerplate items}
  Tier 2 — Preliminaries Assumptions: {n boilerplate items}
  Tier 3 — Detailed:
    Exclusions: {n}
    Assumptions: {n}
    Inclusions: {n} (grouped under {sections})
  Mandatory clauses applied: {list — discrepancy / scope-gap / cranage / hire / optional}
  Qualifications: {n}
  Items pending Tuesday call: {n}
  Status: draft-pre-call

  Path: {abs path}

  Workflow:
    1. Refine after Tuesday QS call — confirmed answers move items between Inclusions/Exclusions.
    2. Save final as Inclusions-Exclusions-FINAL.md for submission (do NOT overwrite this draft).
    3. Run lfcs-letter-of-offer-draft to generate the cover letter using these inclusions/exclusions.
```

## Hard rules

- **Boilerplate is verbatim.** Standard Exclusions and Preliminaries Assumptions sections must match `standard-exclusions-boilerplate.md` word-for-word. No paraphrasing, no reordering. If a boilerplate item is wrong for the job, that's a Tier-3 carve-out, not a Tier-1 edit.
- **Three-tier structure is non-negotiable.** Output must have the exact section headings and order from `letter-of-offer-structure.md`.
- **Mandatory clauses fire when their trigger condition is met.** No silent omissions. If discrepancy/scope-gap/cranage/hire/optional clauses don't apply, the skill output explicitly notes "N/A — no {trigger} in this job".
- **Inclusions trace to BOQ lines.** Every inclusion item references the BOQ section that justifies it. No pad inclusions.
- **Exclusions are explicit.** Better to over-exclude (and have QS push back) than to leave a costly item ambiguous.
- **Status frontmatter is `draft-pre-call`** until Rocky changes it to `submitted`.
- **Append-only.** If file exists, abort + ask user.
- **Regression fixtures:** running on 2602 inputs must reproduce or improve `Inclusions-Exclusions.md`. Running against the Hammond Canal Bridge BOQ must reproduce the LoO's exclusion/assumption/inclusion structure.
- **Vault markdown is source of truth.** If `lfcs-airtable-sync` write fails, this skill's run is still considered successful — log to `_System/Conflicts.md` and continue. Never block on Airtable.

## Dependencies

- `lfcs-bid-prep-doc` upstream
- `lfcs-precall-questions` (optional — informs items-pending section)
- `lfcs-pre-grill` (informs Assumptions section)
- `templates/standard-exclusions-boilerplate.md`
- `templates/letter-of-offer-structure.md`
- `templates/letter-of-offer-template.docx` (regression fixture)
- 2602 + 2626 `Inclusions-Exclusions.md` (regression fixtures)

## Failure modes

| Failure | Detection | Recovery |
|---|---|---|
| Missing required inputs | Pre-flight | Abort + name missing skill |
| Missing boilerplate file | Pre-flight | Abort + tell Rocky to restore from git |
| File exists | Pre-check | Abort + ask user |
| Pre-Call-Questions absent | Optional | Generate without items-pending refinement; flag in output |
| BOQ has zero LFCS-scope action lines | Per-line filter | Empty inclusions section + flag in confidence section |
| Mandatory clause trigger condition unclear | Per-clause check | Flag as TBC in Assumptions; ask Rocky pre-write |
