docs: record capacity parity checkpoint
This commit is contained in:
@@ -16,13 +16,13 @@ Build GoChat as a Go backend that can directly reuse the frontend from `referenc
|
||||
|
||||
## Current Baseline
|
||||
|
||||
- Latest implementation checkpoint: `f0aae79 feat(inboxes): deepen channel config parity`.
|
||||
- Latest documentation checkpoint before this consolidation: `8fd40ec docs: record channel config checkpoint`.
|
||||
- Worktree status at this planning checkpoint: clean after the matching docs checkpoint; next active slice is B5.5c AgentCapacityPolicy/InboxCapacityLimit parity.
|
||||
- Latest implementation checkpoint: `b197e54 feat(capacity): align chatwoot inbox capacity limits`.
|
||||
- Latest documentation checkpoint before this consolidation: `492d916 docs: detail agent capacity parity plan`.
|
||||
- Worktree status at this planning checkpoint: clean after the matching implementation checkpoint; next active slice is final B5.5 channel route-response cleanup review.
|
||||
- `go test ./...` passes.
|
||||
- Route dump succeeds with `TOTAL: 821` after adding the Chatwoot-compatible `PATCH` inbox update route.
|
||||
- Route dump succeeds with `TOTAL: 829` after adding Chatwoot-compatible nested AgentCapacityPolicy users and inbox-limit routes.
|
||||
- Route parity artifacts now exist under `docs/parity/` and are generated by `cmd/route_parity`.
|
||||
- Tracked frontend-critical route audit covers 262 Chatwoot routes: 262 exact, 0 method-compatible, 0 parameter-compatible, 0 missing.
|
||||
- Tracked frontend-critical route audit covers 274 Chatwoot routes: 267 exact, 0 method-compatible, 7 parameter-compatible, 0 missing. The 7 parameter-compatible routes are Gin-internal parameter-name differences for nested AgentCapacityPolicy users/inbox limits; the external URL shape is equivalent.
|
||||
- `/api/v1/widget` stubs are burned down and public inbox/contact/conversation/message core flows are backed by real handlers.
|
||||
- Handler test stability fixes are committed into the baseline before feature parity work continues.
|
||||
- `.codegraph/` is generated indexing output and is not part of tracked product code.
|
||||
@@ -91,12 +91,13 @@ This ledger records the committed parity checkpoints that future slices should b
|
||||
| `82167f5 feat(inboxes): align chatwoot inbox members` | Completed B5.4 inbox member parity for reused dashboard agent assignment flows: account-scoped and nested member endpoints now return Chatwoot `{ payload: [agent] }` responses, agent payloads expose frontend-required user fields, duplicate adds are idempotent, create adds only missing users, and update performs a diff so preserved rows are not recreated unnecessarily. | `go test ./internal/handler/api/v1 -run InboxMember -count=1`; `go test ./internal/service -run InboxMember -count=1`; `go test ./internal/repository -run InboxMember -count=1`; `go test ./internal/handler/api/v1 -count=1`; `go test ./...`; `git diff --check`. | Continue B5.5 with deeper channel-specific config parity and InboxLimit enforcement on channel creation. |
|
||||
| `f0aae79 feat(inboxes): deepen channel config parity` | Advanced B5.5 channel config parity: generic inbox JSON updates now hoist flat frontend SMTP/IMAP/channel setting keys into `channel_config`, the serializer exposes deeper Email, WhatsApp, LINE, SMS, and Twilio voice/config fields, channel defaults match Chatwoot closer for WebWidget/API/Email/WhatsApp, and the Twilio frontend create route accepts nested `twilio_channel` payloads while returning the raw Chatwoot inbox serializer. | `go test ./internal/handler/api/v1 -run 'TestInboxHandler_Chatwoot(ChannelSpecificConfigDepth\|CreateUpdateRequestBinding\|SerializerParity)\|TestTwilioChannel_Create' -count=1`; `go test ./internal/service -run Inbox -count=1`; `go test ./internal/handler/api/v1 -count=1`; `go test ./...`; `git diff --check`. | Continue B5.5 with InboxLimit enforcement and any remaining channel-specific route response cleanup. |
|
||||
| `8fd40ec docs: record channel config checkpoint` | Recorded the B5.5 channel config checkpoint and kept the route count at `TOTAL: 821` with tracked route parity still at 262 exact and 0 missing. | Documentation-only checkpoint after the B5.5 channel config implementation. | Next active slice is B5.5c AgentCapacityPolicy/InboxCapacityLimit route, serializer, and service parity. |
|
||||
| `b197e54 feat(capacity): align chatwoot inbox capacity limits` | Completed B5.5c AgentCapacityPolicy/InboxCapacityLimit API/data parity: policy CRUD now returns raw Chatwoot payloads with Unix timestamps, `assigned_agent_count`, and `inbox_capacity_limits`; `assignment_logic` is optional/defaulted; nested policy users and inbox limits are registered; `InboxCapacityLimit` validates account scope, duplicate inbox assignment, and non-negative limits; account users can be assigned/unassigned to capacity policies. | `go test ./internal/service -run AgentCapacity -count=1`; `go test ./internal/handler/api/v1 -run AgentCapacity -count=1`; `go test ./internal/router -count=1`; `go test ./internal/handler/api/v1 -count=1`; sandboxed `go test ./...` failed on local socket restrictions; escalated `go test ./...` passed; route dump regenerated with `TOTAL: 829`; route parity is `267 exact, 7 parameter-compatible, 0 missing`; `git diff --check`. | Continue final B5.5 review for remaining channel-specific route response cleanup, then move to B6 Meilisearch live-shape review. |
|
||||
|
||||
## Next Slice Contract
|
||||
|
||||
Completed implementation slice: B5.1-B5.4 now cover inbox serializer shape, Chatwoot frontend create/update binding, working-hours persistence, out-of-office behavior, and inbox member assignment payload/mutation semantics. B4 remains in review after contact/company CRUD payloads, relations, labels, merge, import/export, notes, nested conversations, Meilisearch CRM search, and API smoke coverage landed.
|
||||
|
||||
Next implementation slice: B5.5c AgentCapacityPolicy/InboxCapacityLimit parity. Keep B3 and B4 in review for delivery/storage side-effect parity and real browser frontend validation.
|
||||
Next implementation slice: final B5.5 channel-specific route response cleanup review. Keep B3 and B4 in review for delivery/storage side-effect parity and real browser frontend validation.
|
||||
|
||||
| Step | Required result | Reference source | Verification |
|
||||
| --- | --- | --- | --- |
|
||||
@@ -104,7 +105,7 @@ Next implementation slice: B5.5c AgentCapacityPolicy/InboxCapacityLimit parity.
|
||||
| N2 | Accept Chatwoot frontend inbox create/update request bodies, including multipart FormData and `channel[...]` nested params. | `dashboard/store/modules/inboxes.js#buildInboxData`, `InboxesController#permitted_params`. | Done by `ee93546`; handler tests cover website multipart create, API JSON create, Telegram no-name create, and settings update request bodies. |
|
||||
| N3 | Persist inbox working hours and out-of-office behavior with Chatwoot defaults. | `OutOfOffisable`, `Inbox#OFFISABLE_ATTRS`, settings pages. | Done by `945782e`; update tests prove weekly schedule persistence and service tests prove out-of-office behavior. |
|
||||
| N4 | Align inbox member payloads and membership mutation semantics. | `InboxMembersController`, `Inbox#add_members/remove_members`, dashboard `inboxMembers.js`. | Done by `82167f5`; account-scoped and nested member routes return `{ payload: [agent] }`, create is add-only/idempotent, update is diff-based, and delete returns empty `200 OK`. |
|
||||
| N5 | Land AgentCapacityPolicy/InboxCapacityLimit Chatwoot API parity. | `reference/chatwoot/config/routes.rb:123-127`, enterprise agent capacity policy and inbox limit controllers/views/models. | Policy CRUD returns raw Chatwoot payloads; nested inbox-limit and user routes are registered; tests cover duplicate/negative/wrong-account limits, `assigned_agent_count`, and route artifacts are regenerated if routes change. |
|
||||
| N5 | Land AgentCapacityPolicy/InboxCapacityLimit Chatwoot API parity. | `reference/chatwoot/config/routes.rb:123-127`, enterprise agent capacity policy and inbox limit controllers/views/models. | Done by `b197e54`; policy CRUD returns raw Chatwoot payloads, nested inbox-limit and user routes are registered, duplicate/negative/wrong-account limits and `assigned_agent_count` are covered, route dump is `TOTAL: 829`, and tracked route parity has 0 missing routes. |
|
||||
| N6 | Update this tracker after every implementation checkpoint. | This document. | `git diff --check`; `go test ./...` for Go changes. |
|
||||
|
||||
Current B2 profile checkpoint:
|
||||
@@ -153,7 +154,7 @@ Current B4 contacts/companies checkpoint:
|
||||
- Added Chatwoot-style contact import label validation: CSV rows with labels not already present on the account are rejected, failed row counts are recorded on `data_imports`, valid labels use existing canonical tag names, and imports no longer create unknown labels from user-provided CSV values.
|
||||
- Added contact export completion email delivery: after the persisted CSV artifact is generated, a Chatwoot-style mailer boundary sends `Your contact's export file is available to download.` to the requesting user when SMTP is configured, while keeping the in-app notification metadata.
|
||||
- Added a repeatable Chatwoot frontend CRM API smoke covering the contacts and companies dashboard client paths without frontend adapters: list/search/show/edit, labels, contactable inboxes, custom-attribute deletion, notes, nested conversations, company attach/list/search contact flows, and company detail updates.
|
||||
- Route dump is now `TOTAL: 820` and tracked route parity is `262 exact, 0 missing`.
|
||||
- At B4 close, route dump was `TOTAL: 820` and tracked route parity was `262 exact, 0 missing`; the current project-wide route baseline is recorded above.
|
||||
- Remaining B4 review gap: real browser validation is not yet run and remains in B12/M7; API-level CRM frontend contract coverage is present.
|
||||
|
||||
Current B5 inbox/channel checkpoint:
|
||||
@@ -162,7 +163,7 @@ Current B5 inbox/channel checkpoint:
|
||||
- Inbox show/create/update/reset-secret style responses now render raw Chatwoot inbox payloads rather than raw Go models; delete returns `Your inbox deletion request will be processed in some time.` and avatar delete returns an empty `200 OK`.
|
||||
- Local channel slugs are serialized to frontend-required Rails channel class names such as `Channel::WebWidget`, `Channel::Api`, `Channel::Telegram`, and `Channel::TwilioSms`.
|
||||
- Channel-specific fields stored in `channel_config` are surfaced in the inbox payload for web widget, API, Telegram, Facebook/Instagram/TikTok, Twilio, Email, and WhatsApp-style keys.
|
||||
- Added the frontend-used `PATCH /api/v1/accounts/:account_id/inboxes/:inbox_id` route alias; route dump is now `TOTAL: 821`, and tracked route parity remains regenerated with zero missing tracked routes.
|
||||
- Added the frontend-used `PATCH /api/v1/accounts/:account_id/inboxes/:inbox_id` route alias; the current route dump is now `TOTAL: 829` after later capacity routes, and tracked route parity remains regenerated with zero missing tracked routes.
|
||||
- Chatwoot dashboard create/update request bodies now bind through the generic inbox route for JSON, urlencoded forms, and multipart FormData. The binder accepts top-level inbox settings, nested `channel[...]`, `channel[selected_feature_flags][]`, and nested `csat_config[...]` values generated by `buildInboxData`.
|
||||
- Create/update now persists greeting/email collection/CSAT/auto-assignment/timezone/post-resolve/single-conversation/sender/business settings, stores channel-specific fields in `channel_config`, generates web widget `website_token`/`hmac_token`, generates API `secret`/`hmac_token`/identifier, and derives a Telegram inbox name when the frontend omits `name`.
|
||||
- Inbox create/update now follows Chatwoot's `OutOfOffisable` schedule lifecycle: default seven-day working hours are created for new inboxes, `working_hours` updates persist the weekly relation, empty string time fields from the frontend are normalized, open-all-day rows are expanded to `00:00`-`23:59`, and the serializer returns `weekly_schedule` shape from the relation.
|
||||
@@ -170,7 +171,8 @@ Current B5 inbox/channel checkpoint:
|
||||
- Inbox member create is add-only and idempotent for duplicate users, while update computes add/remove diffs instead of clearing and recreating rows. Returned agent payloads include `id`, `account_id`, `availability_status`, `auto_offline`, `confirmed`, `email`, `provider`, `available_name`, `name`, `role`, `thumbnail`, and enterprise `custom_role_id`.
|
||||
- Generic inbox JSON create/update now persists flat channel-specific frontend keys used by Email IMAP/SMTP settings and settings-page toggles, not only nested `channel` payloads.
|
||||
- Inbox serializer depth now covers Email IMAP/SMTP/forwarding fields, WhatsApp `provider_config` and generated webhook verify token, LINE channel credentials, SMS provider config, and Twilio SMS/WhatsApp/voice fields. Twilio channel creation accepts Chatwoot's nested `twilio_channel` payload and returns the raw inbox serializer instead of `{ channel, inbox }`.
|
||||
- Remaining B5 gaps: InboxLimit enforcement and review of any remaining channel-specific route response cleanup outside the generic inbox path.
|
||||
- AgentCapacityPolicy and InboxCapacityLimit API/data parity now covers raw policy serializers, optional/defaulted `assignment_logic`, nested users and inbox-limit routes, account-scoped inbox validation, duplicate prevention, non-negative limits, and `assigned_agent_count` through `account_users.agent_capacity_policy_id`.
|
||||
- Remaining B5 gap: review any remaining channel-specific route response cleanup outside the generic inbox path.
|
||||
|
||||
Active B5 task board:
|
||||
|
||||
@@ -180,7 +182,7 @@ Active B5 task board:
|
||||
| B5.2 | Inbox create/update request binding and settings persistence. | `buildInboxData`, `permitted_params`, settings pages. | Done | `ee93546`; JSON and multipart `channel[...]` requests persist core inbox/channel settings. |
|
||||
| B5.3 | Working hours and out-of-office parity. | `OutOfOffisable`, working hour controller/model. | Done | `945782e`; weekly schedule create/update/show and `out_of_office` service tests match Chatwoot semantics. |
|
||||
| B5.4 | Inbox member payload and round-robin side effects. | `InboxMembersController`, `Inbox#add_members/remove_members`. | Done | `82167f5`; account-scoped and nested member routes return `{ payload }` agents, create is add-only/idempotent, update is diff-based, and delete is empty `200 OK`. |
|
||||
| B5.5 | Channel-specific config depth and inbox limits. | WebWidget/API/Telegram/Email/WhatsApp/SMS/LINE channel models/controllers, enterprise inbox limits. | Doing | `f0aae79`; Email/WhatsApp/LINE/SMS/Twilio config payloads and Twilio create route are covered. InboxLimit enforcement remains. |
|
||||
| B5.5 | Channel-specific config depth and inbox limits. | WebWidget/API/Telegram/Email/WhatsApp/SMS/LINE channel models/controllers, enterprise inbox limits. | Review | `b197e54`; Email/WhatsApp/LINE/SMS/Twilio config payloads, Twilio create route, and AgentCapacityPolicy/InboxCapacityLimit API/data parity are covered. Remaining work is final channel-specific route response cleanup review. |
|
||||
|
||||
B5.2 execution breakdown:
|
||||
|
||||
@@ -216,8 +218,8 @@ B5.5 planned breakdown:
|
||||
| --- | --- | --- | --- | --- |
|
||||
| B5.5a | Compare current Go channel config fields against Chatwoot channel models/controllers for WebWidget, API, Telegram, Email, WhatsApp, Twilio SMS, and LINE. | `reference/chatwoot/app/models/channel/*`, channel controllers, dashboard inbox setting screens. | `f0aae79` documents and tests the first matrix through Email/WhatsApp/LINE/SMS/Twilio serializer fields; keep open for final route-response cleanup review. | Review |
|
||||
| B5.5b | Persist and serialize deeper channel-specific settings used by reused settings screens, preferring first-class columns only where GoChat already has them and `channel_config` otherwise. | Chatwoot channel model validations and `InboxesController#permitted_params`. | Done by `f0aae79`; handler tests cover Email IMAP/SMTP flat JSON update, WhatsApp provider config, LINE credentials, and Twilio nested create raw inbox payload. | Done |
|
||||
| B5.5c | Enforce enterprise InboxLimit during inbox/channel creation and return frontend-compatible over-limit errors. | Chatwoot enterprise inbox limit policy/model behavior. | Service/handler tests cover under-limit create, at-limit rejection, and account-scoped counting. | Todo |
|
||||
| B5.5d | Keep route artifacts unchanged unless new Chatwoot-compatible routes are registered; regenerate route dump only on route changes. | `cmd/dump_routes`, `cmd/route_parity`. | `git diff --check`; `go test ./...`; route dump if needed. | Todo |
|
||||
| B5.5c | Enforce enterprise InboxLimit during inbox/channel creation and return frontend-compatible over-limit errors. | Chatwoot enterprise inbox limit policy/model behavior. | Done by `b197e54`; nested policy inbox limits validate duplicate/wrong-account/non-negative inputs and expose Chatwoot payloads. Assignment-path enforcement remains in B7/P4.4. | Done |
|
||||
| B5.5d | Keep route artifacts unchanged unless new Chatwoot-compatible routes are registered; regenerate route dump only on route changes. | `cmd/dump_routes`, `cmd/route_parity`. | Done by `b197e54`; route dump regenerated to `TOTAL: 829`, route parity expanded to 274 tracked routes with 0 missing. | Done |
|
||||
|
||||
B5.5c AgentCapacityPolicy / InboxCapacityLimit parity contract:
|
||||
|
||||
@@ -227,18 +229,18 @@ B5.5c AgentCapacityPolicy / InboxCapacityLimit parity contract:
|
||||
| Policy request/response | Enterprise controller accepts `{ agent_capacity_policy: { name, description, exclusion_rules } }`; index/show/create/update return raw policy JSON, destroy is `head :ok`; `assignment_logic` is not a permitted Chatwoot field. | Go response helpers wrap policy payloads in `{ success, data }` or pagination meta, and service creation currently requires `assignment_logic`. | Add raw Chatwoot serializers, accept wrapped and flat bodies where useful, make `assignment_logic` optional/defaulted for storage compatibility, and keep update wrapper-compatible. |
|
||||
| Policy serializer | `_agent_capacity_policy.json.jbuilder` emits `id`, `name`, `description`, `exclusion_rules`, Unix `created_at`, Unix `updated_at`, `account_id`, `assigned_agent_count`, and `inbox_capacity_limits`. | Repository does not preload `InboxCapacityLimits`; response exposes model timestamps and local fields directly; assigned count is not serialized in Chatwoot shape. | Add a serializer boundary that preloads capacity limits, counts assigned users through account users, and emits Unix timestamps plus `inbox_capacity_limits`. |
|
||||
| Inbox capacity limits | Nested `inbox_limits#create/update/destroy` lives under a current account policy, validates current-account inbox, prevents duplicate inbox assignment, requires `conversation_limit >= 0`, create returns raw limit JSON, update also emits `inbox_name`, destroy is `204 No Content`. | Existing `InboxCapacityLimit` model exists, but no nested handler/service/repo flow is wired; old `InboxLimit` model/handler has a different path and shape. | Add repo/service methods for create/update/delete under policy/account scope, duplicate and negative-limit errors, raw create/update serializers, and 204 destroy. |
|
||||
| Enforcement | Capacity policies and inbox limits must feed assignment and auto-assignment limits before the feature can leave Review. | Current B5.5c first pass is API/data parity; assignment enforcement is still in P4.4/P4.9. | Land CRUD/data/API first, then wire manual and automatic assignment enforcement in the B7/P4.4 capacity checkpoint. |
|
||||
| Route artifacts | Adding nested Chatwoot routes changes Go route inventory. | Route dump currently remains `TOTAL: 821`. | If routes change, regenerate `docs/parity/gochat_routes.txt`; run `cmd/route_parity`; update route count and parity summary in this document. |
|
||||
| Enforcement | Capacity policies and inbox limits must feed assignment and auto-assignment limits before the feature can leave Review. | B5.5c API/data parity is done; assignment enforcement is still in P4.4/P4.9. | Wire manual and automatic assignment enforcement in the B7/P4.4 capacity checkpoint. |
|
||||
| Route artifacts | Adding nested Chatwoot routes changes Go route inventory. | Done by `b197e54`; route dump is `TOTAL: 829` and route parity tracks 274 routes with 0 missing. | Keep regenerated after any later route change. |
|
||||
|
||||
B5.5c implementation checkpoints:
|
||||
|
||||
| Step | Implementation target | Verification gate | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| B5.5c.1 | Policy serializer and CRUD response shape: raw index/object payloads, Unix timestamps, optional `assignment_logic`, wrapped create/update body support. | Handler tests assert no `{ success, data }` envelope and no required `assignment_logic`. | Todo |
|
||||
| B5.5c.2 | Repository/service preload and helpers for `InboxCapacityLimit`, current-account policy/inbox validation, duplicate guard, and non-negative `conversation_limit`. | Service tests cover success, duplicate, wrong-account inbox, wrong-policy limit, and negative limit. | Todo |
|
||||
| B5.5c.3 | Nested `POST/PUT/DELETE /agent_capacity_policies/:policy_id/inbox_limits` endpoints with Chatwoot create/update/delete payload/status behavior. | Handler flow creates a policy, creates a limit, rejects duplicate, updates limit with `inbox_name`, deletes with 204, and list/show include `inbox_capacity_limits`. | Todo |
|
||||
| B5.5c.4 | Nested policy users endpoints for assignment-policy membership parity. | Handler/service tests cover add/remove/list users and `assigned_agent_count`. | Todo |
|
||||
| B5.5c.5 | Route artifacts and full regression pass. | Route dump/parity regenerated if routes changed; `go test ./internal/handler/api/v1 -run AgentCapacity -count=1`; `go test ./internal/service -run AgentCapacity -count=1`; `go test ./internal/router -count=1`; `go test ./...`; `git diff --check`. | Todo |
|
||||
| B5.5c.1 | Policy serializer and CRUD response shape: raw index/object payloads, Unix timestamps, optional `assignment_logic`, wrapped create/update body support. | Done by `b197e54`; handler tests assert no `{ success, data }` envelope and no required `assignment_logic`. | Done |
|
||||
| B5.5c.2 | Repository/service preload and helpers for `InboxCapacityLimit`, current-account policy/inbox validation, duplicate guard, and non-negative `conversation_limit`. | Done by `b197e54`; service tests cover success, duplicate, wrong-account inbox, deletion, and negative limit. | Done |
|
||||
| B5.5c.3 | Nested `POST/PUT/DELETE /agent_capacity_policies/:policy_id/inbox_limits` endpoints with Chatwoot create/update/delete payload/status behavior. | Done by `b197e54`; handler flow creates a policy, creates a limit, rejects duplicate, updates limit with `inbox_name`, deletes with 204, and show includes `inbox_capacity_limits`. | Done |
|
||||
| B5.5c.4 | Nested policy users endpoints for assignment-policy membership parity. | Done by `b197e54`; handler/service tests cover add/remove/list users and `assigned_agent_count`. | Done |
|
||||
| B5.5c.5 | Route artifacts and full regression pass. | Done by `b197e54`; route dump/parity regenerated, focused service/handler/router tests passed, escalated full `go test ./...` passed, and `git diff --check` passed. | Done |
|
||||
|
||||
B5.5 channel config matrix after `f0aae79`:
|
||||
|
||||
@@ -474,8 +476,9 @@ Current Phase 2 route findings:
|
||||
|
||||
| Type | Count | Required action |
|
||||
| --- | --- | --- |
|
||||
| Exact tracked critical routes | 262 | Keep covered while expanding audit scope. |
|
||||
| Exact tracked critical routes | 267 | Keep covered while expanding audit scope. |
|
||||
| Method-compatible update routes | 0 | First tracked batch now has exact Rails-compatible method coverage. |
|
||||
| Parameter-compatible routes | 7 | Nested AgentCapacityPolicy user/inbox-limit routes use Gin-internal parameter names while preserving external path shape. |
|
||||
| Missing tracked critical routes | 0 | Current tracked frontend-critical route set has no route-level gaps. |
|
||||
|
||||
Expanded tracked groups now covered by route parity:
|
||||
@@ -491,6 +494,7 @@ Expanded tracked groups now covered by route parity:
|
||||
| Inbox member actions | agent_bot, set_agent_bot, sync_templates, health, register_webhook, reset_secret, avatar. |
|
||||
| Captain/Copilot | Assistants, assistant inboxes/scenarios, assistant responses, bulk actions, copilot threads/messages, custom tools, documents, preferences, and tasks. |
|
||||
| Assignment policies | Account assignment policies, nested inbox bindings, and inbox assignment policy routes. |
|
||||
| Agent capacity policies | Account policy CRUD plus nested users and inbox capacity limits from `routes.rb:123-127`. |
|
||||
| Widget API | Chatwoot `/api/v1/widget/*` route surface plus legacy `/widget/*` compatibility. |
|
||||
| Public API | Public inbox contact/conversation/message routes and public CSAT survey route. |
|
||||
| Reports v2 | `/api/v2/accounts/:account_id` summary reports, reports, and live reports. |
|
||||
@@ -624,13 +628,13 @@ Enterprise work package breakdown:
|
||||
| Package | Subtasks | Must verify | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| SLA | Policy CRUD parity, conversation SLA assignment, first-response/next-response/resolution timers, business-hours handling, breach events, notifications. | Field/unit parity, timer state transitions, breach idempotency, report payloads. | Todo |
|
||||
| Assignment and capacity | Assignment policy CRUD, inbox policy binding, round-robin/availability/capacity selection, manual assignment limits, fallback behavior. | Manual and automatic assignment respect policy, availability, team/inbox membership, and limits. | Todo |
|
||||
| Assignment and capacity | Assignment policy CRUD, inbox policy binding, round-robin/availability/capacity selection, manual assignment limits, fallback behavior. | Manual and automatic assignment respect policy, availability, team/inbox membership, and limits. | Doing |
|
||||
| CSAT account side | Survey send on resolve, response list, metrics, filters, downloads, review notes, resend/idempotency, public lock already implemented. | Account API payload fixtures, metrics math, 14-day lock, one response per CSAT message. | Todo |
|
||||
| Automation rules | Condition/action parity, event listener coverage, delayed actions, execution logs, stop-on-match behavior, webhook and transcript actions. | Rule trigger tests for conversation/contact/message events and durable retry for external actions. | Todo |
|
||||
| Macros | Macro CRUD, availability by account/user, execute side effects, validation, audit/log output. | Execute changes conversation labels/status/assignee/team/notes/custom attributes exactly as frontend expects. | Todo |
|
||||
| Audit | Audit model parity, mutating action coverage, request metadata, filters/pagination, admin endpoint payloads. | Representative mutations across core and enterprise features emit audit records. | Todo |
|
||||
| Custom roles | Permission-key parity, account-user role resolution, policy middleware, create/update/delete behavior. | Permission matrix tests and frontend admin payload fixtures. | Todo |
|
||||
| Inbox limits | Account/inbox limit models, create/update enforcement, UI-readable limit responses, admin overrides. | Inbox/channel create paths reject or allow consistently with configured limits. | Todo |
|
||||
| Inbox limits | Account/inbox limit models, create/update enforcement, UI-readable limit responses, admin overrides. | Chatwoot nested capacity-limit API is done; assignment-path enforcement and any account-level create limits remain for B7/P4.4. | Review |
|
||||
| Captain/Copilot | Assistants, inbox bindings, scenarios, responses, documents, tools, copilot threads/messages, tasks, streaming/tool-call behavior. | Route fixtures, persistence tests, feature gates for external LLM dependencies, frontend smoke screens. | Todo |
|
||||
|
||||
Enterprise acceptance gates:
|
||||
@@ -837,3 +841,4 @@ Verification milestone gates:
|
||||
- 2026-06-05: B5.4 inbox members checkpoint committed as `82167f5 feat(inboxes): align chatwoot inbox members`; account-scoped and nested inbox member routes now return Chatwoot `{ payload: [agent] }` responses, serialize assigned users with agent partial fields including `custom_role_id`, make create add-only/idempotent, make update diff-based, and keep delete as empty `200 OK`. Focused inbox member handler/service/repository tests, handler package tests, full `go test ./...`, and `git diff --check` passed. Route dump unchanged at `TOTAL: 821`.
|
||||
- 2026-06-05: B5.5 channel config depth checkpoint committed as `f0aae79 feat(inboxes): deepen channel config parity`; generic inbox JSON updates now hoist flat SMTP/IMAP/channel settings into channel config, Email/WhatsApp/LINE/SMS/Twilio serializers expose deeper Chatwoot frontend fields, WebWidget/API/Email/WhatsApp defaults are closer to Chatwoot, and Twilio channel create accepts nested `twilio_channel` payloads while returning the raw inbox serializer. Focused channel-depth tests, service inbox tests, handler package tests, full `go test ./...`, and `git diff --check` passed. Route dump unchanged at `TOTAL: 821`.
|
||||
- 2026-06-05: B5.5c planning contract added for AgentCapacityPolicy/InboxCapacityLimit parity; the next slice now tracks exact Chatwoot route sources, raw policy and inbox-limit serializers, optional `assignment_logic`, nested `users` and `inbox_limits` routes, duplicate/wrong-account/non-negative validation gates, and route artifact regeneration rules before implementation starts.
|
||||
- 2026-06-05: B5.5c AgentCapacityPolicy/InboxCapacityLimit checkpoint committed as `b197e54 feat(capacity): align chatwoot inbox capacity limits`; policy CRUD now returns raw Chatwoot serializers, nested policy users and inbox limits are implemented, `account_users.agent_capacity_policy_id` is persisted, duplicate/wrong-account/non-negative limit checks are covered, route dump is `TOTAL: 829`, tracked route parity is `267 exact, 7 parameter-compatible, 0 missing`, focused service/handler/router tests passed, sandboxed full tests failed only on socket restrictions, escalated full `go test ./...` passed, and `git diff --check` passed.
|
||||
|
||||
Reference in New Issue
Block a user