Phase Space AI

Financial Model Notes

Federal Signal [FSS]

Federal Signal [FSS] — Financial Model Notes & Defect Register

Screen record validation

Screen: reports/scan_universe/FSS_analysis.json, as-of 2026-07-30, Quality PASS, Valuation PASS at +6.8pp.

screen field screen value verified value source result
shares 61,002,256 61,002,256 10-Q cover page 2026-03-31 exact
revenue_ttm 2,342,300,000 2,342,300,000 four filed quarters exact
cash $71.4m $71.4m 10-Q 2026-03-31 exact
net_cash −140,200,000 −481,600,000 cash $71.4m − total debt $553.0m WRONG by $341.4m
ev 7,570,274,781 7,911,674,781 understated $341.4m, −4.5%
ev_sales 3.232 3.378 4.3% understated
ev_ebit 20.7 21.13
op_margin_pct 15.6 (FY2025) 15.63 (FY2025 filed) 10-K correct — screen used the filed figure
gross_margin_pct 28.9 28.95 (FY2025 filed) 10-K correct
revenue_cagr_demonstrated 15.0 ~10.0 organic (est., 9.5–11.3) derived; not disclosed contaminated by acquisition
revenue_growth_latest_q_yoy 34.9 34.9 correct, but mostly acquired
exit_multiple 22.5, GROWTH_MATCHED, peer_n: 318 10.53x ROIC identity invalid — 318-name "peer" set
required_cagr_pct 8.2 19.0 reverse_dcf wrong by 10.8pp
valuation_margin_pp +6.8 −9.0 sign flip, 15.8pp swing

The net-debt defect, isolated — a new variant

The screen's own net_cash_components field records exactly what it did:

"assets": ["CashAndCashEquivalentsAtCarryingValue@2026-03-31"],
"debt":   ["LongTermDebt@2025-09-30"],
"net_cash_complete": true

It paired a 2026-03-31 cash figure with a 2025-09-30 debt figure — two quarters stale — and set net_cash_complete: true.

The cause is tag choice. Federal Signal stopped populating us-gaap:LongTermDebt after 2025-09-30 and reports instead through us-gaap:LongTermDebtAndCapitalLeaseObligationsIncludingCurrentMaturities, which is populated at 2026-03-31 at $553.0m.

tag last value date
LongTermDebt $211.6m 2025-09-30 ← what the screen used
LongTermDebtCurrent $2.5m 2026-03-31
LongTermDebtAndCapitalLeaseObligations $548.6m 2026-03-31
LongTermDebtAndCapitalLeaseObligationsIncludingCurrentMaturities $553.0m 2026-03-31 ← correct

The staleness is not incidental. Between 2025-09-30 and 2026-03-31 Federal Signal closed New Way ($424.2m, 2025-11-25), Kinloch ($14.9m, 2025-12-04) and Mega ($45.0m, 2026-01-16), and issued $400.0m of long-term debt (FY2025 cash-flow statement, ProceedsFromIssuanceOfLongTermDebt). The excluded debt is precisely the debt raised to buy the revenue the screen was scoring.

Classification. DATA_DEFECTS.md records net_cash wrong on ~20 of 22 hand-verified names, and records the "longTermDebt = 0 in the newest quarter only" pattern where 0 was correct for WDC. This is a third variant and it is more dangerous than either: the tag is neither zero nor absent — it is simply not updated, so every existence check passes. The scanner asserted recency on the cash leg (2026-03-31) and not on the debt leg. Completeness was checked; currency was not. A net_cash_complete: true flag on a two-quarter-stale debt figure is the "existence is not validity" failure class (calibration item D1) applied to a date rather than a value.

Recommended check for the scanner: assert that the debt leg's end date is within one quarter of the asset leg's, and fail the record loudly if not.

Defects found — Alpha Vantage

operatingIncome — same family as the KGS defect, much smaller magnitude

period AV operatingIncome filed error
FY2025 $355.8m (sum of quarterlies) $340.9m +4.4% (+$14.9m), 0.68pp of margin
Q1 2026 $100.9m $99.5m (625.6 × 15.9%) +1.4%

The excluded line is Acquisition and integration-related expenses, net ($16.0m in FY2025). This is the same shape as the KGS finding in this cluster — AV drops certain operating charges — and the magnitude scales with those charges (KGS: +21.9% with $67.9m of loss-on-sale and impairment; FSS: +4.4% with $16.0m of acquisition expense). Two names, same field, same direction, magnitude proportional to the excluded line. On XYL in the same cluster the field is byte-clean. So the defect is real, filer-specific, and predictable from the presence of below-SG&A operating charges.

gross_profit also differs: AV FY2025 28.1% vs a filed 28.95% (0.85pp). All opex lines in this memo were taken from the 10-K, so neither figure entered the model.

Fields checked and found CLEAN on FSS — reported per instruction

field result
totalRevenue, all quarters byte-identical to EDGAR — 625.6 / 597.1 / 555.0 / 564.6 / 463.8 all tie
SPLITS queried explicitly, {"symbol":"FSS","data":[]}no split, no reverse split
cashAndShortTermInvestments not applicableshortTermInvestments and longTermInvestments both absent from the balance sheet. Cash $71.4m ties to the 10-Q. The INSM defect does not fire
EARNINGS_ESTIMATES 40 records with full 7/30/60/90-day revision history — not the empty-array failure
EARNINGS_CALL_TRANSCRIPT 9 of 12 quarters, speaker/title/sentiment populated
av_vs_edgar.py VERIFIED, 4 periods compared, 0 disagreements (revenue only — see the KGS finding on this tool's scope)
ebit, ebitda, sellingGeneralAndAdministrative, OVERVIEW.* not used

Defects found — our own tooling

normalized_fcf.py overstates Federal Signal's maintenance capex by 3.1x

tool actual
maintenance capex proxy 3.7% of revenue (D&A ÷ revenue) 1.2% (actual capex $28.7m TTM)
operating cash margin 8.4% (20-year median) 13.6% (TTM)
steady-state FCF margin 4.7% trailing 12.4%

The D&A proxy fails here because $18.4m of FY2025 D&A is Amortization expense on purchased customer relationships and trade names — a non-cash purchase-accounting charge, not a sustaining capital cost. The 20-year operating-cash-margin median fails because Federal Signal in 2006–2015 was a materially smaller and lower-margin company (operating margin 6.4% in 2012 against 16.0% today).

This is the same tool defect found on KGS in this cluster, from the opposite direction. On KGS the D&A proxy overstated maintenance capex 2.0x because of an acquisition asset step-up; on FSS it overstates 3.1x because of acquisition intangible amortisation. Both are acquisition artefacts, and normalized_fcf.py has no adjustment for either. Recommended fix: use disclosed capex where available and subtract acquisition intangible amortisation from the D&A proxy where it is not.

Used instead: 10.5% — trailing 12.4% haircut deliberately, because Federal Signal's growth requires cash acquisitions ($501.0m in FY2025 against $255m of operating cash flow) that never appear in capex.

steady_state_check.py — used as intended and it changed an input

At a first-tested terminal margin of 16.5% the tool returned TERMINAL_ABOVE_EVERY_OBSERVED_YEAR. The margin was moved to 16.0% — the TTM filed actual — and the flag cleared to NO_SCALING_CONTAMINATION_DETECTED. The independent reason for the move is that Q1 2026 gross margin was down 0.2pp year over year on acquired mix, so the gross-margin uptrend that would fund a higher terminal margin has stopped. Recorded because a flag that changes an input is the tool working, and because the change is documented with a reason that is checkable against the filing rather than asserted.

Model construction notes