Drops core_sitereport via 0018_delete_sitereport. Knowledge preserved
in docs/plans/2026-05-17-site-report-removed-capture.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Also deletes AttendanceLogRedirectsToSiteReportTests (it asserted only
the removed redirect destination — a behavioural test, not a model
test). Suite 209 -> 208.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad-approved design to fully remove the SiteReport / "Log Today's
Work" feature (drop core_sitereport, no backup, revert post-attendance
to redirect-home). Capture doc preserves the schema-as-Python pattern,
the flow, recovery pointers, and rebuild guidance. Local-only; the
removal itself is HARD-STOPPED before push.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad confirmed the 36-commit bundle "all working well" on prod
(17 May 2026). Flip CLAUDE.md + parked-work.md production status from
"deploy pending" to "✅ fully caught up & verified at 80d96d7".
Also flags the in-progress (local-only) SiteReport removal.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Flip parked-work.md + CLAUDE.md from "paused, not pushed" to "pushed to
origin/ai-dev d7015b9..4c25011, Flatlogic VM deploy pending (migrate +
collectstatic + restart-last)". Prevents a fresh session reading stale
"not pushed" status.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Admin Quick Actions tile -> /payroll/?action=pay-salary; the payroll
page auto-clicks the existing paySalaryBtn then strips the param.
Reuses all existing Pay-Salary machinery; param inert server-side.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task 1: tile + deep-link hook + render test (TDD on the Django-render
part; auto-click is JS/manual-checklist). Task 2: docs. Suite 207->208.
Nothing pushed until Konrad's local verification.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad-approved: a home-dashboard admin Quick Actions tile that
deep-links /payroll/?action=pay-salary and auto-clicks the existing
paySalaryBtn (then strips the param). Reuses all existing machinery;
no view/model/URL change. Rides the same paused-bundle HARD STOP.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
When type=Salary: set pay-type filter to Managers-only, hide daily
rows, and untick any selected daily worker so a Salary can never
silently target a daily worker. Re-applied on the Pay-Salary open
path (the show.bs.modal reset clears it first). Pure JS; verified by
manual checklist; suite stays 207/207.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad-approved: when Add-Adjustment type=Salary, auto-set the pay-type
filter to Managers-only, hide daily rows, and untick any selected daily
worker so a Salary can never silently target a daily worker. Pure JS,
hooks the toggleProjectField() chokepoint. Rides the same HARD STOP.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Prevents a pre-checked quick-adjust worker from opening hidden behind a
stale 'Managers only'/'Daily only' filter. Display-only; no data impact.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad-approved design for a display-only ?pay_type= filter on /workers/
and a "Managers only" toggle on the Add-Adjustment modal picker. No
model/migration/URL changes; rides with the paused Manager/Salaried
feature's HARD STOP (nothing pushed until local verification).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Final whole-feature review flagged the design doc's verification
checklist step 4 over-promised an auto-filled amount. Manual entry is
intentional; corrected so Konrad's local verification expectations match
actual behaviour. Docs-only, local-only — feature still NOT pushed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task-by-task TDD plan: Worker.pay_type + migration, Salary additive
type, attendance/absence picker exclusions, add_adjustment Salary
branch, per-project salaried-cost report line + byte-for-byte
daily-numbers regression guard, UI, docs. Ends with a HARD STOP
before any push for Konrad's local verification.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Models a manager as a Worker with a pay_type discriminator, reusing the
existing loan/adjustment/payslip/payroll pipeline. New 'Salary'
adjustment type, project-attributed; managers excluded from
attendance/absence pickers so daily-worker math is provably untouched.
HARD STOP after implementation for local verification before any push.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad paused execution. parked-work.md now has a "⏸ Paused —
ready to execute" section pointing at the design (110545b) + plan
(29c36be) commits, with the resume instruction and the hard-stop
constraint. All 3 commits are local-only on ai-dev — nothing
pushed until Konrad verifies the flow locally.
4 small TDD tasks (~120 LOC): display rename, attendance 3-button
branch, Site Journal save+absences button, docs. Reuses Round C
next_action pattern. HARD STOP after Task 4 — local verification
by Konrad before any push (UX change to a daily-use path).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the forced post-attendance SiteReport redirect with 3
explicit buttons (Log Work → dashboard / + Site Journal / +
Absences) + a parallel "Save Site Journal + Add Absences" on the
journal page. Renames the user-facing "Site Report" → "Site
Journal" (display-only, Path-A; frees "Journal" for the parked
voice feature). Reuses the Round C next_action POST mechanism —
no model/migration/URL changes. NOT to be deployed until Konrad
verifies locally.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Konrad's decision (15 May 2026): Phase A.2 (manual JournalEntry
UI) + Phase B (Letterly inbound webhook) are too complex to
interleave with normal app work — they'll be built and tested
offline on a separate track, not in ai-dev.
Verified there is NOTHING to remove or bypass: zero JournalEntry
model/views/urls/templates, zero Letterly/webhook/@csrf_exempt
code anywhere on ai-dev, latest migration is 0015. The working
app was already 100% clean of journal/voice code — these features
never left the design-doc stage.
Doc changes:
- parked-work.md: "Blocked on Konrad's input" section replaced
with "🧊 Backburner — separate offline track", with an explicit
"do NOT start in ai-dev" warning and the nothing-to-remove
verification recorded.
- CLAUDE.md breadcrumb: reframed from "parked pending Q5/Q7
answers" (implies ready-to-go once answered) to "deliberately
deferred to offline track — do not pick up as normal feature
work".
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Production caught up — all 14 pending commits live after a
second service restart (the first restart ran before the code
reached the target commit; DEBUG=False's cached template loader
held the old templates until restarted again).
CLAUDE.md:
- 'What's mid-flight' breadcrumb: no longer says pending deploy;
now states production is at 1d224bc and fully live.
- Flatlogic Deployment section: new '⚠ DEPLOY ORDERING' bullet
documenting that production runs DEBUG=False → cached template
loader → restart MUST come after the pull, and template-only
changes still need a restart (unlike DEBUG=True local dev).
Includes the symptom ('git log shows right commit but page
looks old') and the fix (restart again).
- Bumped the {# #} bit-us count + added a grep sanity-check
one-liner (from the prior commit, retained).
parked-work.md: 'Pending pull-and-restart' section replaced with
'Production status — fully caught up'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CLAUDE.md gotcha #1 strikes again — the dashboard audit pass added
7 multi-line {# ... #} comment blocks across index.html, report.html,
and pdf/report_pdf.html. All rendered as literal text on the live
pages (Konrad screenshotted them). Also caught an old one in
admin/base_site.html that was technically broken syntax but
non-rendering (outside any block). All 8 converted to
{% comment %}{% endcomment %}.
CLAUDE.md updated:
- Bumped the bit-us count (4 → confirmed 4 + 5 + 7 across three
features). Added a grep-one-liner sanity check that finds broken
multi-line {# blocks across all templates so future passes can
spot-check before committing.
Cryptic hero-card sublines on /report/ clarified (Konrad asked
what they mean):
- "as of 08:13" → "Live total at 08:13 today · for <scope>" with
hover tooltip explaining the snapshot semantics.
- "Company Avg / Working Day" / "/ Month" labels renamed to
"Avg Labour Cost / Working Day" / "/ Month". Sublines simplified
to "Lifetime average across all crews" / "Daily figure × 30.44
days". Both gain hover tooltips that explain the math and the
"current pay rates" basis.
Pure template + docs change. 173/173 tests still passing
(no test changes — these are cosmetic fixes).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CLAUDE.md breadcrumb: '6 subsequent commits' → '13 subsequent
commits' with a one-paragraph summary of what's pending pull +
restart on production. Points at parked-work.md for the full
commit table.
parked-work.md:
- 'Pending pull-and-restart' table: added 18c75b2 (calendar
month) and the 2e6b78d→c02edce audit-pass range as a single
collapsed entry.
- 'Recently shipped' grew a detailed entry for the 18-finding
audit pass at the top.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Documents two related foot-guns that bit recent audits:
- `Worker.daily_rate` is computed LIVE from `monthly_salary`; it's
never snapshotted onto a WorkLog row. So historical cost totals
inflate retroactively when a worker gets a raise. The new
"at current pay rates" subline on the report hero cards
(commit 4186603) is the visible half of this convention. Future
audits should read this note before deciding "this can't be right".
- Two code paths compute the same formula: Python property and a
SQL `Sum(F('workers__monthly_salary') / Decimal('20'))`. They
produce identical results in normal use but could drift by 1
cent on edge-case rounding. `CompanyCostVelocitySQLAggregateTests`
is the regression test that would catch a real divergence.
Findings 2 + 11.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>