You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of #2251. Carved out of that umbrella's follow-ups, which scoped this as: backfill any needed history from scholarship_agreement_responses, then drop the callbacks, the _agreement_history partial, and the table.
The removal assumed a generic change log (PaperTrail versions at the time; Ahoy events now that #2245 pivoted) covers what the bespoke log holds. It doesn't:
Field on scholarship_agreement_responses
On a generic change log?
status transition
✅ agreement_response_status before/after
responded_at
⚠️ only the event timestamp, which isn't the same field
responder (recipient / admin / system)
❌ domain role, not the acting user
reason (decline free text)
❌ never stored on the scholarship
amount_cents at the time of response
❌ point-in-time value
Scholarship#latest_agreement_response is a live read dependency: the responded-at date and decline reason are not columns on scholarship, so the UI has no other source.
Worse, per #2351 a logged-out recipient accepting or declining on the public callout produces no Ahoy event at all — the bespoke log is currently the only record that it happened.
Decide where reason / responder / point-in-time amount_cents live if the table goes. If the answer is "on the scholarship", that's a schema change plus a backfill — bigger than the removal it was meant to simplify.
If the goal is just "one history UI per record", drop _agreement_history in favour of the shared activity log only once the generic log carries those fields.
Acceptance
Either a decision recorded here to keep the table (and the duplicate-UI question settled), or a plan that names the new home for every field in the table above, with a backfill.
🤖 From Claude:
Part of #2251. Carved out of that umbrella's follow-ups, which scoped this as: backfill any needed history from
scholarship_agreement_responses, then drop the callbacks, the_agreement_historypartial, and the table.Blocked by #2351.
Why it isn't a straight removal
The removal assumed a generic change log (PaperTrail versions at the time; Ahoy events now that #2245 pivoted) covers what the bespoke log holds. It doesn't:
scholarship_agreement_responsesstatustransitionagreement_response_statusbefore/afterresponded_atresponder(recipient/admin/system)reason(decline free text)amount_centsat the time of responseScholarship#latest_agreement_responseis a live read dependency: the responded-at date and decline reason are not columns onscholarship, so the UI has no other source.Worse, per #2351 a logged-out recipient accepting or declining on the public callout produces no Ahoy event at all — the bespoke log is currently the only record that it happened.
Current surface
Scholarship:has_many :agreement_responses,after_create/after_update :log_agreement_response,latest_agreement_responseapp/views/scholarships/_agreement_history.html.erb, rendered byscholarships/editandevents/callouts/scholarship(admin-styled)ScholarshipAgreementResponse+scholarship_agreement_responsestablescholarship_agreement_response_spec, plus agreement-history coverage inscholarship_specandevents/callouts_specRecommendation
Keep the table; treat the follow-up as de-duplicating the UI, not deleting the log.
reason/responder/ point-in-timeamount_centslive if the table goes. If the answer is "on the scholarship", that's a schema change plus a backfill — bigger than the removal it was meant to simplify._agreement_historyin favour of the shared activity log only once the generic log carries those fields.Acceptance
Either a decision recorded here to keep the table (and the duplicate-UI question settled), or a plan that names the new home for every field in the table above, with a backfill.