docs: expand help center route parity tracking
This commit is contained in:
@@ -107,6 +107,35 @@ var criticalRoutes = []route{
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/search/contacts", Controller: "api/v1/accounts/search#contacts", Source: "routes.rb:175"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/search/articles", Controller: "api/v1/accounts/search#articles", Source: "routes.rb:176"},
|
||||
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals", Controller: "api/v1/accounts/portals#index", Source: "routes.rb:385"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals", Controller: "api/v1/accounts/portals#create", Source: "routes.rb:385"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals/:portal_id", Controller: "api/v1/accounts/portals#show", Source: "routes.rb:385"},
|
||||
{Method: "PUT", Path: "/api/v1/accounts/:account_id/portals/:portal_id", Controller: "api/v1/accounts/portals#update", Source: "routes.rb:385"},
|
||||
{Method: "PATCH", Path: "/api/v1/accounts/:account_id/portals/:portal_id", Controller: "api/v1/accounts/portals#update", Source: "routes.rb:385"},
|
||||
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/portals/:portal_id", Controller: "api/v1/accounts/portals#destroy", Source: "routes.rb:385"},
|
||||
{Method: "PATCH", Path: "/api/v1/accounts/:account_id/portals/:portal_id/archive", Controller: "api/v1/accounts/portals#archive", Source: "routes.rb:387"},
|
||||
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/portals/:portal_id/logo", Controller: "api/v1/accounts/portals#logo", Source: "routes.rb:388"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals/:portal_id/send_instructions", Controller: "api/v1/accounts/portals#send_instructions", Source: "routes.rb:389"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals/:portal_id/ssl_status", Controller: "api/v1/accounts/portals#ssl_status", Source: "routes.rb:390"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories", Controller: "api/v1/accounts/categories#index", Source: "routes.rb:392"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories", Controller: "api/v1/accounts/categories#create", Source: "routes.rb:392"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id", Controller: "api/v1/accounts/categories#show", Source: "routes.rb:392"},
|
||||
{Method: "PUT", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id", Controller: "api/v1/accounts/categories#update", Source: "routes.rb:392"},
|
||||
{Method: "PATCH", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id", Controller: "api/v1/accounts/categories#update", Source: "routes.rb:392"},
|
||||
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id", Controller: "api/v1/accounts/categories#destroy", Source: "routes.rb:392"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals/:portal_id/categories/reorder", Controller: "api/v1/accounts/categories#reorder", Source: "routes.rb:393"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/translate", Controller: "api/v1/accounts/articles/bulk_actions#translate", Source: "routes.rb:397"},
|
||||
{Method: "PATCH", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/update_status", Controller: "api/v1/accounts/articles/bulk_actions#update_status", Source: "routes.rb:398"},
|
||||
{Method: "PATCH", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/update_category", Controller: "api/v1/accounts/articles/bulk_actions#update_category", Source: "routes.rb:399"},
|
||||
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/delete_articles", Controller: "api/v1/accounts/articles/bulk_actions#delete_articles", Source: "routes.rb:400"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles", Controller: "api/v1/accounts/articles#index", Source: "routes.rb:403"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles", Controller: "api/v1/accounts/articles#create", Source: "routes.rb:403"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id", Controller: "api/v1/accounts/articles#show", Source: "routes.rb:403"},
|
||||
{Method: "PUT", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id", Controller: "api/v1/accounts/articles#update", Source: "routes.rb:403"},
|
||||
{Method: "PATCH", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id", Controller: "api/v1/accounts/articles#update", Source: "routes.rb:403"},
|
||||
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id", Controller: "api/v1/accounts/articles#destroy", Source: "routes.rb:403"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/portals/:portal_id/articles/reorder", Controller: "api/v1/accounts/articles#reorder", Source: "routes.rb:404"},
|
||||
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/", Controller: "api/v1/accounts/inboxes#index", Source: "routes.rb:252"},
|
||||
{Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/", Controller: "api/v1/accounts/inboxes#create", Source: "routes.rb:252"},
|
||||
{Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id", Controller: "api/v1/accounts/inboxes#show", Source: "routes.rb:252"},
|
||||
|
||||
@@ -37,14 +37,14 @@ Hermes plan landing map:
|
||||
|
||||
## Current Baseline
|
||||
|
||||
- Current tracking checkpoint: 2026-06-06 after this implementation checkpoint, prepared as `feat(help-center): align article payloads`.
|
||||
- Current tracking checkpoint: 2026-06-06 after this audit/tooling checkpoint, prepared as `docs: expand help center route parity tracking`.
|
||||
- Latest implementation checkpoint: this checkpoint, prepared as `feat(help-center): align article payloads`.
|
||||
- Latest documentation-only checkpoint: this checkpoint, prepared as `docs: lock parity execution tracker`; this document is now the active follow-up plan and supersedes `.hermes/plans/*`.
|
||||
- Worktree status at this implementation checkpoint: P3.7c help center article parity now matches the reused dashboard `helpCenter/articles.js` client and Chatwoot `ArticlesController`/`Articles::BulkActionsController`/Jbuilder surface for the dashboard article path: no-trailing-slash `GET/POST /portals/:portal_id/articles`, frontend `PATCH /articles/:article_id`, `PATCH /articles/bulk_actions/update_status`, `PATCH /articles/bulk_actions/update_category`, `DELETE /articles/bulk_actions/delete_articles`, and `POST /articles/bulk_actions/translate` are registered; portal route IDs resolve by account-scoped slug with numeric fallback; create/update accept raw frontend article bodies plus `{ article: ... }`; create/show/edit/update/list/search return Chatwoot `{ payload }` or `{ payload, meta }` article serializers with category, author, views, Unix `updated_at`, `meta`, and associated article payloads; delete/reorder/bulk updates return empty `200 OK`; reorder accepts Chatwoot `positions_hash`; bulk action errors return `422 { error }`; and scoped repository/service methods keep mutations inside the resolved portal. P3.7a portal and P3.7b category parity are already in Review. Campaign create/update already mirrors Chatwoot `Campaign#ensure_correct_campaign_attributes`; account campaign CRUD already matches the reused dashboard `campaigns` store and Chatwoot Jbuilder contract. Agent/settings/profile/notification/contact/custom-field/report enterprise drifts listed below remain at their prior checkpoint states. The fresh placeholder audit found remaining `chatwootParityStub` routes only in webhook handler-not-injected fallbacks, not in the reused dashboard account/contact/conversation/message/inbox critical path. P3.6 custom filters/custom attribute definitions and label CRUD are already in Review. B11.1a-B11.3e Captain/Copilot slices remain in Review; B12.1/B12.2/B12.3 smoke harnesses remain in Review; P5 durable job work through P5.13b is in Review. Next active implementation slice is Phase 2/3 drift audit or Phase 6 placeholder burn-down from fresh reference/smoke evidence.
|
||||
- Latest documentation/tooling checkpoint: this checkpoint, prepared as `docs: expand help center route parity tracking`; this document is now the active follow-up plan and supersedes `.hermes/plans/*`.
|
||||
- Worktree status at this audit/tooling checkpoint: Route parity tracking now includes the Chatwoot help-center portal/category/article route family from `reference/chatwoot/config/routes.rb:385-404`, so the audited critical set covers portal CRUD/member actions, nested categories, nested articles, and article bulk actions. P3.7c help center article parity matches the reused dashboard `helpCenter/articles.js` client and Chatwoot `ArticlesController`/`Articles::BulkActionsController`/Jbuilder surface for the dashboard article path: no-trailing-slash `GET/POST /portals/:portal_id/articles`, frontend `PATCH /articles/:article_id`, `PATCH /articles/bulk_actions/update_status`, `PATCH /articles/bulk_actions/update_category`, `DELETE /articles/bulk_actions/delete_articles`, and `POST /articles/bulk_actions/translate` are registered; portal route IDs resolve by account-scoped slug with numeric fallback; create/update accept raw frontend article bodies plus `{ article: ... }`; create/show/edit/update/list/search return Chatwoot `{ payload }` or `{ payload, meta }` article serializers with category, author, views, Unix `updated_at`, `meta`, and associated article payloads; delete/reorder/bulk updates return empty `200 OK`; reorder accepts Chatwoot `positions_hash`; bulk action errors return `422 { error }`; and scoped repository/service methods keep mutations inside the resolved portal. P3.7a portal and P3.7b category parity are already in Review. Campaign create/update already mirrors Chatwoot `Campaign#ensure_correct_campaign_attributes`; account campaign CRUD already matches the reused dashboard `campaigns` store and Chatwoot Jbuilder contract. Agent/settings/profile/notification/contact/custom-field/report enterprise drifts listed below remain at their prior checkpoint states. The fresh placeholder audit found remaining `chatwootParityStub` routes only in webhook handler-not-injected fallbacks, not in the reused dashboard account/contact/conversation/message/inbox critical path. P3.6 custom filters/custom attribute definitions and label CRUD are already in Review. B11.1a-B11.3e Captain/Copilot slices remain in Review; B12.1/B12.2/B12.3 smoke harnesses remain in Review; P5 durable job work through P5.13b is in Review. Next active implementation slice is Phase 6 placeholder burn-down or a new Phase 2/3 drift slice from fresh reference/smoke evidence.
|
||||
- `go test ./...` passes.
|
||||
- Route dump succeeds with `TOTAL: 860` after adding no-trailing-slash article index/create aliases, frontend-used article PATCH update route, and frontend article bulk-action routes.
|
||||
- Route parity artifacts now exist under `docs/parity/` and are generated by `cmd/route_parity`.
|
||||
- Tracked frontend-critical route audit covers 277 Chatwoot routes: 270 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.
|
||||
- Tracked frontend-critical route audit covers 305 Chatwoot routes: 298 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.
|
||||
@@ -87,7 +87,7 @@ Open work after the current checkpoint:
|
||||
| Phase 5 jobs | Keep B9.3 in Review and open only evidence-backed drift slices for new async gaps. | `Phase 5: Background Jobs And Integrations` | Automation tests prove remaining action side effects and reference inspection proves no delayed action params remain. |
|
||||
| B12 smoke | Run optional live API/browser/enterprise smoke in a full PostgreSQL/Redis/Meilisearch/Vite environment and convert failures into named slices. | `B12 reused frontend verification breakdown` | `docs/parity/frontend_smoke_report.md` records checked pass/fail results and maps failures to slices. |
|
||||
| P3.7 help center | Portal, category, and article route/payload parity are in Review for the inspected dashboard client paths. | `Open Checkpoint Contracts`, `Phase 3` | Reused Chatwoot help-center dashboard clients can call portal/category/article APIs without adapters. |
|
||||
| Phase 2/3 drift | Expand tracked route/serializer fixtures when B12 exposes frontend-critical gaps. | `Phase 2`, `Phase 3`, `docs/parity/` | Route parity remains 0 missing for tracked frontend routes; serializers have reference fixtures. |
|
||||
| Phase 2/3 drift | Help-center portal/category/article routes from `routes.rb:385-404` are now in the tracked critical set; expand the next route/serializer fixtures only from B12 failures or fresh reference/frontend inspection. | `Phase 2`, `Phase 3`, `docs/parity/` | Route parity remains 0 missing for tracked frontend routes; serializers have reference fixtures. |
|
||||
| Phase 6 placeholders | Re-run placeholder audit and burn down any frontend-reachable stub. | `Phase 6: Core Product Placeholder Burn-down` | Stub list has no reused-frontend critical path without a named owner. |
|
||||
|
||||
## Execution Snapshot
|
||||
@@ -109,7 +109,7 @@ This table is the shortest authoritative handoff view. If an older lower section
|
||||
|
||||
| Priority | Workstream | Current state | Next checkpoint | Commit close rule |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Phase 2/3 drift | Tracked route parity is 0 missing for the current critical set; notification list/action serializers, user notification-settings raw payloads, campaigns raw payload/display-id routes, Devise password reset/confirmation payloads, CRM shared attachment payloads plus fixed 100-row attachment pagination, account/settings payloads, assignable-agent payloads, agent index full-list behavior, agent create/update/delete defaults/errors/scope, label CRUD payloads, custom filters, custom attribute definitions, and help-center portal/category/article payloads now match the inspected Chatwoot frontend contract. | Run the next evidence-backed route/controller/serializer drift audit. | Regenerate parity artifacts when routes change and add endpoint-family fixture tests. |
|
||||
| 1 | Phase 2/3 drift | Tracked route parity is 0 missing for the current 305-route critical set; help-center portal/category/article routes from `routes.rb:385-404` are now explicitly tracked. Notification list/action serializers, user notification-settings raw payloads, campaigns raw payload/display-id routes, Devise password reset/confirmation payloads, CRM shared attachment payloads plus fixed 100-row attachment pagination, account/settings payloads, assignable-agent payloads, agent index full-list behavior, agent create/update/delete defaults/errors/scope, label CRUD payloads, custom filters, custom attribute definitions, and help-center portal/category/article payloads now match the inspected Chatwoot frontend contract. | Run the next evidence-backed route/controller/serializer drift audit. | Regenerate parity artifacts when routes change and add endpoint-family fixture tests. |
|
||||
| 2 | Phase 6 placeholder audit | Widget/public/webhook critical placeholders are burned down; inbox WhatsApp health/register-webhook and sync-template drift are closed; fresh `rg` audit shows only webhook nil-handler fallbacks still call `chatwootParityStub`; dashboard conversation transcript response drift is closed. | Continue targeted account/contact/conversation/message/inbox drift from reference/smoke evidence. | `rg` placeholder audit is recorded and no reused-frontend blocker is ownerless. |
|
||||
| 3 | B12 optional live smoke | API/browser/enterprise smoke commands are checked in; live runs need PostgreSQL, Redis, Meilisearch, Vite, and Chrome. | Run full live smoke when environment is available and map failures to the board. | `docs/parity/frontend_smoke_report.md` records pass/fail and linked owners. |
|
||||
| 4 | B9.3 delayed automation actions | Current reference exposes no delayed automation action params; scheduled-item work is already P5.12; `send_email_to_team` is durable and `add_sla` mutates conversation/applied SLA state. | Keep automation drift closed if future reference/smoke exposes delayed params or unsupported action shapes. | Automation worker/action fixtures verify queued team email replay, retry visibility through worker jobs, and SLA action idempotency. |
|
||||
@@ -168,6 +168,7 @@ This ledger records the committed parity checkpoints that future slices should b
|
||||
|
||||
| Commit | Scope | Verification summary | Follow-up state |
|
||||
| --- | --- | --- | --- |
|
||||
| `docs: expand help center route parity tracking` | Audit/tooling checkpoint that expands `cmd/route_parity` to track the full Chatwoot help-center portal/category/article route family from `reference/chatwoot/config/routes.rb:385-404`, including portal member actions, nested category CRUD/reorder, nested article CRUD/reorder, and article bulk actions. Regenerated `docs/parity/route_parity.md` now reports `298 exact, 0 method-compatible, 7 parameter-compatible, 0 missing out of 305 tracked critical routes`; `docs/parity/gochat_routes.txt` remains `TOTAL: 860`. | `go run ./cmd/route_parity`; `go test ./cmd/route_parity -count=1`; `git diff --check`. | Continue Phase 6 placeholder burn-down or the next evidence-backed Phase 2/3 drift slice; keep route artifacts regenerated whenever the tracked set changes. |
|
||||
| `feat(help-center): align article payloads` | Advances P3.7c help-center parity by matching Chatwoot `ArticlesController`, `Articles::BulkActionsController`, article Jbuilder views, and reused dashboard `helpCenter/articles.js`. Article index/create now expose no-trailing-slash routes; update exposes frontend `PATCH`; frontend bulk update-status/update-category/delete and translate routes are registered; portal IDs resolve through account-scoped slug lookup with numeric fallback; create/update accept raw frontend article bodies plus wrappers; list/search return `{ payload, meta }`; show/create/update/edit return `{ payload: article }` with category, author, views, Unix `updated_at`, `meta`, and associated article fields; delete/reorder/bulk actions return empty `200 OK`; reorder accepts Chatwoot `positions_hash`; and bulk action errors return `422 { error }`. | `go test ./internal/handler/api/v1 -run ArticleHandler -count=1`; `go test ./internal/service ./internal/repository -run Article -count=1`; `go test ./internal/router -run Router -count=1`; `go run ./cmd/dump_routes > docs/parity/gochat_routes.txt`; `go run ./cmd/route_parity`; sandboxed full `go test ./...` failed only on local socket restrictions; escalated full `go test ./...` passed; `git diff --check`. Route dump is `TOTAL: 860`; tracked route parity remains `270 exact, 7 parameter-compatible, 0 missing`. | P3.7c moves to Review; continue Phase 2/3 drift audit or Phase 6 placeholder burn-down from fresh reference/smoke evidence. |
|
||||
| `docs: lock parity execution tracker` | Documentation-only checkpoint that makes this file the single active tracker after user confirmation. It locks direct Chatwoot frontend reuse, local `reference/chatwoot` as the only baseline, `go test ./...` first, Meilisearch as mandatory final search, and enterprise scope excluding only SSO/SAML/LDAP/OIDC. It also maps the remaining Hermes search and automation/macro/CSAT notes into the existing Phase 1/B6, B8/B9, Phase 5, B7-B12, and active P3.7 help-center rows. | `git diff --check`. No Go code changed. | Continue P3.7c help-center articles and article bulk actions; future slices update this tracker in the same commit. |
|
||||
| `feat(help-center): align category payloads` | Advances P3.7b help-center parity by matching Chatwoot `CategoriesController`, category Jbuilder views, and reused dashboard `helpCenter/categories.js` plus category store actions. Category index/create now expose no-trailing-slash routes; update exposes frontend `PATCH`; portal IDs resolve through account-scoped slug lookup with numeric fallback; create/update accept raw frontend category bodies plus wrappers; list returns `{ payload, meta }` with locale filtering; show/create/update return `{ payload: category }` with related/parent/root category partials and `meta.articles_count`; delete returns empty `200 OK`; and reorder accepts Chatwoot `positions_hash` while preserving legacy `positions` arrays. | `go test ./internal/handler/api/v1 -run CategoryHandler -count=1`; `go test ./internal/service ./internal/repository -run Category -count=1`; `go test ./internal/router -run Router -count=1`; `go run ./cmd/dump_routes > docs/parity/gochat_routes.txt`; `go run ./cmd/route_parity`; full `go test ./...`; `git diff --check`. Route dump is `TOTAL: 853`; tracked route parity remains `270 exact, 7 parameter-compatible, 0 missing`. | P3.7b moves to Review; continue P3.7c help-center articles and article bulk actions. |
|
||||
@@ -1519,12 +1520,13 @@ Tracking table:
|
||||
| P2.9 | Track widget API routes from `routes.rb:442-472`; keep `/api/v1/widget` as the Chatwoot-compatible surface. | `cmd/route_parity`, router widget mount | Done |
|
||||
| P2.10 | Track public API routes from `routes.rb:569-585`, including public inbox contacts, conversations, messages, and CSAT survey. | `cmd/route_parity`, public handlers | Done |
|
||||
| P2.11 | Track v2 reports, summary reports, and live reports from `routes.rb:479-513`. | `cmd/route_parity`, reports handlers | Done |
|
||||
| P2.12 | Track help-center portal/category/article routes from `routes.rb:385-404`, including article bulk actions. | `cmd/route_parity`, help-center handlers | Done |
|
||||
|
||||
Current Phase 2 route findings:
|
||||
|
||||
| Type | Count | Required action |
|
||||
| --- | --- | --- |
|
||||
| Exact tracked critical routes | 270 | Keep covered while expanding audit scope. |
|
||||
| Exact tracked critical routes | 298 | 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. |
|
||||
@@ -1548,6 +1550,7 @@ Expanded tracked groups now covered by route parity:
|
||||
| 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. |
|
||||
| CRM nested routes | Contact active/search/filter/export/import, contactable inboxes, contact labels/contact inboxes, company avatar/custom-attribute/contact search routes. |
|
||||
| Help center | Portal CRUD/member routes, nested category CRUD/reorder, nested article CRUD/reorder, and article bulk actions from `routes.rb:385-404`. |
|
||||
|
||||
New route groups tracked in this slice:
|
||||
|
||||
@@ -1558,6 +1561,7 @@ New route groups tracked in this slice:
|
||||
| Widget API | `reference/chatwoot/config/routes.rb:442-472` | GoChat exposed many routes only under `/widget`. | Added `/api/v1/widget` aliases; behavior parity remains tracked under Phase 3/6. |
|
||||
| Public API | `reference/chatwoot/config/routes.rb:569-585` | GoChat had public CSAT conversation routes. | Added public inbox/contact/conversation/message route surface and Chatwoot public CSAT path. |
|
||||
| Reports v2 | `reference/chatwoot/config/routes.rb:479-513` | GoChat had report-style routes under `/api/v1/accounts`. | Added exact v2 `/api/v2/accounts/:account_id/...` report paths. |
|
||||
| Help center | `reference/chatwoot/config/routes.rb:385-404` | GoChat already exposed the portal/category/article dashboard routes after P3.7a-P3.7c. | Added the full help-center route family to the tracked critical set; route parity remains 0 missing. |
|
||||
|
||||
Closed tracked critical route gaps in this slice:
|
||||
|
||||
@@ -2116,6 +2120,7 @@ Verification milestone gates:
|
||||
|
||||
## Progress Log
|
||||
|
||||
- 2026-06-06: Audit/tooling checkpoint prepared as `docs: expand help center route parity tracking`; expanded `cmd/route_parity` to cover the full Chatwoot help-center portal/category/article route family from `reference/chatwoot/config/routes.rb:385-404`, including portal CRUD/member actions, nested category CRUD/reorder, nested article CRUD/reorder, and article bulk actions. Regenerated route parity reports `298 exact, 0 method-compatible, 7 parameter-compatible, 0 missing out of 305 tracked critical routes`; route dump remains `TOTAL: 860`. Verification for this checkpoint: `go run ./cmd/route_parity`, `go test ./cmd/route_parity -count=1`, and `git diff --check`; continue Phase 6 placeholder burn-down or a fresh evidence-backed Phase 2/3 drift slice.
|
||||
- 2026-06-06: P3.7c help-center article checkpoint prepared as `feat(help-center): align article payloads`; audited Chatwoot `ArticlesController`, `Articles::BulkActionsController`, article Jbuilder views, and reused dashboard `helpCenter/articles.js`. Account article APIs now accept raw frontend create/update bodies plus wrappers, resolve portal route IDs by account-scoped slug with numeric fallback, return Chatwoot `{ payload, meta }` list/search payloads and `{ payload: article }` mutation/show/edit payloads, expose no-trailing-slash index/create plus frontend `PATCH`, return empty `200 OK` for delete/reorder/bulk actions, support status/category/locale/query/author filters and dashboard article counts, accept Chatwoot reorder `positions_hash`, and implement frontend bulk update-status/update-category/delete routes with `422 { error }` failures. Focused article handler tests, service/repository article tests, router test, route dump/parity, escalated full `go test ./...`, and `git diff --check` passed; continue Phase 2/3 drift audit or Phase 6 placeholder burn-down from fresh evidence.
|
||||
- 2026-06-06: Documentation checkpoint prepared as `docs: lock parity execution tracker`; user decisions are now locked into the tracker: reuse Chatwoot frontend directly, treat local `reference/chatwoot` as the only baseline, keep `go test ./...` green before deeper parity, require Meilisearch as final search, exclude only SSO/SAML/LDAP/OIDC, and keep the remaining enterprise families in scope. The older Hermes search and automation/macro/CSAT plans are mapped to active tracker sections so future work can be followed from this document alone. Verification for this docs-only checkpoint: `git diff --check`; next implementation slice remains P3.7c help-center articles and bulk actions.
|
||||
- 2026-06-06: P3.7b help-center category checkpoint prepared as `feat(help-center): align category payloads`; audited Chatwoot `CategoriesController`, category Jbuilder views, reused dashboard `helpCenter/categories.js`, and category store actions. Account category APIs now accept raw frontend create/update bodies plus wrappers, resolve portal route IDs by account-scoped slug with numeric fallback, return Chatwoot `{ payload, meta }` list payloads and `{ payload: category }` mutation/show payloads, expose no-trailing-slash index/create plus frontend `PATCH`, return empty `200 OK` for delete/reorder, support locale filtering and `meta.articles_count`, and accept Chatwoot reorder `positions_hash` while keeping legacy `positions` arrays. Focused category handler/service/repository tests, router test, route dump/parity, full `go test ./...`, and `git diff --check` passed; continue P3.7c article/bulk-action parity next.
|
||||
|
||||
@@ -7,7 +7,7 @@ Generated from:
|
||||
|
||||
This report covers tracked frontend-critical Chatwoot routes from `reference/chatwoot/config/routes.rb`, including API v1 account routes, Captain/Copilot, assignment policies, widget/public APIs, and API v2 reports. Ruby is not installed in the workspace, so Chatwoot routes are sourced from static route declarations instead of `bin/rails routes`.
|
||||
|
||||
Summary: 270 exact, 0 method-compatible, 7 parameter-compatible, 0 missing out of 277 tracked critical routes.
|
||||
Summary: 298 exact, 0 method-compatible, 7 parameter-compatible, 0 missing out of 305 tracked critical routes.
|
||||
|
||||
## Missing Critical Routes
|
||||
|
||||
@@ -69,6 +69,11 @@ These routes exist with equivalent method and path shape but different parameter
|
||||
| DELETE | `/api/v1/accounts/:account_id/labels/:tag_id` | `/api/v1/accounts/:account_id/labels/:tag_id` | `api/v1/accounts/labels#destroy` | `routes.rb:281` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/macros/:macro_id` | `/api/v1/accounts/:account_id/macros/:macro_id` | `api/v1/accounts/macros#destroy` | `routes.rb:118` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/notifications/:notification_id` | `/api/v1/accounts/:account_id/notifications/:notification_id` | `api/v1/accounts/notifications#destroy` | `routes.rb:283` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/portals/:portal_id` | `/api/v1/accounts/:account_id/portals/:portal_id` | `api/v1/accounts/portals#destroy` | `routes.rb:385` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `api/v1/accounts/articles#destroy` | `routes.rb:403` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/delete_articles` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/delete_articles` | `api/v1/accounts/articles/bulk_actions#delete_articles` | `routes.rb:400` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `api/v1/accounts/categories#destroy` | `routes.rb:392` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/portals/:portal_id/logo` | `/api/v1/accounts/:account_id/portals/:portal_id/logo` | `api/v1/accounts/portals#logo` | `routes.rb:388` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/sla_policies/:id` | `/api/v1/accounts/:account_id/sla_policies/:id` | `api/v1/accounts/sla_policies#destroy` | `routes.rb:121` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/teams/:team_id` | `/api/v1/accounts/:account_id/teams/:team_id` | `api/v1/accounts/teams#destroy` | `routes.rb:296` | exact |
|
||||
| DELETE | `/api/v1/accounts/:account_id/teams/:team_id/team_members/` | `/api/v1/accounts/:account_id/teams/:team_id/team_members/` | `api/v1/accounts/teams/team_members#destroy` | `routes.rb:299` | exact |
|
||||
@@ -148,6 +153,13 @@ These routes exist with equivalent method and path shape but different parameter
|
||||
| GET | `/api/v1/accounts/:account_id/notification_settings/` | `/api/v1/accounts/:account_id/notification_settings/` | `api/v1/accounts/notification_settings#show` | `routes.rb:293` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/notifications/` | `/api/v1/accounts/:account_id/notifications/` | `api/v1/accounts/notifications#index` | `routes.rb:283` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/notifications/unread_count` | `/api/v1/accounts/:account_id/notifications/unread_count` | `api/v1/accounts/notifications#unread_count` | `routes.rb:286` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals` | `/api/v1/accounts/:account_id/portals` | `api/v1/accounts/portals#index` | `routes.rb:385` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals/:portal_id` | `/api/v1/accounts/:account_id/portals/:portal_id` | `api/v1/accounts/portals#show` | `routes.rb:385` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals/:portal_id/articles` | `/api/v1/accounts/:account_id/portals/:portal_id/articles` | `api/v1/accounts/articles#index` | `routes.rb:403` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `api/v1/accounts/articles#show` | `routes.rb:403` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals/:portal_id/categories` | `/api/v1/accounts/:account_id/portals/:portal_id/categories` | `api/v1/accounts/categories#index` | `routes.rb:392` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `api/v1/accounts/categories#show` | `routes.rb:392` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/portals/:portal_id/ssl_status` | `/api/v1/accounts/:account_id/portals/:portal_id/ssl_status` | `api/v1/accounts/portals#ssl_status` | `routes.rb:390` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/search` | `/api/v1/accounts/:account_id/search` | `api/v1/accounts/search#index` | `routes.rb:170` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/search/articles` | `/api/v1/accounts/:account_id/search/articles` | `api/v1/accounts/search#articles` | `routes.rb:176` | exact |
|
||||
| GET | `/api/v1/accounts/:account_id/search/contacts` | `/api/v1/accounts/:account_id/search/contacts` | `api/v1/accounts/search#contacts` | `routes.rb:175` | exact |
|
||||
@@ -192,6 +204,12 @@ These routes exist with equivalent method and path shape but different parameter
|
||||
| GET | `/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages` | `/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages` | `public/api/v1/inboxes/messages#index` | `routes.rb:580` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/agent_capacity_policies/:id` | `/api/v1/accounts/:account_id/agent_capacity_policies/:id` | `api/v1/accounts/agent_capacity_policies#update` | `routes.rb:123` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/inbox_members/` | `/api/v1/accounts/:account_id/inbox_members/` | `api/v1/accounts/inbox_members#update` | `routes.rb:278` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/portals/:portal_id` | `/api/v1/accounts/:account_id/portals/:portal_id` | `api/v1/accounts/portals#update` | `routes.rb:385` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/portals/:portal_id/archive` | `/api/v1/accounts/:account_id/portals/:portal_id/archive` | `api/v1/accounts/portals#archive` | `routes.rb:387` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `api/v1/accounts/articles#update` | `routes.rb:403` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/update_category` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/update_category` | `api/v1/accounts/articles/bulk_actions#update_category` | `routes.rb:399` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/update_status` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/update_status` | `api/v1/accounts/articles/bulk_actions#update_status` | `routes.rb:398` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `api/v1/accounts/categories#update` | `routes.rb:392` | exact |
|
||||
| PATCH | `/api/v1/accounts/:account_id/teams/:team_id/team_members/` | `/api/v1/accounts/:account_id/teams/:team_id/team_members/` | `api/v1/accounts/teams/team_members#update` | `routes.rb:300` | exact |
|
||||
| PATCH | `/api/v1/widget/contact/set_user` | `/api/v1/widget/contact/set_user` | `api/v1/widget/contact#set_user` | `routes.rb:461` | exact |
|
||||
| POST | `/api/v1/accounts/` | `/api/v1/accounts/` | `api/v1/accounts#create` | `routes.rb:47` | exact |
|
||||
@@ -258,6 +276,13 @@ These routes exist with equivalent method and path shape but different parameter
|
||||
| POST | `/api/v1/accounts/:account_id/notifications/:notification_id/unread` | `/api/v1/accounts/:account_id/notifications/:notification_id/unread` | `api/v1/accounts/notifications#unread` | `routes.rb:291` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/notifications/destroy_all` | `/api/v1/accounts/:account_id/notifications/destroy_all` | `api/v1/accounts/notifications#destroy_all` | `routes.rb:287` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/notifications/read_all` | `/api/v1/accounts/:account_id/notifications/read_all` | `api/v1/accounts/notifications#read_all` | `routes.rb:285` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals` | `/api/v1/accounts/:account_id/portals` | `api/v1/accounts/portals#create` | `routes.rb:385` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals/:portal_id/articles` | `/api/v1/accounts/:account_id/portals/:portal_id/articles` | `api/v1/accounts/articles#create` | `routes.rb:403` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/translate` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/bulk_actions/translate` | `api/v1/accounts/articles/bulk_actions#translate` | `routes.rb:397` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals/:portal_id/articles/reorder` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/reorder` | `api/v1/accounts/articles#reorder` | `routes.rb:404` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals/:portal_id/categories` | `/api/v1/accounts/:account_id/portals/:portal_id/categories` | `api/v1/accounts/categories#create` | `routes.rb:392` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals/:portal_id/categories/reorder` | `/api/v1/accounts/:account_id/portals/:portal_id/categories/reorder` | `api/v1/accounts/categories#reorder` | `routes.rb:393` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/portals/:portal_id/send_instructions` | `/api/v1/accounts/:account_id/portals/:portal_id/send_instructions` | `api/v1/accounts/portals#send_instructions` | `routes.rb:389` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/sla_policies` | `/api/v1/accounts/:account_id/sla_policies` | `api/v1/accounts/sla_policies#create` | `routes.rb:121` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/teams/` | `/api/v1/accounts/:account_id/teams/` | `api/v1/accounts/teams#create` | `routes.rb:296` | exact |
|
||||
| POST | `/api/v1/accounts/:account_id/teams/:team_id/team_members/` | `/api/v1/accounts/:account_id/teams/:team_id/team_members/` | `api/v1/accounts/teams/team_members#create` | `routes.rb:297` | exact |
|
||||
@@ -304,6 +329,9 @@ These routes exist with equivalent method and path shape but different parameter
|
||||
| PUT | `/api/v1/accounts/:account_id/macros/:macro_id` | `/api/v1/accounts/:account_id/macros/:macro_id` | `api/v1/accounts/macros#update` | `routes.rb:118` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/notification_settings/` | `/api/v1/accounts/:account_id/notification_settings/` | `api/v1/accounts/notification_settings#update` | `routes.rb:293` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/notifications/:notification_id` | `/api/v1/accounts/:account_id/notifications/:notification_id` | `api/v1/accounts/notifications#update` | `routes.rb:283` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/portals/:portal_id` | `/api/v1/accounts/:account_id/portals/:portal_id` | `api/v1/accounts/portals#update` | `routes.rb:385` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `/api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id` | `api/v1/accounts/articles#update` | `routes.rb:403` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `/api/v1/accounts/:account_id/portals/:portal_id/categories/:category_id` | `api/v1/accounts/categories#update` | `routes.rb:392` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/sla_policies/:id` | `/api/v1/accounts/:account_id/sla_policies/:id` | `api/v1/accounts/sla_policies#update` | `routes.rb:121` | exact |
|
||||
| PUT | `/api/v1/accounts/:account_id/teams/:team_id` | `/api/v1/accounts/:account_id/teams/:team_id` | `api/v1/accounts/teams#update` | `routes.rb:296` | exact |
|
||||
| PUT | `/api/v1/widget/contact` | `/api/v1/widget/contact` | `api/v1/widget/contact#update` | `routes.rb:458` | exact |
|
||||
|
||||
Reference in New Issue
Block a user