Context
packages/loopover-engine/src/focus-manifest.ts's parseFocusManifest fully recognizes a top-level
fairnessAnalytics: block in .loopover.yml (FocusManifestFairnessAnalyticsConfig, the
config-as-code override for LOOPOVER_FAIRNESS_ANALYTICS) — see line 3993:
fairnessAnalytics: parseFairnessAnalyticsConfig(record.fairnessAnalytics, warnings).
However, packages/loopover-engine/src/config-lint.ts's TOP_LEVEL_FIELDS array (lines 4-31), which
enumerates every field lintManifestText/unknownTopLevelWarnings treats as recognized, does not
include fairnessAnalytics. Any repo whose .loopover.yml declares a fairnessAnalytics: block gets
a spurious "Manifest contains unknown top-level field: fairnessAnalytics." lint warning even though
the field is fully supported and parsed correctly by the manifest loader itself.
No test in test/unit/selfhost-config-lint.test.ts or test/unit/loopover-config-lint-script.test.ts
references fairnessAnalytics at all, confirming this was simply missed when the field was added
rather than being an intentional omission.
Requirements
- Add
"fairnessAnalytics" to TOP_LEVEL_FIELDS in packages/loopover-engine/src/config-lint.ts.
- Do not change the parsing logic in
focus-manifest.ts — it is already correct; this issue is scoped
to the lint-rule list only.
Deliverables
Test Coverage Requirements
This repo's Codecov patch gate is 99%+ of changed lines and branches
(packages/loopover-engine/src/** is covered). The single-line array addition is trivial, but the new
regression test above is required to lock in the fix and prevent future regressions of this same
missed-field pattern.
Expected Outcome
A .loopover.yml with a fairnessAnalytics: block no longer produces a false "unknown top-level
field" lint warning.
Links & Resources
packages/loopover-engine/src/config-lint.ts:4-31 — TOP_LEVEL_FIELDS, the array to fix
packages/loopover-engine/src/focus-manifest.ts:3993 — where fairnessAnalytics is actually parsed
Context
packages/loopover-engine/src/focus-manifest.ts'sparseFocusManifestfully recognizes a top-levelfairnessAnalytics:block in.loopover.yml(FocusManifestFairnessAnalyticsConfig, theconfig-as-code override for
LOOPOVER_FAIRNESS_ANALYTICS) — see line 3993:fairnessAnalytics: parseFairnessAnalyticsConfig(record.fairnessAnalytics, warnings).However,
packages/loopover-engine/src/config-lint.ts'sTOP_LEVEL_FIELDSarray (lines 4-31), whichenumerates every field
lintManifestText/unknownTopLevelWarningstreats as recognized, does notinclude
fairnessAnalytics. Any repo whose.loopover.ymldeclares afairnessAnalytics:block getsa spurious
"Manifest contains unknown top-level field: fairnessAnalytics."lint warning even thoughthe field is fully supported and parsed correctly by the manifest loader itself.
No test in
test/unit/selfhost-config-lint.test.tsortest/unit/loopover-config-lint-script.test.tsreferences
fairnessAnalyticsat all, confirming this was simply missed when the field was addedrather than being an intentional omission.
Requirements
"fairnessAnalytics"toTOP_LEVEL_FIELDSinpackages/loopover-engine/src/config-lint.ts.focus-manifest.ts— it is already correct; this issue is scopedto the lint-rule list only.
Deliverables
fairnessAnalyticsadded toTOP_LEVEL_FIELDSinconfig-lint.ts.test/unit/selfhost-config-lint.test.ts(ortest/unit/loopover-config-lint-script.test.ts, whichever already coversTOP_LEVEL_FIELDS)asserting a manifest containing a
fairnessAnalytics:block produces no "unknown top-levelfield" warning.
Test Coverage Requirements
This repo's Codecov patch gate is 99%+ of changed lines and branches
(
packages/loopover-engine/src/**is covered). The single-line array addition is trivial, but the newregression test above is required to lock in the fix and prevent future regressions of this same
missed-field pattern.
Expected Outcome
A
.loopover.ymlwith afairnessAnalytics:block no longer produces a false "unknown top-levelfield" lint warning.
Links & Resources
packages/loopover-engine/src/config-lint.ts:4-31—TOP_LEVEL_FIELDS, the array to fixpackages/loopover-engine/src/focus-manifest.ts:3993— wherefairnessAnalyticsis actually parsed