Skip to main content
All Docs
FeaturesagentOS Block ManagerUpdated April 13, 2026

Building Fabric Asset Class

Building Fabric Asset Class

Building fabric assets are the structural and envelope elements of a block — roofing, double glazing, guttering, external insulation, cladding, and drainage. Unlike plant & equipment, they are replaced based on survey condition and age rather than fixed service intervals, and they typically represent the largest long-term capital expenditure items on any reserve fund projection.

Section-by-Section Sub-Entries

A single building fabric asset record (e.g. "Flat Roof") can cover multiple distinct physical sections (e.g. "Main roof", "Rear extension roof", "Plant room roof"). Each section has its own:

  • Condition rating (1–5 scale)
  • Estimated replacement cost — cost to replace that section alone
  • Quantity / area — m², linear metres, units, etc.
  • Survey notes — defects, repair history, contractor recommendations

This section-by-section model enables partial replacement planning: not every section of a fabric element may need replacing at the same time, and the reserve fund projection accounts for this.

Condition Ratings

RatingLabelAction
5Excellent (as new)No action required
4GoodMonitor at next survey
3Average (serviceable)Include in medium-term plan
2Below Average (plan replacement)Prioritise for partial replacement
1Poor (replace immediately)Flag for immediate replacement

Sections rated 1 or 2 trigger an early replacement flag and are highlighted with a replacement priority alert in the panel.

Asset Detail View — Building Fabric Panel

When an asset's class is set to building_fabric, the asset detail view shows the Building Fabric Panel instead of a generic display. The panel includes:

Key Metrics Card

  • Asset Condition — overall condition rating badge; early replacement flag if triggered
  • Age & Lifespan — current age in years, estimated lifespan, and percentage of lifespan consumed
  • Replacement Year — projected (auto-calculated from install date + lifespan) or manual override
  • Total Cost — estimated full replacement cost; benchmarked flag shown where applicable; section cost total shown if it differs from the asset-level total

Survey Staleness Notice

If no inspection date is recorded, or if the last inspection was 3 or more years ago, the panel displays a warning that section condition ratings may no longer be accurate and a re-survey is recommended.

Section Editor

Sections can be added, edited, removed, and reordered directly from the detail view. Changes are saved explicitly via the Save Changes button.

Aggregate section statistics (section count, average condition, total section costs) are displayed above the section list when at least one section exists.

Poor condition alert lists all sections rated 1 or 2 by name and condition, with guidance to prioritise them for partial replacement planning.

Reserve Fund Integration Notice

The panel displays a contextual notice explaining how this asset's capex feeds into the reserve fund projection:

  • If cost and replacement year are both set: shows the forecast year and cost, notes if the estimate is benchmarked, and notes if section sub-entries enable partial replacement planning.
  • If cost is missing: prompts the agent to add an estimated replacement cost.
  • If replacement year is missing: prompts the agent to set an install date and estimated lifespan.

Asset Create Form

When creating a new asset with class building_fabric, the Section-by-Section Sub-Entries editor is shown in place of the previous raw JSON textarea. Agents can add sections with guided form fields from the very first save.

Section Form Fields

FieldRequiredNotes
Section NameYesIdentifies the specific part (e.g. "North elevation", "Rear flat roof")
Condition Rating (1–5)NoDropdown; triggers priority warning at 1 or 2
Estimated Section Cost (£)NoCost to replace this section alone; enables partial replacement modelling
Quantity / AreaNoFree text — m², lm, units, etc.; used for benchmarking cost per unit
NotesNoSurvey observations, defects, repair history

buildingFabricSummary API Endpoint

The asset.buildingFabricSummary tRPC query provides a portfolio-level summary of all building fabric assets. It is used for reporting dashboards and reserve fund integration.

Input

{ blockId?: string }

Omit blockId to query across the entire organisation. Provide a blockId to scope results to a single block.

Response

{
  totalBuildingFabricAssets: number;

  // Asset-level totals
  totalReplacementCostPence: number;
  earlyReplacementCount: number;
  benchmarkedCount: number;

  // Section-level aggregates
  totalSections: number;
  poorSectionCount: number;          // sections with condition ≤ 2
  avgSectionCondition: number | null;
  totalSectionCostPence: number;

  // Data quality
  missingInstallDateCount: number;
  missingLifespanCount: number;
  missingCostCount: number;

  // Reserve fund integration
  costsByYear: Record<number, number>;  // replacement year → total cost in pence

  // Full asset list
  items: Array<{
    id: string;
    name: string;
    blockId: string;
    conditionRating: number | null;
    earlyReplacementFlag: boolean;
    estimatedReplacementCostPence: number | null;
    isBenchmarked: boolean;
    projectedReplacementYear: number | null;
    manualReplacementYear: number | null;
    installDate: Date | null;
    estimatedLifespanYears: number | null;
    hasSections: boolean;
  }>;

  // Up to 10 assets due within the next 10 years, sorted ascending
  upcomingReplacements: Array<{
    id: string;
    name: string;
    blockId: string;
    replacementYear: number | null;
    estimatedReplacementCostPence: number | null;
    conditionRating: number | null;
    earlyReplacementFlag: boolean;
  }>;
}

costsByYear

This field groups total replacement costs by projected replacement year. It is the primary input for reserve fund year-by-year cash flow modelling. The year used is manualReplacementYear where set, otherwise projectedReplacementYear.

upcomingReplacements

Assets due for replacement between the current year and the next 10 years, sorted by replacement year ascending and capped at 10 results.

Data Storage

Fabric sections are stored as a JSON string in the fabricSections column of the asset record. The panel and API handle both the legacy format (section, condition, notes only) and the full format (with estimatedCostPence and quantity), so existing records remain readable without migration.

Audit Trail

All section updates are saved via asset.update, which is covered by the existing asset audit log. Every change to fabric sections is recorded in the audit trail.