# LFCS Skill Catalog — Change Log

> Append-only. One line per skill change. Format:
> `- YYYY-MM-DD HH:MM — {agent} — {skill} v{N} — {change} — reason: {one-liner}`

## 2026-05-07 — cowork-lfcs Phase 8 — defend-every-line gaps from 2629 Erskine session

- 2026-05-07 PM — cowork-lfcs — `lfcs-bid-prep-doc/SKILL.md` v3 → v4 — added: (a) `boq_source_mode` input branch (`hc-supplied` vs `lfcs-built-from-drawings` for TCE-style no-BoQ jobs), (b) `similar_job_cost_summary` input + cross-contamination gate (other-job pricing-history excluded when similar-job named), (c) `job_type` input drives Prelims defaults (bridge / industrial-brownfield-slab / pit-tfnsw-dayworks / commercial-slab), (d) MANDATORY Section 9b Temporary Works/Safety/Edge protection/Bar caps emitted on every job (handrail $35/lin-m + bar caps $850 lump + vapour barrier labour + temp scaffolding defaults), (e) `mixed_support_assumption_split` flag for slabs with mixed suspended-on-formwork vs suspended-on-natural-ground portions, (f) `reo_qty_source` flag (vision-estimate / measured-take-off / boq-supplied / back-calculated) with ±15% sensitivity row when non-measured, (g) margin model clarified as 16.55% baked-per-line default (HCB + Munmorah practice; separate redundancy line reserved for pit-tfnsw-dayworks mode), (h) defend-every-line output requirement on every BoQ row (drawing ref + qty derivation + rate derivation math + similar-job productivity check + risk flag) — reason: 2629 Erskine session (Rocky pricing walkthrough 2026-05-07) surfaced that v3 produces a tender total but doesn't break it down line-by-line in a defendable way; specific gaps Rocky flagged: (1) handrails + star picket bar caps weren't auto-included, (2) "use only what i gave you" cross-contamination instruction wasn't a first-class skill input, (3) Eastern Creek productivity reference wasn't a first-class similar-job input — derivation was implicit, (4) Mob/demob defaults were bridge-job ($5,827) when industrial brownfield is $3,500 ($3,000 demob), (5) margin/redundancy model ambiguous between Phase 6 pricing-checklist and submitted-bid practice. v4 fixes all five.
- 2026-05-07 PM — cowork-lfcs — `pricing-checklist.md` Phase 6 — pending update — reason: reconcile "15% redundancy on subtotal" line with practice (HCB + Munmorah recon both show 16.55% baked-per-line, no separate redundancy). Tracked in TaskList #8.

## 2026-05-03 — Phase 1 build session

- 2026-05-03 22:30 — claude-code-coo — `_README.md` v1 — created — reason: stand up catalog scaffolding per LFCS Bid System plan Phase 1
- 2026-05-03 22:30 — claude-code-coo — `_Log.md` v1 — created — reason: append-only catalog change log per HQ gap analysis Section 8 additional gaps
- 2026-05-03 22:35 — claude-code-coo — `lfcs-job-scaffold/SKILL.md` v1 — created — reason: Phase 1 MVP, generates canonical 11-section folder
- 2026-05-03 22:38 — claude-code-coo — `lfcs-drawing-extract-text/SKILL.md` v1 — created — reason: Phase 1 MVP, codifies 2602 PoC text-extract pass
- 2026-05-03 22:42 — claude-code-coo — `lfcs-boq-parse/SKILL.md` v1 — created — reason: Phase 1 MVP, xlsx → boq-normalised.json
- 2026-05-03 22:45 — claude-code-coo — `lfcs-bid-prep-doc/SKILL.md` v1 — created — reason: Phase 1 MVP, generates 00-Bid-Prep.md from extracts
- 2026-05-03 22:48 — claude-code-coo — `lfcs-precall-questions/SKILL.md` v1 — created — reason: Phase 1 MVP, generates Pre-Call-Questions-{date}.md
- 2026-05-03 22:51 — claude-code-coo — `lfcs-incl-excl-draft/SKILL.md` v1 — created — reason: Phase 1 MVP, drafts Inclusions/Exclusions/Qualifications

## 2026-05-04 — LFCS-Operations Airtable adoption pivot

- 2026-05-04 PM — cowork-lfcs — `_README.md` v2 — updated SKILL.md template to require `## Airtable behaviour` section — reason: LFCS-Operations base adopted; every skill must declare reads/writes/idempotency
- 2026-05-04 PM — cowork-lfcs — `chat-bootstrap/SKILL.md` v2 — added step 2: load LFCS-Operations Airtable schema via MCP `list_tables_for_base('appE43UvTyARe5oJs')` — reason: cache table IDs + primary fields for downstream skill use
- 2026-05-04 PM — cowork-lfcs — `lfcs-airtable-sync/SKILL.md` v1 — created — reason: universal vault-md→Airtable adapter; single source of write logic; called as final step by every other skill; per-table mapping appendix included
- 2026-05-04 PM — cowork-lfcs — `lfcs-job-scaffold/SKILL.md` v2 — added Airtable behaviour section (writes Jobs upsert) + sync-as-final-step Behaviour 9 + non-blocking Hard rule — reason: spec-compliance, vault-as-SOR
- 2026-05-04 PM — cowork-lfcs — `lfcs-drawing-extract-text/SKILL.md` v2 — added Airtable behaviour (writes Drawings + Drawing Elements with Confidence=Medium for text-pass) + sync-as-final-step Behaviour 7 + non-blocking Hard rule — reason: same
- 2026-05-04 PM — cowork-lfcs — `lfcs-boq-parse/SKILL.md` v2 — added Airtable behaviour (no direct writes Phase 1; downstream consumes JSON) + sync-as-audit-only Behaviour 11 + non-blocking Hard rule — reason: same
- 2026-05-04 PM — cowork-lfcs — `lfcs-bid-prep-doc/SKILL.md` v2 — added Airtable behaviour (reads Jobs/Drawings/Drawing Elements/Specifications/RFIs; updates Jobs.Notes) + sync Behaviour 6 + non-blocking Hard rule — reason: same
- 2026-05-04 PM — cowork-lfcs — `lfcs-precall-questions/SKILL.md` v2 — added Airtable behaviour (reads only) + sync-as-audit-only Behaviour 9 + non-blocking Hard rule — reason: same
- 2026-05-04 PM — cowork-lfcs — `lfcs-incl-excl-draft/SKILL.md` v2 — added Airtable behaviour (reads only) + sync-as-audit-only Behaviour 9 + non-blocking Hard rule — reason: same

## 2026-05-04 PM late — cowork-lfcs Phase 6 — transcript-gap fixes (per-job CLAUDE.md + project-init orchestrator)

- 2026-05-04 PM late — cowork-lfcs — `lfcs-job-scaffold/SKILL.md` v3 — added Behaviour step 5b (per-job CLAUDE.md generation: job snapshot + folder map + live-registers-go-to-source rule + Airtable pointers + skill routing + job-specific notes + Rocky-query handlers + source files in vault) + Files-to-read updated with 2602 CLAUDE.md as regression template — reason: closes transcript-gap #1 (per-job AI context that AI reads before any task on the job, per the YouTube transcript Rocky shared 2026-05-04)
- 2026-05-04 PM late — cowork-lfcs — `2602/CLAUDE.md` — created concrete instance for Munmorah Bridge (Job rec recrfQwVeTUAUBl3s, Active Bid recGdAkZHQklVAgUR $407,870 ex GST CCC v1) — reason: bring existing job up to v3 standard
- 2026-05-04 PM late — cowork-lfcs — `2626/CLAUDE.md` — created concrete instance for Mack Civil Stormwater Pit (Job rec recoCFU16Ugn9rqnM, Active Bid recJFeA83SRGOne1s $43,143 ex GST CCC rev5 FRP-install-only) — reason: same
- 2026-05-04 PM late — cowork-lfcs — `lfcs-project-init/SKILL.md` v1 — created orchestrator skill — reason: closes transcript-gap #4 (single-skill "open folder, run one skill, get full setup" pattern). Behaviour: 10 steps invoking lfcs-job-scaffold → pause-check for source files → lfcs-drawing-extract-text → lfcs-boq-parse → lfcs-bid-prep-doc → lfcs-precall-questions → lfcs-incl-excl-draft → audit-only sync → log + output. Idempotent re-runs; clean halt at step 2 if source files not yet dropped; explicitly hands off to Pre-Pricing-Grill (per pricing-checklist.md Phase 1) + vision-pass (Phase 0) — does NOT run those itself.

## 2026-05-04 PM late — cowork-lfcs Phase 7 — concept notes (Track A) + spec-mirror MD (Track B)

- 2026-05-04 PM late — cowork-lfcs — `lfcs-standards/concepts/` folder — created — reason: Phase 7 Track A (cross-cutting concept notes for pattern recognition across jobs). Houses pattern docs that aggregate lessons from multiple jobs into one reusable reference, wikilinked from per-job CLAUDE.md Patterns sections.
- 2026-05-04 PM late — cowork-lfcs — `concepts/TfNSW-R0220-pit-pattern.md` v1 — created — reason: Phase 7 Track A. Codifies FRP-install-only default supply boundary, R0220 Notes (1-9 verbatim), R11+R53 spec compliance burden, risk tags, sensitivity table, key TfNSW Standard Drawings, pricing pattern. Canonical example wikilinked: 2626. Applies to: any LFCS bid for TfNSW dayworks pit job.
- 2026-05-04 PM late — cowork-lfcs — `concepts/TfNSW-bridge-FRP-subcontract-pattern.md` v1 — created — reason: Phase 7 Track A. Codifies TCE supply convention (concrete + reo + bearings + Super-Ts + parapets all head-contractor), props/falsework EXCLUDED default, cranage EXCLUDED default, IFI→IFC drift handling, AS5100 (2017) governance, productivity calibration. Canonical example: 2602. Applies to: any LFCS bridge FRP package as subcontractor.
- 2026-05-04 PM late — cowork-lfcs — `concepts/Defensible-for-variations-posture.md` v1 — created — reason: Phase 7 Track A. Cross-cutting pricing strategy concept — when to use Rate Card V1.7 hourly basis (defensible) vs internal cost basis (competitive). Decision tree, worked examples from 2602 + 2626 rev3-5 + Hornsby. Applies to: all jobs (universal).
- 2026-05-04 PM late — cowork-lfcs — `lfcs-job-scaffold/SKILL.md` v4 — added Patterns section to step 5b CLAUDE.md generation + Patterns lookup table mapping job_type → applicable concept-note wikilinks — reason: Phase 7 Track A. Per-job CLAUDE.md now wikilinks to applicable concepts based on job_type input (stormwater-pit / bridge / footing / etc.).
- 2026-05-04 PM late — cowork-lfcs — `2602/CLAUDE.md` Patterns section added — backfilled per Track A (TfNSW Bridge FRP Subcontract Pattern + Defensible-for-variations posture + pricing-checklist) — reason: bring existing job up to v4 standard.
- 2026-05-04 PM late — cowork-lfcs — `2626/CLAUDE.md` Patterns section added — backfilled per Track A (TfNSW R0220 Pit Pattern + Defensible-for-variations posture + pricing-checklist) — reason: same.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-standards/specs/` folder — created — reason: Phase 7 Track B (spec-mirror MD for fast AI ingest). Houses `{spec_code}-summary.md` files for every spec PDF that downstream skills query instead of re-reading the multi-page PDF.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-spec-summarise/SKILL.md` v1 — created — reason: Phase 7 Track B (closes transcript-gap #2). Universal spec PDF → MD summary adapter. Inputs: spec_pdf_path OR job_folder (auto-discover). Outputs: structured MD with frontmatter + Hold Points + Witness Points + Identified Records + Mandatory clauses + Material specs + Workmanship + Inspection + Gotchas + Cross-references + Application-to-LFCS-scope. Updates Airtable Specifications.Notes via lfcs-airtable-sync. Idempotent.
- 2026-05-04 PM late — cowork-lfcs — `specs/TfNSW-R11-Ed5Rev8-PeakhurstOct2024-summary.md` v1 — created (starter-summary status, manual demonstration; full skill-driven extraction pending PDF re-read) — reason: regression template for `lfcs-spec-summarise` skill output shape. R11 Hold Points (3 + cross-ref), Witness Points (3), Identified Records (5), Mandatory clauses (4), Material specs, Workmanship/tolerances, Inspection+testing, 5 Gotchas, Cross-references to R53 + R0220 + R44 + R71, Application to LFCS scope (~1.5 sup-days admin per pit + $500 Engineer Cert per pour). Wikilinked from TfNSW-R0220-pit-pattern + 2626 CLAUDE.md.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-project-init/SKILL.md` v2 — added Behaviour step 3.5 — reason: Phase 7 Track B. After lfcs-drawing-extract-text (step 3), invoke lfcs-spec-summarise to auto-discover spec PDFs in 03a + generate MD summaries. Skips silently if no specs found. Pattern matches FRBR_R*, R0*, B*, AS*, SydneyWater_*.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-project-init/SKILL.md` v3 — added Behaviour step 1.5 (uploads-to-vault routing) + new Inputs `uploads_path` + `auto_route_uploads` (default true) + workflow note covering both upload-via-Cowork-chat AND files-already-in-vault paths + new Hard rule "always confirm before moving + COPY not MOVE + idempotent re-runs hash-check existing target files" — reason: closes the "drag-and-drop into Cowork chat" workflow gap surfaced by Rocky 2026-05-04 PM late. Step 1.5 detects files in Cowork uploads folder, classifies by extension + filename pattern (xlsx → 02b BOQ; FRBR_R*/R0*/B*/AS*/SW spec patterns → 03a + flagged for spec-summarise; RFI* → 06b; other PDFs → 03a drawings; .docx → 06a or 01a per ask; .zip → unzip if practical else 02a manual unpack), shows ONE proposed-routing table for confirm, copies into vault on confirm. No-op for non-Cowork surfaces (CC CLI). New jobs now ingest end-to-end without requiring Rocky to manually move files. Workflow A (Cowork chat upload) + Workflow B (vault drop) both handled by same orchestrator.

## 2026-05-04 PM late — cowork-lfcs Phase 8 — lfcs-drawing-extract-vision unblocked by OAuth Max sub

- 2026-05-04 PM late — cowork-lfcs — `lfcs-drawing-extract-vision/SKILL.md` v1 — created — reason: was on v2/future-skills list as "gated on Anthropic API key + budget" per LFCS Bid System Plan §6 original recommendation. Rocky surfaced 2026-05-04 PM late that his Claude Code OAuth on Max subscription covers the vision capability (same Claude vision model, no separate API key needed) — that's also true of Cowork sessions. Both surfaces have native PDF Read tool support. Skill rewritten without pdftoppm + Python dispatch — straight Read tool loop with structured per-page extraction prompt. Augments existing Drawing-Index.md with `vision_findings:` blocks per drawing (preserves text-pass content for source traceability). Upserts Airtable Drawing Elements rows: Confidence Medium → High where vision validates; new rows for elements vision found that text-pass missed; Needs review flag where vision differs from text. Idempotent. Page limit default 20 (multi-pass for large packs via `vision_pass_status: partial` tracking). Skips lfcs_scope=reference-only drawings unless `--include-reference`. Mandatory Phase 0 vision-pass complement to text-pass; closes the "vision pass blocked" caveat that's been carried since 2026-05-03 on every Drawing-Index.md output. **Also unblocks lfcs-boq-cross-check** (was waiting for vision quality to be reliable). 2602 PDFs already in vault from Phase 7 → ready to demo on 2602's 7 drawings (3 ST structural + 4 CI civil) when Rocky says go.

## 2026-05-04 PM late — cowork-lfcs — 2629 Erskine Park WWTP Slab regression run

- 2026-05-04 PM late — cowork-lfcs — `lfcs-project-init/SKILL.md` v3 — invoked on 2629 (3rd production run after 2627 St Clares + 2628 Vaughan) — reason: new-job intake; private commercial WWTP slab (Cleanaway/Henry&Hymas/TBC head contractor). Files dropped via Downloads (not Cowork uploads) so step 1.5 was effectively manual cp. Steps 1+5b+6+7+8(skip — no specs)+9 ran clean. Step 4 (boq-parse) skipped — no xlsx supplied. Steps 5/6/7 (bid-prep + precall + incl-excl) generated as drafts pre-Pre-Pricing-Grill. Step 8 audit-only Airtable sync deferred to follow-up session (Drawings + Elements). Outputs: full 11-section folder + 7 MD files + 2 PDFs in 03a, Jobs row in Airtable. Demonstrates orchestrator works on the "no BOQ + no spec" intake variant — handled gracefully via RFI-flagging in 00-brief + Pre-Call-Questions + Inclusions-Exclusions qualifications. Patterns wikilink correctly auto-resolved via job_type=slab → Defensible-for-variations posture only (no TfNSW pattern applies; new pattern candidate flagged in CLAUDE.md).
- 2026-05-04 PM late — cowork-lfcs — `lfcs-drawing-extract-text/SKILL.md` v2 — invoked on 2629 PDFs — reason: extract drawing list + per-drawing structured data from Civil (17 sheets) + Structural (6 sheets) packages. Used pdftotext.exe (Git for Windows shim — `C:/Program Files/Git/mingw64/bin/pdftotext.exe`) since pdftoppm not on Windows. Per-page targeted extraction with -f/-l flags + grep filters for slab/reo/section/walkway data captured all critical specs (270mm slab @ 40MPa, 500x1200 beams, 750dia piles @ 32MPa, BW1 bund walls, sludge platform steel, walkway pad footings + steel framing, reo schedule). Drawing-Index.md output uses 2602 template format (YAML frontmatter per sheet + Shows + LFCS-relevant tags + Risks). Confidence=Medium throughout (text-pass; vision-pass pending Rocky go).
- 2026-05-04 PM late — cowork-lfcs — `lfcs-bid-prep-doc/SKILL.md` v2 — invoked on 2629 — reason: generate 00-Bid-Prep.md from 00-brief + Drawing-Index. Quantity table left as TBC pending take-off (no BOQ supplied). Risk register expanded to 12 items reflecting "no BOQ + no spec + 90% Design + Eastern Creek scope-split + active operational WWTP" risk profile.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-precall-questions/SKILL.md` v2 — invoked on 2629 — reason: generate Pre-Call-Questions-2026-05-06.md targeted at TBC head contractor. 9 sections, ~50 Qs covering scope boundary table (12 items) + spec RFI + BOQ RFI + site access/induction (active WWTP) + programme + commercial + Eastern Creek pattern + submission requirements + catch-all.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-incl-excl-draft/SKILL.md` v2 — invoked on 2629 — reason: generate Inclusions-Exclusions.md draft pre-grill. 9 inclusions, 25 exclusions (heavy on by-others to leave room for variations on the "blue/pink/tank" scope-split pattern), 10 qualifications (rate validity 30 days, 90% Design drift variation clause, Eastern Creek annotation reference, defensible-for-variations posture explicitly called out). Running assumptions log embedded.
- 2026-05-04 PM late — cowork-lfcs — `lfcs-airtable-sync/SKILL.md` v1 — partial invocation — reason: Jobs row upserted (`tblcL2EX2w34c1VPe`, performUpsert+fieldIdsToMergeOn=[fldyqepkJiEsUnqUW Job Number]); Drawings + Drawing Elements deferred to follow-up session post-take-off (~10 Drawings rows + ~30 Elements rows expected). Per Phase 2 hard rule: Airtable failure non-blocking; partial success here logged, orchestrator output still considered successful.

- 2026-05-04 PM late — claude-code-coo — `lfcs-drawing-extract-vision/SKILL.md` v1 — invoked on 2629 — reason: deep vision scan on 5 priority drawings (S2.00 + S2.01 + S2.05 + S3.00 + C103). Poppler installed locally → Read tool native PDF support working. 7 vision-only critical finds flagged (geometry, mixed support, schedule corrections, walkway spec extracted, drafter typos). `vision_findings:` YAML blocks appended to Drawing-Index.md per drawing (text-pass content preserved per augment-only rule). Civil-context drawings deferred per brief contingency. Airtable Drawing Elements upsert deferred (vault SOR, non-blocking).
- 2026-05-04 PM late — claude-code-coo — pricing pack build (no new skill — applied pricing-checklist + Defensible-for-variations + 2627/2602 lessons via custom Python build script `scripts/lfcs/build_2629_pricing.py`). 7 deliverables: Pre-Pricing-Grill PDF + Take-Off xlsx + Rate-Buildup xlsx + Tender-Summary xlsx + Tender-Summary-Cover PDF + Inclusions-Exclusions PDF + Submission-Cover PDF. All branded (navy + red, header/footer, ABN). Tender $219,800 ex GST. Drive uploads via gws CLI + permission grants per `feedback_lfcs_drive_share_and_ab.md`.
- 2026-05-05 11:30 — claude-code-coo — exercised lfcs-airtable-sync procedure (in-line, not via skill invocation) for 2602 Bid status update + Job Drive folder URL + Active Bid pointer + 5 prelim line item Notes ("FOLDED INTO REV3"). 7 records updated, 0 created, 0 failed. Source: Round 9 submission-pack format pass. → [[_Brain/AB-Test-Tracker#Round 9]]

## 2026-05-06 — claude-code-opsman — lfcs-pre-grill v1

Codified Phase 0 Pre-Pricing Grill from lfcs-standards/pricing-checklist.md as a callable skill. Inserted into bid-intake pipeline as step 4.5 (after BoQ parse, before bid-prep-doc). Aborts pricing on any TBC answer. Per Wave 3.2 of upgrade plan. Reason: 5+ revisions on 2626 + 4 A/B rounds on 2602 traced to grill not being run upfront; now mandatory.
- 2026-05-06 HH:MM — cowork (HQ-side) — cowork-session-writeback v1 — SKILL.md scaffolded — reason: post Friend-Vault-Audit-2026-05-06 Section 5 cross-pollination — adopt Hasibul's auto-Chat-Diary pattern to close gap where manual daily-note appends miss sessions; trigger 1 (session-end hook) env-wiring TBC; trigger 2 (explicit) live; trigger 3 (scheduled curator) pending cadence wiring

## 2026-05-06 23:12 — cowork-lfcs — Hammond Canal Bridge codification: incl-excl v3 + bid-prep v3 + new lfcs-letter-of-offer-draft v1

- 2026-05-06 23:12 — cowork-lfcs — `lfcs-standards/templates/` folder — created — reason: codify Hammond Canal Bridge submission ($434,462 ex GST, May 2026) as 3rd canonical reference fixture per Rocky 2026-05-06 23:00 ("from the QS who knows what they're doing — should be standard"). Houses: letter-of-offer-template.docx (verbatim Liam LoO) + boq-pricing-schedule-pattern.xlsx (HCB priced BOQ) + standard-exclusions-boilerplate.md (10 standard exclusions + 6 prelim assumptions, verbatim) + letter-of-offer-structure.md (load-bearing spec: 7-section LoO structure + 5 mandatory clauses + 7 BOQ hygiene patterns + regression test). Templates/ becomes 3rd leg of standards stool alongside concepts/ + specs/. HCB joins 2602 + 2626 as canonical fixture trio.
- 2026-05-06 23:12 — cowork-lfcs — `lfcs-incl-excl-draft/SKILL.md` v2 → v3 — three-tier exclusion architecture (Standard Exclusions / Preliminaries Assumptions / Detailed Exclusions+Assumptions+Inclusions matching Liam HCB LoO format) + boilerplate verbatim from `templates/standard-exclusions-boilerplate.md` (no paraphrasing) + 5 mandatory clauses with trigger conditions (discrepancy / scope-gap / cranage / hire-duration / optional-rate) — reason: pre-v3 outputs were free-form prose; v3 forces conformance to LoO format so downstream `lfcs-letter-of-offer-draft v1` can compose without re-thinking structure. Regression fixtures upgraded to: 2602 incl-excl + 2626 incl-excl + HCB letter-of-offer-template.docx.
- 2026-05-06 23:12 — cowork-lfcs — `lfcs-bid-prep-doc/SKILL.md` v2 → v3 — added 5 new output sections (6 ADDED rows for missing scope / 7 cross-reference candidates `included in Item X.X.X` / 8 Rate Only items / 9 OPTION rows / 10 cranage delineation per-lift) — reason: these feed the 5 mandatory LoO clauses in v3 incl-excl + new LoO drafter. Cranage section explicit per-lift because "cranage is the #1 source of bridge-job disputes" per HCB pattern. Regression fixture #3 added: HCB BOQ.
- 2026-05-06 23:12 — cowork-lfcs — `lfcs-letter-of-offer-draft/SKILL.md` v1 — created — reason: closes the bid-submission pipeline (was previously manual docx authoring; HCB LoO took Liam ~hours per bid). Inputs: job_folder + final_price_ex_gst + recipient_company + recipient_address + (optional) validity_days/submission_date/package_name. Outputs: Letter-of-Offer-{job}-{date}.docx (signed-ready, matches HCB template formatting via docx skill) + .md shadow (vault search/diff) + Airtable Bids upsert (Status=Submitted-Draft + Total Ex GST + LoO Generated date). Pre-flight: incl-excl status≠draft-pre-call, bid-prep v3 sections 6-10 populated, price≠TBC. All 5 mandatory clauses fire on trigger condition (no silent omissions). Number-to-words via num2words. Regression test: HCB inputs (BOQ + bid-prep + incl-excl + price=434462 + recipient="The Civil Experts Pty Ltd") must reproduce letter-of-offer-template.docx line-for-line — drift in section order / clause wording / signature / lump-sum format / exclusion list = blocking issue.
