Spaces:
Running
Running
Commit History
-
Fix: draft restore lost the CE on CE-as-producer agreements Running
Save a draft on "Ceded Accounts - CE as Producer", reopen it, and the CE dropdown came back empty with no error; re-submitting then dropped the CE entirely (no approval row, no email). Found while QA'ing the CE_PROD_SUFFIX fix; pre-existing, not caused by it. The form has three CE pickers: client_exec (optional checkbox mode), client_exec_dept (mandatory CL/BD + locked-pair) and client_exec_required (CE-as-producer). updateCEMode and getFormData both branch on isCEasProducer FIRST, then CL/BD, then optional. Draft restore had only the last two branches, so a CE-as-producer draft restored into a hidden picker — on CL/BD into client_exec_dept, on any other department into client_exec — neither of which getFormData reads back. Adds the missing isCEasProducer branch, ordered first so all three functions agree on precedence. Verified by reopening drafts in all 4 CE modes (CE-as-producer on CL and on non-CL, CL/Bond dept mode, optional checkbox mode, locked-pair Mentor): each restores int…1524a84 -
Fix: CE_PROD_SUFFIX / CE_SUFFIX now drive the CE's producer code
Reported from the admin panel: on "Ceded Accounts - CE as Producer", CE_PROD_SUFFIX = 2 flipped the ABE Status column to Non-ABE but the Code column stayed BRAJO1; toggling back to 1 moved the label again and never the code. BRAJO1 + Non-ABE contradict each other in Epic (...1 is ABE, ...2 is Non-ABE), so the code carried into the PDF and the approval record was wrong on every CE-as-producer agreement. Cause: Round 5 moved the CE picker onto the client_executives table, so ce_record always resolves and rules_engine printed ce_record.code verbatim (every seed row ends in 1). The ABE label on the same row was computed from the constant instead — hence one column obeyed the admin panel and the other could not. The prefix+suffix branch that used to apply the suffix had become dead code. Fix: _apply_ce_suffix() re-suffixes at render time, so the summary Code column, PDF/DOCX year table, signer block, participants list and Approval.producer_code all derive from the same ce_suf as the ABE l…129db36
-
Mentor agreements: roll Mentee/Mentor rows into the MENTO code row
For MENTO3-6, the Commission & Production Credit Summary table now shows two rows during Unvalidated Years: the MENTO code at 20% commission / 100% production credit, plus the CE layer. The Mentee (P1) and Mentor (P2) rows are filtered from the display only. Implemented entirely inside compute_summary(), which is the single source of year_tables for all four surfaces (form preview, producer approval view, PDF, DOCX) - so no template, route or generator needed changing. The producer records, tiers and participants list are untouched, so both producers still receive approval emails, still appear in the PDF "Commission Agreement" and "Approvals" sections, and still block finalization. No DB writes, no schema change, no seed change and no boot migration: existing submissions keep their frozen summary_data snapshot, so finalized agreements still render exactly what was approved. The MENTO row reads its rate off the Unvalidated tier rather than hardcoding 20, so admin panel edits flow thr…f17f7f1
-
Docs: OPERATIONS — RUNTIME_ERROR recovery + uptime self-heal Action
Document the Jul 14 outage learnings: 'Scheduling failure: unable to schedule' is HF infra-side (free CPU tier), fixed by a non-destructive plain restart; the new uptime-check.yml Action self-heals it within ~15 min. Note zero-downtime rebuilds, bucket-persists-across-restart, and that Space secrets survive rebuilds (empty ?full=true list is expected).50efa1f -
Add uptime self-heal Action: auto-restart Space on RUNTIME_ERROR
Every 15 min a GitHub Actions cron checks the pramodmisra/pif Space runtime stage and issues a non-destructive plain restart if it has fallen into a recoverable error (e.g. the 'Scheduling failure: unable to schedule' RUNTIME_ERROR that took caf.swia.ai down). The persistent bucket stays mounted so the DB is untouched; BUILD_ERROR/CONFIG_ERROR fail the job to alert the owner rather than restart-loop. Reuses the existing HF_TOKEN secret.0331113
-
Display all timestamps in Eastern time (EST/EDT)
Timestamps are stored in UTC (unchanged); only human-facing rendering now converts to America/New_York (auto-handles EST vs EDT). Adds app/timeutils.py (to_eastern/fmt_eastern/now_eastern) and routes the web UI, PDF, and DOCX timestamp formatting through it. Registers an 'eastern' Jinja filter for approve.html. Fixes two naive datetime.now() footer timestamps in the PDF/DOCX generators. Adds tzdata dependency (python:3.11-slim has no system IANA tz database). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>76b303c
-
Stop force-deactivating the standalone Emerging Markets agreement on boot
Per product decision (reversal of the earlier "keep EM deactivated"): the standalone "Emerging Markets Agreement" is now admin-owned. Removed the R6.3 self-healing block that re-set it to Inactive on every Space restart (which undid any admin reactivation overnight), plus the related legacy "Emerging Markets - House Standard" force-deactivation. No agreement is force-deactivated on boot anymore; active/inactive is controlled from the admin panel and persists. EMB stays a separate active agreement. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>bcc1fcc -
Fix: stop nightly refresh from resetting admin producer deactivations
The producer/agreement list "reset overnight" (57 back to 74): both start.py's boot import and /api/data-refresh did "deactivate ALL producers, then re-activate every code in the refresh", so the daily Space restart re-activated the whole 71-code roster and wiped any deactivations made in the admin panel. Producers are a curated roster (not sourced from the Sheet), so the mass deactivate/reactivate served no purpose except destroying admin edits. Make both paths upsert-only: existing producers keep their current is_active (admin-owned); new roster codes are added active; standing approvers (Bella + locked pairs) still force-activated. Clients are unchanged (still fully resynced from the Sheet). Admin must deactivate down to 57 once after deploy; it then sticks. Adds _smoke_producer_persist.py regression guard. EM-agreement self-healing left as-is per product decision (EMB replaces it). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>405515a
-
Docs: OPERATIONS — email-rule fix (§9) + FastAPI route-ordering gotcha (§7)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>9a47603 -
Fix: "Add Rule" button on Email Routing Rules (route-ordering shadow)
POST /admin/api/email-rules/new was shadowed by the dynamic /{rule_id} route declared before it — Starlette matched /{rule_id} ([^/]+) against the literal "new", routed it to update_email_rule, and 422'd on `rule_id: int` coercion, so no rule was ever created (the button appeared to do nothing). Move the static /api/email-rules/new handler above /api/email-rules/{rule_id} (the static-before-dynamic ordering every other admin resource already uses) and add a comment explaining the trap. No logic/template/schema change; integer-id updates still match /{rule_id}. Verified by _smoke_email_rule.py (TestClient + dependency overrides): create returns 200 + inserts a row, update still persists. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>c85ab21
-
Docs: OPERATIONS §9 for Rounds 6 & 7 + admin-tier-editor gotcha
Document the Round 6 feedback fixes (name-agnostic referral detection, Fitch P2 restore, Emerging Markets retirement, self-healing migrations) and Round 7 (CE 'No Client Executive' layer on Mentor 3-6 + Bond Partner). Add a §7 gotcha that the admin tier editor can rename a name / drop tiers (the Round 6 root cause). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>e87dd1b -
Round 7: add "No Client Executive" CE layer to locked-pair agreements
Mentor agreements MENTO3-6 and the Bond Partner Agreement (Webb/Herron) now carry the same CE workflow as CL/Bond accounts: a mandatory CE dropdown defaulting to "No Client Executive" (NOCEA1), with the option to attach a real CE. - rules_engine: stop hard-disabling CE for locked pairs (include_ce no longer gated on `not is_locked_pair`). CCP remains disabled for locked pairs. NOCEA1 still deducts nothing / no approval; a real CE takes the standard 2% split across the locked producers and becomes an approver — all via the existing Round 5 machinery. - form.html: ce:true on the 5 locked-pair entries; updateCEMode + getFormData + draft-load route locked pairs through the mandatory NOCEA1 dropdown. CCP stays off. - Reuses the Round 5 NOCEA1 placeholder + ce_dept_required_mode; no DB migration (NOCEA1 already exists in the live client_executives table). - Tests: _smoke_round7.py (new) covers NOCEA1 default, real-CE 2% split + approver, and CCP-still-suppressed for MENTO4 + Bon…5937f90 -
Round 6: fix Middle Market originator, Fitch Irick Streer, retire Emerging Markets
Addresses Elliot Wallace's feedback on the live commission-intake app: 1. Middle Market Referral/Origination: no Originating Producer field. Root cause — form/engine keyed behavior on the exact internal agreement `name`, which the admin tier editor can rename, dropping the originator slot. Now recognized by name OR display_name OR the "Referral / Origination Fee Agreement" prefix (rules_engine _is_referral_orig + form.html getVisibility display fallback). 2. Standalone "Emerging Markets Agreement" retired (only applies inside EMB now): deactivated server-side (kept for historical submissions), key removed from the form visibility map. EMB's identically-named tier label is independent/unaffected. 3. Fitch Irick showed only Wayne Dean, no John Streer. Root cause — an admin tier-edit dropped the P2 tier; the engine forces both codes but Streer's row/approval only render when a P2 tier exists. start.py gains idempotent, surgical self-healing migrations: restore …88b25ae
-
Round 5 pre-launch: 2 new agreement types, NOCEA1 CE, employee list, email + admin fixes
- 1A: add CommissionAgreement.display_name; Referral displays as "- Middle Market" (internal name unchanged); add "Referral / Origination Fee Agreement - EMB" - 1B: add Fitch Irick (FITC-IRICK) via FIXED_PAIR_AGREEMENTS — Wayne Dean + John Streer locked, CE/CCP still available; seed both producers as standing approvers - 2: NOCEA1 "No Client Executive" placeholder (0%/0%, no deduction, no email, auto-approved participant); CL/Bond get a mandatory CE dropdown defaulting to NOCEA1, other depts keep optional checkbox with NOCEA1 selectable - 3: replace dummy employee dropdown with real 112-person SWIA roster (idempotent) - 4: data-persistence safeguards — DO-NOT-RUN-IN-PROD guards on seed reset, Dockerfile, and producer/client upsert; all Round 5 migrations additive+idempotent - 5: Resend retry/backoff; final signed PDF now emailed to ALL parties (CM, producers, originator, CCP, real CE excl. NOCEA1, payroll); reset-send logging - 6: admin-created …108b32b
-
Wire real producer emails from roster + add OPERATIONS runbook
- producers_seed.json now carries each producer's real email (from the canonical producers CSV): e.g. Kathryn Faulkner=kdye@, Michael Banner= mbenner@, Banks Snellings=banks.snellings@. 69/71 have emails; 2 blank in source fall back to the auto-generated address. - start.py boot import + admin /api/data-refresh upload now set Producer.email from the data (real email wins over auto-generated; blank entries fall through to auto-assignment). - Add OPERATIONS.md: full architecture + data-flow + persistence (bucket) + producer/CE/client pipelines + auth lifecycle + runbook + gotchas. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>42cf381 -
Fix client lookup: stop pre-rendering 18,656 options (6.3MB -> 1.1MB page)
The form embedded all 18,656 clients THREE times (code <select> + name <select> + clientData JSON) = 6.3MB page, which choked browsers so the client dropdown wouldn't render. Fix (keeps the existing Filter-by-Code logic intact): - Both client dropdowns now start empty; they're filled on demand. - Existing "Filter by Code" (starts-with on code) unchanged, just sources from clientData as before. - Added matching "Filter by Name" (starts-with on name). - Sync + draft-restore add the chosen option on demand (ensureSelected). - Result: 6.3MB -> 1.1MB; client lookup renders and filters instantly. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>d734866 -
Fix: producers wiped from refresh by gitignored data file in CI
Root cause: refresh_data.json is gitignored (carries client PII), so on a fresh CI checkout it was absent -> build_refresh_data.py's load_existing_producers() returned [] -> the daily job uploaded 0 producers to the dataset -> every Space reboot reduced producers to the 11 seeded (Bella + locked-pairs). Clay Snellings and ~24 others vanished. Fix: - Add tracked producers_seed.json (35 people / 71 codes, names+codes only, no client PII) built from the canonical producers CSV. Includes Clay. - build_refresh_data.py now loads producers from producers_seed.json first (always present in CI), falling back to refresh_data.json. Breaks the cycle. Also pushed corrected refresh_data.json (71 producers + 18,656 clients) to the private dataset and restarted the Space to re-import. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>dfe063a -
Separate Client Executive list from Producers
- New ClientExecutive table (code/name/email/is_active), persisted in /data - Idempotent CE seed from ce_seed.json on empty table (7 SWIA CEs loaded); superadmin edits never overwritten on reboot - Admin "Manage Client Executives" page: add/edit/toggle/delete + bulk paste - Form CE pickers + rules_engine resolve CE name/code/email from the new table; CE's own email attaches to the approval Non-destructive — old logic kept as fallbacks, nothing removed: - engine reads ce_code OR legacy ce_prefix (old drafts still resolve) - CE-table lookup falls back to Producer lookup if code not found - CE <select> falls back to producers when CE list is empty - ABE suffix logic unchanged Verified: compute_summary output byte-identical across all 20 agreements. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>3c9f702 -
Merge remote-tracking branch 'origin/main'
6542ac9 -
Add user deletion + full superadmin control; fix migration DB path
User management: - Add DELETE /admin/api/users/{id} (superadmin): deletes deactivated, form-free users only; blocks self / active / users with submissions - Add Delete button in users.html (superadmin + inactive rows only) - update_user now edits email too, with duplicate-email guard - Trim seed_users to permanent superadmins (System Admin + Pramod) so deleted admins/users/self-signups are not resurrected on fresh init Persistence fix: - start.py derived its migration path from DATA_DB_PATH, which the Dockerfile pointed at a non-existent /data/app_data.db, so schema migrations silently no-op'd on the live /data/app.db. Now derive the path from DATABASE_URL (single source of truth) and retire DATA_DB_PATH Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>73b7619
-
Document client refresh pipeline + data-security design
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>2a68331 -
Secure client data: private HF dataset instead of public Space repo
- refresh_data.json removed from the public Space repo + git tracking (it was anonymously downloadable). Now lives in private dataset pramodmisra/pif-data. - start.py downloads it at boot via HF_TOKEN Space secret (stdlib urllib, graceful fallback, no new Space dependency). - upload_to_hf.py: sync to dataset + restart Space, compare-and-skip on no change. - Daily workflow: drop git commit-back; sync to dataset only. - caf.swia.ai Space stays PUBLIC and unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>565e87b -
Remove client data from public repo (now in private dataset)
Verified signaturede1afd6 -
Pull client data from private dataset at boot (remove public exposure)
Verified signature6c24c35 -
Wire daily client refresh from Google Sheet → HF Space
- scripts/build_refresh_data.py: fetch canonical client list from the PowerApps-synced Google Sheet (gid 1047572149), preserve curated producers, write refresh_data.json (18,656 clients; +127 incl SFMSSOU-02). - scripts/upload_to_hf.py: push to HF Space pramodmisra/pif (rebuild + re-import). - .github/workflows/daily-client-refresh.yml: cron 08:00 UTC daily. - Deprecate the never-wired Colab daily_refresh.py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>55541f5 -
chore: daily client refresh from Google Sheet
Verified signaturec86e94b
-
Add superadmin user edit endpoint and inline UI
Adds POST /admin/api/users/{id}/update for superadmin-only edits of full_name, role, and is_active, with guards against changing your own role or deactivating yourself. Surfaces an Edit button on each row in admin/users.html that swaps the row into an inline editor (name input, role select, active checkbox, Save/Cancel) so deactivated users can be reactivated and promoted without going through delete-and-recreate. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>f1f2b70
-
Send password-reset confirmation email after successful reset
Security best-practice: when a password is changed via the forgot-flow, the account holder should get an out-of-band notification so they can react fast if it wasn't them. Pair with a 'didn't do this?' contact line pointing at ai@snellingswalters.com. - email_service.py: new send_password_reset_confirmation template - auth_routes.py: fire it after db.commit() in POST /reset-password Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>fbac631 -
Fix naive/aware datetime crash in reset-password handler
GET/POST /reset-password compared SQLite-stored reset_token_exp (naive) against datetime.now(timezone.utc) (aware), raising TypeError on every real reset attempt. The bug has been latent since the feature shipped — it only surfaced today because password reset emails never delivered before the SendGrid→Resend switch (so the link was never clicked). Extract a small _token_expired() helper that coerces naive DB values to UTC-aware before comparing. Keeps the storage layer (SQLite naive) and the comparison layer (modern aware) decoupled so a future Postgres migration that returns aware datetimes will continue to work. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>a040293 -
Use Resend SDK instead of raw urllib for Cloudflare compatibility
The urllib-based POST to api.resend.com was rejected by Cloudflare with HTTP 403 / error code 1010 (browser-signature ban). The Resend Python SDK uses requests under the hood, whose TLS fingerprint and User-Agent pass Cloudflare's edge checks — matches the pattern used in unifi.ai and the rest of the 5gvector backend. - requirements.txt: pin resend==2.5.1 (same as unifi.ai) - email_service.py: replace urllib.request with resend.Emails.send; base64-encode attachment content per the SDK contract Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>03c65d2 -
Switch outbound email from SendGrid to Resend
Email never actually left the Space — SENDGRID_API_KEY was never set, so send_email() always fell into the log-only branch (password resets, approval requests, reminders, final PDFs all silently dropped). Other SWIA apps already use Resend with a verified domain, so reusing that key is the simplest fix. - config.py: replace SENDGRID_API_KEY with RESEND_API_KEY; add FROM_NAME - email_service.py: post to api.resend.com/emails (no SDK), base64 attachments, surface HTTPError body for easier diagnosis Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>d4674d6
-
v2.2: Round 4 — 4 Mentor agreements (MENTO3-6) + Bond Partner (Webb/Herron)
5 new agreement types with locked P1+P2 pairs and no CE/CCP layers. Mentor agreements emit Unvalidated/Validated year tables with a Mentor Code row in Unvalidated and a suffix-1 ABE transition to Standard Agreement in Validated. Bond Partner is a single "All Years" 15/50 split for Webb/Herron. - models: +locked_pair Boolean on commission_agreements - rules_engine: LOCKED_PAIR_AGREEMENTS dict forces P1/P2 codes, suppresses CE/CCP/Originator, injects Mentor Code row, ABE override for Validated - seed_db: +5 agreements with locked_pair=True, +10 producer rows - start.py: idempotent v2.2 schema + data migration; re-activates locked-pair producers after refresh_data.json import so they're not silently disabled - form.html: +p2_locked_display; AGREEMENT_VISIBILITY extended with lockedPair entries; updateFieldVisibility/resetProducerFields handle dual lock with Mentee/Mentor role labels - main.py: version 2.1.0 → 2.2.0 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.…99a1207
-
v2.1: SWIA rebrand, bell-ringer + accounting email removal, House Standard split, domain self-signup, superadmin self-service
Round 3 refinements + bell-ringer removal + domain login + superadmin operational autonomy. Branding - App title -> "SWIA Commission Agreement Intake" (v2.1.0) - Email subjects/templates updated; PDF/DOCX internal heading kept Bell ringer fully removed - Drop BellRingerThreshold table, intake_submissions.bell_ringer_triggered column - Idempotent migrations in start.py for existing DBs - Stripped from form, rules engine, PDF, DOCX, email, approval routing, admin panel - email_routing_rules row purged Email routing - Drop accounting@snellingswalters.com from seed and existing DBs - Final-PDF email no longer mentions bell ringer in subject/body Self-signup (Phase 3) - New /signup page restricted to @snellingswalters.com domain - Auto-creates active user, hands token, redirects to dashboard - Login page now links to /signup and /forgot-password Round 3 refinements - Rejection workflow: reason captured (>=10 chars), submitter emailed via send_rejection_notification, "Edit & Resubmit" c…8933003
-
Hide inactive users by default in admin panel with toggle to show
Inactive users are hidden from the admin user list by default. A "Show inactive users" checkbox reveals them with count indicator. No records are deleted — deactivated users remain in DB for foreign key integrity and audit purposes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>c66d7be -
Major feature update: DOCX generation, preview columns, bug fixes, dashboard enhancements
Activities completed: 1. Preview table: added Name & Code columns (7-col layout: Role|Name|Code|ABE|Agreement|Comm%|ProdCredit) 2. House Agreement: layers now deduct from 100% base (was incorrectly adding on top) 3. House Agreement: P1 hidden from commission table (kept in approval workflow) 4. Life Origination: fixed to apply All Years at 20% (was Year 1 only) 5. CE as Producer: required People Picker mode for Ceded Accounts, CCP deducts from CE 6. Submit safeguard: modal preview before submission with Confirm/Go Back buttons 7. Word document generation: populates DRAFT/FINAL .docx templates with full form data 8. Dashboard: agreement type, effective date, commission preview, approval timeline, status filters, soft-delete (hide) for finalized submissions 9. Email fallback: generates FirstInitial+LastName@snellingswalters.com when not in DB 10. Employee originator: expanded to 20 employees with search filter Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>ab38dce
-
Alert admin when producer emails are missing from a submission
When a form is submitted and any participants lack email addresses, sends a summary email to ai@snellingswalters.com listing the missing producers with a direct link to the Producer Emails admin page. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>a061388 -
Add user persistence, forgot password, and admin password reset
- seed_db: seed 7 default users (2 superadmin, 3 admin, 2 user) so accounts survive container rebuilds on HF Spaces - auth_routes: add /forgot-password (sends reset email via SendGrid) and /reset-password (token-based, 1hr expiry) - email_service: add send_password_reset template - admin_routes: add /api/users/{id}/reset-password for admin-triggered resets - admin/users.html: add "Reset PW" button per user - login.html: add "Forgot Password?" link and success message support Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>94c9f7a -
Fix seed_db NameError: remove segments reference from print statement
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>a77e248 -
Refactor commission intake: per-year tables, dept-only bell ringer, ABE status
Implements all changes from commission_intake_refactor_prompt.md: - rules_engine: per-year table output, P1-only deduction for Closer/Referral, fixed-code agreements (Gebhardt/Beacham), dept-only bell ringer thresholds, ABE status tracking, participants list for approval workflow - form.html: agreement type as primary driver (Section 2), dynamic field visibility via AGREEMENT_VISIBILITY config, CE/CCP as checkbox+picker, originator section for Referral, Gebhardt/Beacham auto-fill+lock, per-year preview tables, draft saving integration - form_routes: removed market_segment from template, updated bell ringer to dept-only, uses participants list for approval creation - pdf_generator: per-year tables (Role/Agreement Type/Commission%/Production%/ ABE Status), removed dollar amounts and market segment - approve.html: per-year table format matching new summary_data structure - seed_db: dept-only bell ringer thresholds (CL/CON/EB/PL/VAN), removed market_segment dropdown options…7ca810d
-
Upload refresh_data.json with huggingface_hub
Verified signaturecaecd6a
-
Upload refresh_data.json with huggingface_hub
Verified signature81d7153
-
Upload refresh_data.json with huggingface_hub
Verified signature9c75e17
-
Upload refresh_data.json with huggingface_hub
Verified signature6f06dd6
-
Add draft saving, user dashboard, and rename to Commission Agreement Intake Form
- Draft system: save/update/delete drafts via API, load drafts into form - User dashboard: shows drafts (edit/delete) and submitted forms with approval progress bars and collapsible approver details - Post-login redirects to dashboard instead of form - Nav bar: added Dashboard link, renamed Form to New Form - Login page and app title renamed from Producer Intake to Commission Agreement Intake Form - IntakeSubmission model: added updated_at, title columns; status default=draft; submitted_at nullable Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>c5de9ee -
Upload refresh_data.json with huggingface_hub
Verified signature66acb5f
-
Upload refresh_data.json with huggingface_hub
Verified signature1a6901f
-
Upload refresh_data.json with huggingface_hub
Verified signature51c303a
-
Upload refresh_data.json with huggingface_hub
Verified signature7d2f05e
-
Upload refresh_data.json with huggingface_hub
Verified signature8ceef9a
-
Upload refresh_data.json with huggingface_hub
Verified signature27e943e