Repository navigation
v1.1.0
1.1.0 (2026-10-14)
Features
- add the connected-app consent screen with step-up, and run the OAuth server in Production (#1144) (e40924b)
- agent-guard: refuse git writes in the shared checkout (#1217) (04dabbb)
- api: let OAuth clients register themselves, and sweep expired OAuth rows (#1137) (bd454b3)
- api: persist the Data Protection key ring in Postgres (#1125) (e033d26)
- api: run every fail-closed check on OAuth-authenticated requests (#1136) (4521319)
- api: stand up OpenIddict as an OAuth 2.1 authorization server (#1135) (4961d00)
- help: explain connecting AI apps to the farm's MCP address (#1218) (fa52b23)
- let an Owner turn connected apps off for the farm (#1147) (077f27e)
- let users and Owners see and disconnect connected apps (#1145) (a6729e4)
- mcp: add McpCallContext, the identity bridge for MCP tools (#1181) (3134800)
- mcp: map /mcp for connected apps, with role and scope gates on tools (#1195) (6502603)
- mcp: read tools for customers, orders, payments and balances (#1216) (ce3d5cb)
- mcp: read tools for flocks, stock, egg lots and daily entries (#1209) (0f341f0)
- mcp: record a draft daily entry through an MCP write tool (#1210) (1db5fe8)
- oauth: accept client ID metadata documents beside registration (#1152) (bd4e5ec)
- oauth: log rate-limit rejections on the OAuth endpoints as security events (#1174) (9f7efd4)
- record and show which connected app acted in the audit log (#1138) (9934ef7)
Bug fixes
- agent-guard: refuse gh api writes to main and the routes around push's checks (#1224) (833f007)
- api: ignore forwarded headers when no proxy is trusted, and close MCP audit gaps (#1260) (8c3ba0e)
- api: log client-aborted requests below Error (#1288) (56f04e6)
- api: name the bad MCP argument and log tool refusals below Error (#1238) (f18267f)
- api: revoke a connected app when the credential epoch supersedes it (#1248) (f32a7ec)
- apphost: pass the real API address as the OAuth issuer, and add the OAuth runbook (#1163) (a06f7ff)
- catalog: refuse stale product and packed-unit edits, and order daily-entry grade lines (#1256) (8bbcd27)
- deps: resolve .NET 10 packages to 10.0.13 for the October advisories (#1290) (5a2236d)
- mcp: harden /mcp from the audit (address budget, Origin, tool contracts) (#1225) (de61191)
- mcp: match flock names ignoring case, plain optional schema types, quiet idempotent replays (#1237) (e8726a7)
- sales: refresh the order's list row after a line changes (#1191) (91b8324)
- sales: scale a line's default and list price to its unit (#1166) (5c2b0c0)
- test: remove unused usings that break main's build (#1206) (9272270)
- web: await or handle the floating promises the linter suppressed (#1219) (113f6dc)
- web: bump brace-expansion override to ^5.0.12 (#1151) (e4ec534)
- web: correct the hook dependency lists the linter suppressed (#1220) (9ff55d9)
- web: fill the expanded Lay rate chart and allow ranges up to a year (#1162) (3e879b0)
- web: make consent page farm name and role badge readable in dark mode (#1231) (86c9b8b)
- web: observe the ExpandedLayRate region once the modal has portaled (#1213) (6025557)
Performance
Refactoring
- api: split AuthEndpoints into Login, Session and Password partials (#1241) (15a2676)
- api: split the endpoint groups out of Program.cs (#1257) (497e29e)
- domain: split ImageSanitizer into per-format partials (#1239) (4416cda)
- domain: split SalesOrder into per-type files in the same namespace (#1233) (adca545)
- identity: split IdentityProvider into feature partials (#1261) (67b3b7a)
- infra: split SimulationDataSeeder into per-phase partials (#1266) (87a3f4c)
- web: delete dead rules and split styles.css into area files (#1267) (315da37)
- web: split DailyEntryPage into dailyEntry/ siblings (#1262) (dc20462)
- web: split Dashboard.tsx into routes/dashboard/ (#1255) (8ed72a0)
- web: split errors, transport, session and refresh modules out of the API client (#1254) (b02648c)
- web: split FarmThemeProvider's theme overrides into farmThemeOverrides (#1253) (bae7db2)
- web: split FeedCaptureForm out of FeedPage (#1234) (1b5c802)
- web: split FlockDialogs out of FlocksPage (#1240) (c122b15)
- web: split HistoryPage into history/ modules (#1250) (4cc37d2)
- web: split i18n enum labels by area (#1235) (44fc30b)
- web: split NamedEntityPicker into a facade and namedEntityPicker/ modules (#1265) (4e7dd0e)
- web: split ProductDialogs out of ProductsPage (#1236) (fb4e3fd)
- web: split SalesPage into a sales feature folder (#1159) (25d4a58)
- web: split the API wrappers out of cluckwork.ts by area (#1264) (f6c770d)
- web: split the catalog dialogs, item panel and catalog listing out of InventoryPage (#1247) (c22ddd7)
- web: split the expenses dialogs, panels and edit state out of ExpensesPage (#1252) (2e4a36b)
- web: split the guide sections and glossary out of HelpPage (#1245) (9ef4a6f)
- web: split the row renderer, detail panel and filter bar out of AuditPage (#1242) (692bed3)
- web: split the settings sections and identity-image cards out of SettingsPage (#1251) (4470fd9)
- web: split the write-off dialog and lot-browser hook out of StockPage (#1244) (5fa72be)
- web: split UsersPage into per-dialog hooks and presentational dialogs (#1263) (e0f3e5c)
- web: split WaterCaptureForm out of WaterPage (#1243) (eb3b3f0)
Documentation
- plans: mark each planning record with its shipped status (#1198) (b6e5103)
- show the MCP and OAuth steps in the architecture diagrams (#1270) (4b859e9)
- trim the agent instruction files to the rules nothing else enforces (#1197) (7af27fd)
Container image
Deploy by digest — a tag can be moved, a digest cannot:
ghcr.io/mforce/cluckwork@sha256:dd01af31a165cdb24fb2e2e5c1c8c862208e8c64edc5862592d114647a3ca8b7
Machine-readable: the image.json asset on this release.
Verify the bytes came from this repo's CI before deploying:
# requires a prior `docker login ghcr.io` — an oci:// subject
# needs registry credentials. Full recipe: README, "Deploying".
gh attestation verify oci://ghcr.io/mforce/cluckwork@sha256:dd01af31a165cdb24fb2e2e5c1c8c862208e8c64edc5862592d114647a3ca8b7 \
--repo mforce/cluckwork \
--signer-workflow mforce/cluckwork/.github/workflows/ci.yml \
--source-ref refs/heads/main \
--bundle-from-oci