#2179 feat(rhodes-staging-sync): carry the remaining Rhodes API records into staging (SURTR-1645) (@kevalshahtrilogy, Surtr)
#1990 Remove after-Jan activity from January forecast (@vvp-trilogy, Aerie)
#1970 fix(dbt): reconcile All Program against legacy metrics (@vvp-trilogy, Aerie)
#7 008-dss-deploy-output (@mwrshah, DSS-Hub)
#6 007-production-branch-deploy (@mwrshah, DSS-Hub)
#5 006-dss-deploy-output (@mwrshah, DSS-Hub)
#4 005-dss-auto-deploy (@mwrshah, DSS-Hub)
#3 004-dss-oidc-deploy (@mwrshah, DSS-Hub)
#2 003-dss-auto-deploy (@mwrshah, DSS-Hub)
#1 Ground Salesforce DSS guidance in a fresh tenant discovery (@mwrshah, DSS-Hub)
#3875 fix(ai-budget): route 42-ds.com domain to the 42DS BU (@kevalshahtrilogy, Klair)
#3873 feat(mfr): net repurchase proceeds into acquisitions (@sanketghia, Klair)
#2177 Fix Q22 handler for orchestration run options (@sanketghia, Surtr)
#1967 fix(dbt): restore Finalsite total and future paid deposits (@vvp-trilogy, Aerie)
#1966 fix(dbt): use Finalsite-only Forecast in-progress deposits (@vvp-trilogy, Aerie)
#1962 fix(dbt): restore next-year enrollment from SIS cohort counts (@vvp-trilogy, Aerie)
#1961 fix(dbt): restore next-year first-day enrollment from SIS (@vvp-trilogy, Aerie)
#1960 fix(dbt): source next-year new enrollment from SIS first-day facts (@vvp-trilogy, Aerie)
#1959 fix(dbt): restore declined re-enrollment from qualified SIS outcomes (@vvp-trilogy, Aerie)
#1957 fix(dbt): align re-enrolled counts with following-year SIS facts (@vvp-trilogy, Aerie)
#1958 fix(dbt): align pending re-enrollment with following-year SIS facts (@vvp-trilogy, Aerie)
#1963 fix(dbt): share resolved forecast headline with All Program (@vvp-trilogy, Aerie)
#1956 fix(dbt): source coming withdrawals from SIS cohort (@vvp-trilogy, Aerie)
#1951 fix(dbt): source coming enrollments from SIS report cohort (@vvp-trilogy, Aerie)
#1955 fix(dbt): source graduating students from SIS cohort (@vvp-trilogy, Aerie)
#1953 Events report: filter contacts by funnel count (@vvp-trilogy, Aerie)
#1952 fix(admissions): read event start times as UTC and show them in the viewer's timezone (AERIE-2378) (@marcusdAIy, Aerie)
#1950 fix(public-api): honor change-history limits up to 100 and fill filtered pages (AERIE-2456) (@marcusdAIy, Aerie)
#1946 fix(dbt): restore All Program utilization precision (@vvp-trilogy, Aerie)
#1948 test(chat): apply the 30s test timeout to every Vitest project (@marcusdAIy, Aerie)
#1947 fix(public-api): capture the demographics refresh 503 as an expected outcome (AERIE-2881) (@marcusdAIy, Aerie)
#1945 fix(dbt): align All Program enrollment with SIS report (@vvp-trilogy, Aerie)
#1944 fix(dbt): restore All Program capacity parity (@vvp-trilogy, Aerie)
#1942 dbt: publish governed all-program mart (@vvp-trilogy, Aerie)
#2173 feat(education): accept additive CBA BU perimeter changes (@sanketghia, Surtr)
#1939 feat(public-api): bounded per-key rate-limit overrides with an expiry (@kevalshahtrilogy, Aerie)
#2172 fix(retention): accept withdrawal-on-report-start boundary residual (SURTR-1213) (@kevalshahtrilogy, Surtr)
#2171 fix(education): accept GuidePlatform schema drift on five relations (SURTR-1016, SURTR-1588) (@kevalshahtrilogy, Surtr)
#2170 fix(truefoundry-gateway-pipeline): reconcile against the ungrouped API total (SURTR-1526) (@kevalshahtrilogy, Surtr)
#1936 fix(public-api): accept Completing Construction as a document upload link once stored (@kevalshahtrilogy, Aerie)
#3872 revert(performance-review): load BU catalog from master mapping (@sanketghia, Klair)
#2169 Q22: classify Central classes and enable on-demand refresh (@sanketghia, Surtr)
#1931 fix(public-api): serve unparseable forecast and event dates as null instead of the raw value (AERIE-2377) (@marcusdAIy, Aerie)
#1928 fix(public-api): fill in-memory admissions student pages past unreferenced rows (AERIE-2351) (@marcusdAIy, Aerie)
#1927 fix(public-api): fill filtered expense transaction pages across source slices (AERIE-2406) (@marcusdAIy, Aerie)
#1926 docs(public-api): state v2 rate-limit tiers and 429 handling in the skill and DSS front (AERIE-2439) (@marcusdAIy, Aerie)
#1925 docs(public-api): point readers to compliance.ahj and site notes when ahjPersonnel is empty (AERIE-2533) (@marcusdAIy, Aerie)
#3 Restore exact original dictionary bytes and pin fidelity regression (@caina-barbosa, UniFi-Network-DSS)
#1924 docs(public-api): document retired buildout phase fields as always null (AERIE-2395) (@marcusdAIy, Aerie)
#2 Publish deployed Network enablement and acceptance evidence (@caina-barbosa, UniFi-Network-DSS)
#1921 docs(public-api): define Program demographics rows in the dictionary (AERIE-2449) (@marcusdAIy, Aerie)
#1 Add direct read-only UniFi Network DSS and scoped release foundation (@caina-barbosa, UniFi-Network-DSS)
#1920 fix(reference-sync): capture missing-active-link publish refusal as expected outcome (AERIE-2874) (@marcusdAIy, Aerie)
#1929 test(global-documents): give the 300-row admin page listing test a 30s timeout (@marcusdAIy, Aerie)
#1919 fix(public-api): capture an incomplete Article identity migration as an expected outcome (AERIE-2875) (@marcusdAIy, Aerie)
#1 Expose Healthy Air dictionary through read-only DSS adapter (@caina-barbosa, Healthy-Air-DSS)
#2 Expose bounded Protos reads through the DSS template (@caina-barbosa, Protos-DSS)
#1 Configure isolated Protos deployment foundation (@caina-barbosa, Protos-DSS)
#1915 fix(public-api): define enrollment schoolYear and student grade, and reject malformed years (AERIE-2433, AERIE-2434) (@marcusdAIy, Aerie)
#1914 docs(public-api): define the remaining SiteCompliance fields in the v2 dictionary (AERIE-2141) (@marcusdAIy, Aerie)
#1913 docs(public-api): define legal-entity profile fields in the v2 dictionary (AERIE-2431) (@marcusdAIy, Aerie)
#1912 docs(public-api): add dictionary fields for facilities area, building count, and capacity asOf (@marcusdAIy, Aerie)
#1911 fix(finance): bound the Expense Analysis transactions query (@marcusdAIy, Aerie)
#1910 fix(public-api): capture unpublished event-contact snapshots as expected outcomes (@marcusdAIy, Aerie)
#2126 fix(financials): persist reviewed QuickBooks account categories (@ashwanth1109, Surtr)
#21 feat(infra): move Rhodes DSS to rhodes-dss.com, keep rhodes-dss.klair.ai working (@kevalshahtrilogy, Rhodes-DSS)
#2166 Fix Master Mapping raw COPY stage defaults (@sanketghia, Surtr)
#2163 Add manual Master Mapping sync and guarded local writer (@sanketghia, Surtr)
#2164 feat: implement Q22 company attribution policy (@sanketghia, Surtr)
#3871 feat(performance-review): load BU catalog from master mapping (@sanketghia, Klair)
#3869 feat(master-mapping): register new Education BUs (@sanketghia, Klair)
#1884 Events report: switch consumers to direct HubSpot mart (@vvp-trilogy, Aerie)
#3 Fix observed Zello channel detail response shape (@caina-barbosa, Zello-DSS)
#2 Deliver Zello datasets and dictionary workflows (@caina-barbosa, Zello-DSS)
#2 Expose read-only UniFi inventory and Protect camera metadata (@caina-barbosa, UniFi-Security-DSS)
#1 Configure isolated Zello DSS foundation (@caina-barbosa, Zello-DSS)
#1 Configure isolated UniFi Security DSS foundation (@caina-barbosa, UniFi-Security-DSS)
#1908 docs(public-api): add dictionary fields for compliance outcomes and buildout phase facts (@marcusdAIy, Aerie)
#1907 docs(public-api): give every served due-diligence key a dictionary field (@marcusdAIy, Aerie)
#1905 docs(public-api): name the source and fields of finance.expenseAnalysis (@marcusdAIy, Aerie)
#1903 fix(rhodes): refuse document Drive links the service account can't open (@marcusdAIy, Aerie)
#1932 feat(education): activate Marauder's Map ingestion (@benji-bizzell, Surtr)
#1902 fix(public-api): name the cause of a rejected document upload (@marcusdAIy, Aerie)
#1901 dbt: remove legacy EduCRM source package and Pipeline crosswalk reads (@vvp-trilogy, Aerie)
#1900 Fix forecast total equation wrapping (@vvp-trilogy, Aerie)
#1891 dbt: own Forecast conversion rates from typed HubSpot facts (@vvp-trilogy, Aerie)
#1897 fix(public-api): read v1 expense vendors page by page instead of past Convex's read limit (@marcusdAIy, Aerie)
#1896 fix(rhodes): surface searchSiteDocuments site and permission rejections instead of a generic unavailable error (@marcusdAIy, Aerie)
#1894 fix(api-v2): classify admissions resource-refs readiness 503 as an expected outcome (@marcusdAIy, Aerie)
#1895 fix(rhodes-worker): reject an unreadable site Drive file instead of reporting verification unavailable (@marcusdAIy, Aerie)
#1893 Admissions API: expose by-level forecast on January milestone (@vvp-trilogy, Aerie)
#1887 dbt: replace legacy Pipeline mart with typed HubSpot facts (@vvp-trilogy, Aerie)
#1890 fix(dbt): align typed program reportability (@vvp-trilogy, Aerie)
#20 feat(dss): publish the quality-bar catalog and changed-since sweeps (@kevalshahtrilogy, Rhodes-DSS)
#1860 feat(public-api): lastChangedAt on Portfolio sites and a changedSince list filter (AERIE-2855) (@kevalshahtrilogy, Aerie)
#1859 feat(public-api): serve the quality-bar scoring catalog (AERIE-2854) (@kevalshahtrilogy, Aerie)
#1886 dbt: retire legacy enrollment parity harness (@vvp-trilogy, Aerie)
#1885 dbt: replace EduCRM all_program with typed HubSpot programs (@vvp-trilogy, Aerie)
#3 Clarify uncaptured security feedback in reading rules (@caina-barbosa, Marauders-Map-DSS)
#2 Serve the Marauders Map dictionary from September snapshots (@caina-barbosa, Marauders-Map-DSS)
#1 Deploy isolated Marauders Map DSS foundation (@caina-barbosa, Marauders-Map-DSS)
#1883 Events report: preserve is_brought_by_event semantics (@vvp-trilogy, Aerie)
#1872 Events report: add direct HubSpot event mart (@vvp-trilogy, Aerie)
#1875 fix(rhodes): fail a Drive upload terminally when the uploaded file does not match the approval (@marcusdAIy, Aerie)
#1874 feat(education): name regulatory approval cards (@benji-bizzell, Aerie)
#1869 fix(work-management): report user-directory readiness instead of integrity failure on reads (@marcusdAIy, Aerie)
#1850 Admissions Forecast: display January forecast by level (@vvp-trilogy, Aerie)
#1863 fix(school-ops): validate operating sites one at a time so one bad record can't 502 the dashboard (@marcusdAIy, Aerie)
#1867 fix(rhodes): pause standalone registerDocument proposals that have no file or link (@marcusdAIy, Aerie)
#1866 fix(public-api): return Rhodes note userError rejections as 400s instead of opaque 500s (@marcusdAIy, Aerie)
#2160 fix(aws-spend): map Core Education RDS accounts (@caina-barbosa, Surtr)
#1854 chore(task-board): remove completed rollout scaffolding (AERIE-2852) (@caina-barbosa, Aerie)
#1861 fix(agent-gateway): return Drive's folder search-scope limit to the agent instead of a transient Rhodes MCP failure (@marcusdAIy, Aerie)
#1847 fix(task-board): allow delayed daily digest starts (AERIE-2848) (@caina-barbosa, Aerie)
#1857 fix(rhodes): diagnosable approval-token errors and expected throttling outcome (@marcusdAIy, Aerie)
#1858 fix(portfolio): surface Due Diligence draft conflicts to the client as ConvexErrors (@marcusdAIy, Aerie)
#1855 fix(portfolio): record Portfolio Fields network-layer fetch failures as expected outcomes (@marcusdAIy, Aerie)
#1856 fix(portfolio): soft-fail the fields route current-user lookup (@marcusdAIy, Aerie)
#1853 fix(api-v2): classify admissions person-refs readiness 503 as an expected outcome (@marcusdAIy, Aerie)
#1852 fix(admissions): polish pipeline report headers (@vvp-trilogy, Aerie)
#1838 feat(document-knowledge): read native Google Sheets through the Sheets API (AERIE-2842) (@marcusdAIy, Aerie)
#1845 fix(reconciliation): make commit proposals receipt-owned (AERIE-2837) (@caina-barbosa, Aerie)
#1843 fix(tasks): keep controls visible while task results refresh (@caina-barbosa, Aerie)
#1844 Admissions Pipeline: separate Community group (@vvp-trilogy, Aerie)
#2158 feat(ai-spend-reconciliation): send the monthly report to Finance and budget leads (@kevalshahtrilogy, Surtr)
#1839 feat(dbt): add per-level admissions enrollment forecast (#1837) (@vvp-trilogy, Aerie)
#1832 Improve Task Site document linking with search (@caina-barbosa, Aerie)
#3867 fix(renewals): refine flat labels and backend logging (@mwrshah, Klair)
#2141 feat(q22): add Bills, Vendor Credits, Deposits and deprecate legacy marts (@sanketghia, Surtr)
#3868 fix(mfr): prioritize cash flags for TB entries (@sanketghia, Klair)
#3863 feat(ai-spend): credit keyless Claude Code dollars to the person in the BU allocation (@kevalshahtrilogy, Klair)
#3862 feat(ai-spend): credit keyless Claude Code dollars to the person in fct_ai_spend (@kevalshahtrilogy, Klair)
#1836 fix(document-knowledge): report Drive's export size cap as too_large (AERIE-2836) (@marcusdAIy, Aerie)
#1834 feat(global-docs): run managed Drive link conversion hourly (AERIE-2841) (@marcusdAIy, Aerie)
#1833 fix(task-board): repair production task indexes (AERIE-2744) (@caina-barbosa, Aerie)
#1829 fix(portfolio): keep the School Chain catalog subscription quiet during the auth handshake (AERIE-2818) (@marcusdAIy, Aerie)
#1828 fix(agent): classify unreachable Rhodes as a transient upstream failure (AERIE-2829) (@marcusdAIy, Aerie)
#1827 fix(education): classify the legacy education warehouse gate as an expected outcome (AERIE-2827) (@marcusdAIy, Aerie)
#1825 fix(api-v2): classify site-notes and user-directory readiness 503s as expected outcomes (@marcusdAIy, Aerie)
#1824 fix(api-v2): keep the cause of milestone_data_unavailable on the captured Platform Error (@marcusdAIy, Aerie)
#1831 fix(rhodes): reject unresolvable DRI values in site metadata with a typed error (AERIE-2815, AERIE-2790) (@marcusdAIy, Aerie)
#3864 feat(renewals): refine flat sorting, sidebar filters, and ARR tables (@mwrshah, Klair)