T9.2 - CR-017: Actual Hours is still there, still optional, still counted
A guard, not a build. Removal was floated in the meeting and rejected - Marlena tracks actual hours so they can be measured - and CLAUDE.md carries that as a recorded decision. Verified after eight waves of change: - Actual Hours exists in Closeout (wp_actual_hrs), persists through collect, and prints on the export - it is OPTIONAL: a package closes with it empty (driven, not assumed) - it rolls up per T6.4: rollup_check has pinned actual-hours aggregation at every level since wave 6, and /api/wps/metrics carries actual_hours in its buckets The follow-up the done-when requires is logged as BL-023: a productivity factor (actual / estimated) - the rollup endpoints already carry both sums, so it is a presentation task awaiting its own item id and a placement call. Verification: export_check.py extended to 20/20 (the CR-017 section). Items: CR-017 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -130,6 +130,28 @@ def main():
|
||||
fits["boxFits"] and fits["poke"] == 0, ascii_(fits))
|
||||
chk("390px: the base type is readable (>= 12px)", fits["font"] >= 12, ascii_(fits))
|
||||
|
||||
# ── 5. CR-017: the Actual Hours guard (T9.2) ─────────────────────────
|
||||
# A guard, not a build: removal was floated and REJECTED - Marlena
|
||||
# tracks actual hours. Verify it survived eight waves of change.
|
||||
print(chr(10) + "5. CR-017: Actual Hours survived")
|
||||
page.viewport(1440, 900)
|
||||
settle(0.5)
|
||||
chk("Actual Hours still exists in Closeout and persists",
|
||||
page.eval("!!document.getElementById('wp_actual_hrs')")
|
||||
and page.eval("collectPackage().actualHrs") == "54") # the example's value
|
||||
page.eval("document.getElementById('wp_actual_hrs').value=''")
|
||||
page.eval("""(() => { pkgConstraints.forEach(c => c.status='na');
|
||||
buildConstraints(); updateReleaseBanner(); })()""")
|
||||
page.eval("document.querySelector('#status-group .radio-pill[data-val=%s]').click()"
|
||||
% json.dumps("Closed"))
|
||||
settle(0.5)
|
||||
chk("...it is OPTIONAL: a package closes without it",
|
||||
page.eval("getRadio('status')") == "Closed",
|
||||
page.eval("getRadio('status')"))
|
||||
chk("...and the closeout prints it on the export",
|
||||
"Actual" in page.eval("(() => { renderPackage(collectPackage()); "
|
||||
"return document.getElementById('pkg-doc').textContent; })()"))
|
||||
|
||||
js_errors = [e for e in page.js_errors() if "beforeunload" not in e]
|
||||
chk("no JavaScript errors anywhere in this run", not js_errors,
|
||||
ascii_(js_errors[:2]))
|
||||
|
||||
Reference in New Issue
Block a user