Closes architectural gap #1 from the Giellie skill (the operator's AI
agent could ingest quotes via /api/mcp but had no way to enumerate,
add, or patch the resulting line items - every auto-price flow had to
stop and ask a human for the item IDs).
Adds:
- GET /api/v1/quote_items (list w/ filter, sort, expand)
- POST /api/v1/quote_items (create on existing quote)
- GET /api/v1/quote_items/[id] (fetch one)
- PATCH /api/v1/quote_items/[id] (whitelisted patch)
- quote_items.list MCP tool
- quote_items.get MCP tool
- quote_items.create MCP tool
- quote_items.update MCP tool
Patch whitelist on update is identical to bulk_update_quote_items:
cost_price, selling_price, description, sku, unit, supplier, markup,
pricing_source, pricing_notes, matched_price_list_id, user_edited
Everything else (id, quote, created, updated, quantity, is_processed)
returns 400 / MCP error with the allow-list echoed back so the agent
can self-correct.
quote_items.update does NOT enforce the already_priced skip - that's
the safety-net for bulk_update_quote_items. Single-row patches are
explicit writes.
Newly created rows have is_processed=false forced server-side; Giellie
still cannot flip the flag (architectural gap #2 unchanged - that's a
UI gate by design).
Also: removed "JEI" from quotes.company_letterhead select values on
the live PB - valid values are now ["CNL", "ISHERWOOD"]. Use the
uppercase form when setting this field.
Giellie skill doc refreshed: tool count 69 to 73, new "quote_items
CRUD" subsection, three new REST rows, architectural gap #1 marked
RESOLVED, hard rule #1 updated to cover the new endpoint, new worked
example for "add a missing line item + price it", change-log entry.
Tests: 82 passing across the three touched files (was 63 before).
Type-check: zero new errors (pre-existing 29 in
orders-service-review.test.ts unchanged).
Deployment: pending operator rebuild + redeploy. Until then
POST /api/v1/quote_items returns 404 and the new tools don't appear
in tools/list.
Co-authored-by: Orca <help@stably.ai>
The earlier change log claimed the catalog went 69 → 70 after wiring
tools.discovery, but tools.discovery was already in the catalog from
the start — only its runtime behavior changed from 'Unknown tool' to
functional. Live post-redeploy smoke test confirms 69 tools.
Fix all six '70' references in the doc to '69', and append a second
change-log entry recording what was verified live after the redeploy:
- tools.discovery returns the flat 69-tool catalog via JSON-RPC ✅
- GET /api/mcp still works ✅
- 5 other bugs reproduce exactly as documented (validates the doc) ✅
- ISHERWOOD + CNL letterhead PDF regeneration on Q000087 still works ✅
Co-authored-by: Orca <help@stably.ai>
Bring the Giellie agent's operating manual in line with the live production
state after the 2026-08-04 smoke test against https://wfdash.apphub.co.za.
Bugs / quirks documented (with workarounds):
- tools.discovery was unwired; now fixed in code (separate commit),
live server needs redeploy before response changes
- orders.list silently ignores 'filter'; only 'search' is honoured
- quotes.lookup returns opaque 'fetch failed' — use quotes.list instead
- collection_pool.list + sprint.list return 'Missing collection context'
- orders.get 'not found' for at least one valid id
- quotes.items.rewrite was incorrectly listed as an MCP tool (it's REST)
Architectural gaps documented:
- No quote_items.list MCP tool; quotes.create_from_email returns item
count only, so a freshly-ingested quote's item IDs can't be recovered
via the agent API
- is_processed is intentionally NOT in bulk_update_quote_items whitelist;
end-to-end create→price→render pipeline requires human in the UI
Credentials & endpoints now include every token the agent might need:
AGENT_API_KEY, PB admin email/password, n8n base URL + API key, six
n8n webhook URLs (rewriter, price-list match, PO send, AI insights,
markup approval, customer list, QB invoice creator), TomTom map key.
Other updates:
- Replaced stale base URL wfdash.davidels.dev with wfdash.apphub.co.za
- Bumped tool count 69 → 70 (tools.discovery added to catalog)
- Added three-way tool discovery guide (tools/list, tools.discovery,
GET /api/mcp)
- Added 'Quote PDF rendering' guide explaining the 422 gates,
status transitions, and letterhead codes
- Added change log at the bottom
- All worked examples updated to the correct host
Co-authored-by: Orca <help@stably.ai>