FLT-151 build report¶
Root cause¶
RepoRegistryReader verified HMACs by deserializing and reserializing repos through the API's
newer RepoInventoryEntry contract. That contract added jiraProjects and components; missing
properties became empty lists and were emitted during reserialization. Fleet-dispatch signed its
older compact JSON without those properties, so the canonical bytes differed and valid inventory
files failed closed. File enumeration already aggregated all inventory JSON files, and GET
/api/repos does not require a target parameter.
The fix verifies pc|generatedAt|<exact raw repos JSON> from the scanner file. This byte-matches
the signer while continuing to cover every byte and every present repo field with HMAC-SHA256.
Missing/bad keys, timing-safe comparison, whole-file rejection, and filename/PC spoof rejection
remain intact.
Gates¶
An intermediate post-review test run failed 1 of 550 because its new formatting-tamper fixture
changed whitespace outside the signed repos value. The fixture was corrected to mutate whitespace
inside the signed array; the final gate results follow.
dotnet build -warnaserror
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:03.15
dotnet test --no-build
Passed! - Failed: 0, Passed: 551, Skipped: 0, Total: 551, Duration: 3 s - FleetMissionControl.Api.Tests.dll (net10.0)
Manual fixed-build verification (isolated port 5181 because the existing service owns 5170):
GET http://127.0.0.1:5181/api/repos
RepoOptions: 38
PcRows: 85
RegistryPopulated: true