Coordinates the transition from construction delivery to operating asset. Fires on Procore schedule_milestone `temp_co_received` or `final_co_received` (with units_ready_for_lease >= 1), or on AppFolio C/O recording (Handoff 8 in reference/connectors/_core/stack_wave4/lifecycle_handoffs.md). Drives TCO/CO recording, punchlist state review, retainage release schedule, rent-roll transition from lease-up plan to active, construction-sub vs operating-vendor rationalization, warranty package handoff, system as-built documentation acceptance, capex project closeout in Intacct, and dev_project_crosswalk closure (procore_project_id -> property_id linkage). Triggers lease_up_first_period once the AppFolio unit roster is active. Writes back to master_data crosswalks via approval. Handoff is not complete until every item lands within the tolerance band and development_lead signs off.
Turn a Procore construction project at TCO/CO into an operating, leasable
asset with auditable handoff completion across AppFolio (operating),
Intacct (financial closeout), master data crosswalks (data platform), the
vendor master (construction subs out, operating service vendors in), and the
warranty + as-built documentation registry. The workflow does not execute
setup steps in vendor systems; it composes the handoff checklist, validates
each item's completion against the source-of-truth matrix, and routes gated
items through workflows/owner_approval_routing. Handoff is not complete
until every item is within the tolerance band on
reconciliation_tolerance_band.yaml and development_lead has signed off.
On completion, workflows/lease_up_first_period is triggered to pick up
the first operating period for the newly-active property.
schedule_milestonetemp_co_receivedfinal_co_receivedunits_ready_for_lease >= 1reference/connectors/_core/stack_wave4/lifecycle_handoffs.mdlifecycle_stage=pre_takeoverconstruction| Input | Type | Required | Notes |
|---|---|---|---|
| Procore project record (at or past TCO) | record | required | must include construction_project_id, dev_project_id (parent), schedule_milestone (temp_co_received or final_co_received), punchlist_items[], closeout_documents[], retainage_release_schedule, warranty_package_ref, as_built_package_ref |
Canonical development_project, construction_project, capex_project objects | records | required | per source_of_truth_matrix.md: procore primary for construction_project; dealpath seeded development_project |
AppFolio property record (at pre_takeover or equivalent) | record | required | reserved property_id from earlier post_ic_property_setup (if applicable) or dev-specific setup |
| Unit roster (as-built) | table | required | must match construction drawings exactly; unit_count_total, unit_count_rentable, nrsf_total populated per unit |
| Lease-up pricing policy draft | record | required | pricing policy + concession band for opening lease-up; ties into workflows/market_rent_refresh |
| Retainage release schedule | record | required | trade, amount held, release trigger, target release date |
| Warranty package | package | required | GC warranty, manufacturer warranties, effective dates, start-date triggers |
| As-built documentation package | package | required | drawings, specifications, systems manuals, commissioning reports |
| Construction sub vendor list | list | required | subs to be archived / flagged as non-operating |
| Operating service vendor list | list | required | new operating vendors to be onboarded (turf, pest, pool, waste, HVAC service, etc.) |
| Capex closeout package | package | required | final cost ledger, change-order summary, retainage status, contingency closeout |
| Output | Type | Shape |
|---|---|---|
| Delivery handoff checklist | handoff_checklist | per-item status (complete, in_progress, blocked, waived_with_approval) with owner, due-date, tolerance-band check |
| Delivery completeness scorecard | kpi_review | delivery_handoff_completeness_score (proposed) + per-workstream completion % + lag days |
| Blocker memo | memo | narrative with cited blocker ids and source-of-truth matrix references |
| Crosswalk row draft / closure | record | proposed property_master_crosswalk.yaml transition (pre_takeover -> lease_up), dev_project_crosswalk.yaml closure (procore_project_id -> property_id linkage), capex_project_crosswalk.yaml closeout, vendor_master_crosswalk.yaml additions/retirements |
| ApprovalRequest: handoff sign-off | record | row 7 if lag exceeds band; otherwise a terminal sign-off |
| Unresolved exception list | checklist | items routed to master_data/unresolved_exceptions_queue.md |
| lease_up_first_period trigger payload | record | event payload consumed by workflows/lease_up_first_period on completion |
asset_class, segment, form_factor, lifecycle_stage (development or construction at trigger, transitioning to lease_up), management_mode, market, property_id, construction_project_id, dev_project_id, org_id. jurisdiction required for C/O recording and any permitting signoffs.
temp_co_received or final_co_received with units_ready_for_lease >= 1) per Handoff 8 in lifecycle_handoffs.md. Alternatively consume the AppFolio C/O record for the property. If both arrive, reconcile via stack_reconciliation_matrix.md::recon_pc_to_af_at_delivery. If neither trigger is valid, refuse.development_project, construction_project, capex_project, placeholder property, and the unit roster drafted from construction drawings. Per source_of_truth_matrix.md, Procore is primary for construction_project and schedule_milestone; AppFolio is primary for property once operating.partial_delivery and run in partial_mode_behavior until final CO recorded.punchlist_closeout_rate (existing; see _core/metrics.md). Outstanding p1/p2 punchlist items block operating handoff for units with those items; cite punchlist_sla__middle_market.csv for SLA band.retainage_release_lag_days (proposed). Outside-band items flagged for reporting_finance_ops_lead.appfolio_pms.dq_rules.yaml::ap_lease_up_setup_complete. Mismatch is a blocker.vendor_master_crosswalk.yaml. For each new operating vendor: run identity resolution per master_data/identity_resolution_framework.md; emit proposed additions or merges. Count goes to vendor_rationalization_count (proposed, shared with acquisition_handoff).cco_to_first_lease_days (proposed: true) — days from final CO recording to first executed lease on the property; grain=property, unit=days, time_basis=event_stamped.tco_to_first_unit_ready_days (proposed: true) — days from temp CO to first unit marked ready-to-lease in AppFolio; grain=property, unit=days.delivery_handoff_completeness_score (proposed: true) — weighted completion of the delivery handoff checklist; grain=property, time_basis=as_of_date.punchlist_closeout_rate (existing; see _core/metrics.md) — percent of punchlist items closed at handoff; grain=project.retainage_release_lag_days (proposed: true) — days between release trigger met and actual release; grain=project, unit=days.warranty_package_completeness (proposed: true) — percent of required warranty docs on file; grain=property, unit=percent.as_built_doc_completeness (proposed: true) — percent of required as-built docs on file; grain=property, unit=percent.vendor_rationalization_count (proposed: true) — count of vendor master rows rationalized at delivery handoff (construction subs archived + operating vendors onboarded); grain=property.capex_closeout_lag_days (proposed: true) — days between final sign-off target and capex closeout posted in Intacct; grain=project, unit=days.dev_project_crosswalk_closure_lag_days (proposed: true) — days between delivery trigger and dev_project_crosswalk.yaml row closure; grain=project, unit=days.lease_up_pace_post_delivery (existing; see _core/metrics.md) — units leased per week after TCO; surfaced as the downstream handoff metric into lease_up_first_period.Proposed metrics will be lifted into _core/metrics.md in a dedicated change-log entry before the workflow is promoted beyond draft.
reference/connectors/_core/stack_wave4/lifecycle_handoffs.md — handoff definitions (Handoff 8).reference/connectors/_core/stack_wave4/source_of_truth_matrix.md — primacy rules for development_project, construction_project, capex_project, property, schedule_milestone.reference/connectors/_core/stack_wave4/stack_reconciliation_matrix.md — recon_pc_to_af_at_delivery blocker-severity check.reference/connectors/adapters/procore_construction/manifest.yaml, dq_rules.yaml, reconciliation_checks.yaml — source shape; pc_to_af_handoff check cited.reference/connectors/adapters/appfolio_pms/manifest.yaml, dq_rules.yaml — ap_lease_up_setup_complete rule cited.reference/connectors/adapters/sage_intacct_gl/manifest.yaml — GL primary for capex posted spend and closeout.reference/connectors/adapters/dealpath_deal_pipeline/manifest.yaml — Dealpath governance signoffs for development project.reference/connectors/master_data/property_master_crosswalk.yaml, dev_project_crosswalk.yaml, capex_project_crosswalk.yaml, vendor_master_crosswalk.yaml — crosswalks the workflow proposes rows for / closes.reference/connectors/master_data/identity_resolution_framework.md, survivorship_rules.md — identity and survivorship policy (specifically dev_project_default and capex_project_default).reference/normalized/schemas/reconciliation_tolerance_band.yaml — handoff-lag bands.reference/normalized/approval_threshold_defaults.csv — approval thresholds (rows 4, 7, 11, 17, 19).reference/normalized/punchlist_sla__middle_market.csv — punchlist SLA band for p1/p2 items at delivery.handoff_lag_threshold_days escalates to development_lead -> asset_mgmt_director and opens approval_request row 7.master_data/unresolved_exceptions_queue.md and routes to row 19.development_lead + legal counsel per row 17.development_lead + construction_manager per row 4 (safety-critical maintenance decision). Workflow runs in partial_mode_behavior.reporting_finance_ops_lead per row 11 (change-order threshold class).reporting_finance_ops_lead.development_lead_handoff_signoff — terminal approval that marks delivery handoff complete. Required for every delivery. Row 7 policy.capex_project_closeout_in_intacct — row 11 (major CO / capex closeout) for the final capex posting in Intacct.warranty_package_acceptance — row 17 (policy-marked, legal review of warranty terms prior to acceptance).lease_up_pricing_policy_seeded — row 13 (pricing policy above / at policy) for the opening lease-up pricing structure.workflows/owner_approval_routing per survivorship_rules.md.lease_up in AppFolio without Procore TCO/CO primacy confirmation. Fix: recon_pc_to_af_at_delivery is a blocker-severity check; workflow halts on mismatch.ap_lease_up_setup_complete dq rule gates; refuse until reconciled.warranty_package_acceptance approval gate.capex_closeout_lag_days tracked; row 11 approval required.vendor_master_conflict escalation.as_of_date references older than the TCO/CO date without acknowledgement. Fix: banner required per overlay staleness rule.workflows/acquisition_handoff.development_project carries union status across siblings.partial_mode_behavior. TCO-proven units with no open p1/p2 items may be marked ready-to-lease; other units remain pre-lease until punchlist closed. tco_to_first_unit_ready_days computed on first-ready unit.property_master_crosswalk row updates lifecycle_stage only for the unit set delivered. dev_project_crosswalk closure deferred until final phase delivery unless survivorship_rules.md::dev_project_phase_closure allows per-phase close.in_progress; vendor_rationalization_count tracks. Sign-off allowed only if rationalization deferred via row 19 waiver.dev_project_crosswalk_closure_lag_days breach triggers data-platform escalation; the workflow refuses final sign-off.reporting_finance_ops_lead.master_data/unresolved_exceptions_queue.md with reviewer: regional_ops_director.Handoff id. Handoff 8 per lifecycle_handoffs.md.
TCO/CO recording. complete. Temp CO recorded 2026-04-02; final CO targeted 2026-04-30. Partial mode while final CO pending.
Punchlist state. in_progress. punchlist_closeout_rate=87%. All p1/p2 items closed on the first 24 units proposed for lease; other units carry minor cosmetic items.
Retainage release schedule. complete. Per-trade schedule on file; retainage_release_lag_days=2 (within band).
Rent-roll transition. complete. AppFolio unit roster activated for the 24 TCO'd units; remaining 48 units staged. ap_lease_up_setup_complete check passed for the TCO'd set.
Vendor rationalization. in_progress. 9 construction subs archived; 7 of 11 operating vendors onboarded. vendor_rationalization_count=16 (9 archived + 7 onboarded).
Warranty package. complete. GC warranty + 12 manufacturer warranties on file; all start dates captured. warranty_package_completeness=100%.
As-built documentation. complete. Drawings, specs, systems manuals, commissioning reports in registry. as_built_doc_completeness=98% (one minor spec pending).
Capex closeout in Intacct. in_progress. Final cost ledger posted; contingency closeout pending row 11 approval. capex_closeout_lag_days=5.
dev_project_crosswalk closure. in_progress. procore_project_id -> property_id linkage drafted; pending reviewer approval. dev_project_crosswalk_closure_lag_days=3.
property_master_crosswalk transition. in_progress. Draft row transitioning lifecycle_stage from pre_takeover to lease_up for the TCO'd unit set; pending approval.
Lease-up pricing policy seeded. complete. Seeded via workflows/market_rent_refresh; row 13 approval on file.
Handoff completeness score. delivery_handoff_completeness_score=0.86.
Lag days. tco_to_first_unit_ready_days=3; cco_to_first_lease_days=n/a (final CO pending).
Open blockers. Operating vendor identity resolution for 4 rows; property_master_crosswalk + dev_project_crosswalk reviewer approval; capex contingency closeout row 11.
ApprovalRequest. Terminal sign-off packet assembled; routed to development_lead via workflows/owner_approval_routing row 7.
lease_up_first_period trigger. Gated on terminal sign-off; payload staged.
Confidence banner. dev_project_crosswalk@2026-03-31 (sample); capex_project_crosswalk@2026-03-31 (sample); property_master_crosswalk@2026-03-31 (sample); vendor_master_crosswalk@2026-03-31 (sample); source_of_truth_matrix@wave_4_authoritative; stack_reconciliation_matrix@wave_4_authoritative; reconciliation_tolerance_band@2026-03-31 (starter); procore_construction@wave_4 (stub); appfolio_pms@wave_4 (stub); punchlist_sla__middle_market@2026-03-31 (starter). Blocking rules cited: recon_pc_to_af_at_delivery, ap_lease_up_setup_complete, pc_to_af_handoff (none fired as blocker; one confidence-reduced in partial-mode on final CO pending).
| Handoff-lag tolerance band | yaml | required | from reference/normalized/schemas/reconciliation_tolerance_band.yaml |
| Approver roster | yaml | required | resolved per org overlay |
warranty_package_completenessas_built_doc_completeness (proposed). Incomplete packages escalate via reporting_finance_ops_lead.source_of_truth_matrix.md row capex_project: procore for scope/commitments; intacct for posted spend. Track capex_closeout_lag_days (proposed). Row 11 approval required for major capex closeout.dev_project_crosswalk.yaml row by linking procore_project_id -> property_id; per survivorship_rules.md::dev_project_default. Track dev_project_crosswalk_closure_lag_days (proposed).lifecycle_stage transition (pre_takeover or construction -> lease_up) in property_master_crosswalk.yaml. Proposed rows are staged and only merged after approval; see survivorship_rules.md.workflows/market_rent_refresh or equivalent. Required approval gate before lease_up_first_period can run.tco_to_first_unit_ready_days (proposed), cco_to_first_lease_days (proposed), and per-workstream lag against handoff_lag_threshold_days from reconciliation_tolerance_band.yaml. Any breach routes to workflows/owner_approval_routing row 7.delivery_handoff_completeness_score (proposed) as weighted completion of the checklist (weights per overlay).workflows/owner_approval_routing row 7.lease_up_first_period. On final sign-off, emit the event payload for workflows/lease_up_first_period to pick up the first operating period for the now-active property.as_of_date and status tags for every reference file and crosswalk referenced; cite the lifecycle_handoffs.md handoff id for Handoff 8.