T-93OZ-fix-the-util-config-single-home-violations-as-one-sweep
State: closed/done · Impact: medium · Complexity: medium
From the Phase-4 audit’s recommended task list
(docs/planning/notes/N-OCUK-2026-09-24-sdlc-1-0-audit.md, on origin/sdlc/p4-audit): Fix the
util/config ‘single home’ violations as one sweep (resolveProjectRoot->findAncestor, misnamed
pyResolve, raw yaml imports, isPlainObject->isRecord, nowIsoUtc/todayUtc/rfc3339 composition, cmpStr
comparators, singularize/pluralize split).
| Area | Note |
|---|---|
lib/config/ | resolveProjectRoot |
lib/util/ | findAncestor, yaml, isRecord, rfc3339/nowUtc/todayUtc, cmpStr, singularize/pluralize |
lib/services/lease/ | lease/tree.ts nowCommitDate |
lib/services/verify/ | verify/changes.ts inline ISO-date |
lib/model/entities/task/ | Inline comparator |
lib/services/project/ | Inline comparator |
lib/services/gate/ | Inline comparator |
skills/task-work/ | Raw yaml import |
skills/migrate-runtime-state/ | Misnamed local pyResolve |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1: resolveProjectRoot calls findAncestor rather than reimplementing the walk.
- AC-2: The misnamed local pyResolve in migrate-runtime-state is gone, replaced by the correct shared contract.
- AC-3: No raw yaml-package import remains outside @lib/util/yaml.
- AC-4: All nine named single-home violations are resolved and tests pass.
Out of scope
Section titled “Out of scope”- none
Dependencies
Section titled “Dependencies”- none