toga-ai 1.0.796 → 1.0.797

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,8 +6,8 @@ project: Worker
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-07-20
10
- owners: [rgirish]
9
+ updated: 2026-09-10
10
+ owners: [rgirish, jcardinal]
11
11
  files:
12
12
  - worker2/Worker/Clickup/Fluffer.php
13
13
  - worker2/Worker/Clickup.php
@@ -121,6 +121,14 @@ never by value.
121
121
 
122
122
  ## Gotchas / known issues
123
123
 
124
+ - **⚠ OPEN (found 2026-09-10, NOT fixed): the Talos agent call is failing in prod with HTTP 403.**
125
+ `Clickup/Fluffer/Process` failed **168 times over 7 days** with `Talos agent returned HTTP 403` — an
126
+ auth/permission failure on the `POST /api/ai/agent` call (`callTalosAgent()`,
127
+ `worker2/Worker/Clickup/Fluffer.php` ~L230, from `Process()` ~L94). 403 points at a bad/expired
128
+ `[talos] agent_api_key` (the `dev-core`-scoped key sent as `X-API-Key`) or the agent bridge revoking
129
+ it — **not** a ClickUp problem. Left unfixed by the developer for now; recorded so the next triage
130
+ starts from "check the `agent_api_key` / agent-bridge auth", not from the code. Surfaced by the
131
+ `Core.WorkerJobs` action+outcome census (group by action, isSuccess over 7 days).
124
132
  - **Watchdog race.** The fluffer is an **ACTION** job; its watchdog is the Lambda env
125
133
  `MAX_EXECUTION_TIME_WORKER_ACTION` (default 300s). The Talos timeout is set to **280** (just
126
134
  under 300) so the job doesn't lose the race against its own watchdog out of the box.
@@ -144,6 +152,11 @@ never by value.
144
152
 
145
153
  ## Change history
146
154
 
155
+ - 2026-09-10 — **Discovered (NOT fixed): the fluffer is down in prod on a Talos-agent HTTP 403.**
156
+ `Clickup/Fluffer/Process` failed 168x over 7 days with `Talos agent returned HTTP 403` — an
157
+ auth/permission failure on the `/api/ai/agent` call, most likely an expired/wrong `[talos]
158
+ agent_api_key`. Deferred by the developer; logged as an open known issue for the next triage. Found
159
+ via the `Core.WorkerJobs` action+outcome census (toga-db MCP, no ClickUp/Talos access). (jcardinal)
147
160
  - 2026-07-20 — Built the ClickUp task description fluffer: new `_Worker_Clickup_Fluffer`
148
161
  (action `Clickup/Fluffer/Process`, `taskCreated` webhook auto-trigger, `force` regenerate)
149
162
  calling the Talos `dev-core` KB-investigation agent at `/api/ai/agent` via `_ApiRequest`
@@ -6,8 +6,8 @@ project: Worker
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-09-04
10
- owners: ["dfranks", "kyalamarthi", "ajean"]
9
+ updated: 2026-09-10
10
+ owners: ["dfranks", "kyalamarthi", "ajean", "jcardinal"]
11
11
  files:
12
12
  - worker2/Worker/Netsuite.php
13
13
  - worker2/Worker/Netsuite/Opportunity.php
@@ -387,6 +387,22 @@ the legacy cron's OPPORTUNITIES section:
387
387
  (`hasEndCustomerColumn()`), since the migration is applied by hand and an unknown column would fail
388
388
  the whole query and break every opportunity webhook. See
389
389
  [the labels doc](./netsuite-opportunity-client-labels.md).
390
+ - **⚠ `hasEndCustomerColumn()` guards the DB COLUMN, NOT the ORM MODEL field — and that gap took the
391
+ whole opportunity sync down for 8 days (2026-09-02 → 2026-09-10).** The guard does a `SHOW COLUMNS`
392
+ on `Forecast.Opportunities`, so once the migration was applied it passed and the handler ran
393
+ `$opportunity->endCustomerName = …`. But the 2.0 model `_Model_Forecast_Opportunity`
394
+ (`_underscore/Model/Forecast/Opportunity.php`) never **declared** the field, so `_Model.__set`
395
+ (`_underscore/Model.php`) threw *"There is no field called 'endCustomerName' in the
396
+ '_Model_Forecast_Opportunity' model."* on **every** `Netsuite/Opportunity/post|put` — 100% failure,
397
+ every opportunity import dead. `Core.WorkerJobs` census: Sep 1 = 115 ok / 60 fail (last good day),
398
+ Sep 2 → Sep 10 = 0 ok / 100% fail (61 fails on Sep 10 alone). This was a **half-deploy**: the
399
+ migration + the handler write shipped, the model field declaration did not.
400
+ **Durable rule: a new column that the handler writes must ship THREE things together — the
401
+ `dbchanges2` migration, the handler write, AND the `_Model` field declaration.** A column-existence
402
+ guard (`SHOW COLUMNS`) proves nothing about the ORM; both ORMs enumerate *declared* properties, so an
403
+ undeclared field is a hard `__set` throw, not a silent skip. Fixed 2026-09-10 by declaring
404
+ `public $endCustomerName = self::FIELD_CHAR;` (matching sibling char fields clickupTaskId/title/memo
405
+ over the varchar column); deployed to worker2 `_production`, sync recovered.
390
406
  - Writes use raw `_Query` against `_underscore::DB_FORECAST` and **must**
391
407
  `_Database::transactionCommit(DB_FORECAST)` (lazy-transaction gotcha).
392
408
 
@@ -759,6 +775,19 @@ deprecated** for production opportunity code.
759
775
  blocked on the Aaron stakeholder decision noted above.
760
776
 
761
777
  ## Change history
778
+ - 2026-09-10 — **Fixed an 8-day total opportunity-sync outage caused by a half-deploy: a missing ORM
779
+ model field.** `Forecast.Opportunities.endCustomerName` (column added ~Sep 1) and the worker2 handler
780
+ write shipped, but `_Model_Forecast_Opportunity` (`_underscore/Model/Forecast/Opportunity.php`) never
781
+ **declared** the field. `hasEndCustomerColumn()` guards the DB column (`SHOW COLUMNS`), not the ORM
782
+ model, so the guard passed and `_Model.__set` then threw *"There is no field called 'endCustomerName'
783
+ in the '_Model_Forecast_Opportunity' model."* on **every** `Netsuite/Opportunity/post|put` —
784
+ `Core.WorkerJobs` shows Sep 1 = 115 ok / 60 fail (last good day), Sep 2 → Sep 10 = 0 ok / 100% fail.
785
+ Fix: declared `public $endCustomerName = self::FIELD_CHAR;` (php-reviewer clean); deployed to worker2
786
+ `_production`, sync recovered. Durable lesson added to the `endCustomerName` data-model bullet: a
787
+ handler-written column must ship its migration, its handler write, AND its `_Model` field declaration
788
+ together — a `SHOW COLUMNS` guard does not protect against a missing ORM field. Diagnosed with only the
789
+ `Core.WorkerJobs` action+outcome census (group by action, isSuccess over 7 days) via the toga-db MCP —
790
+ no NetSuite/ClickUp access. (jcardinal)
762
791
  - 2026-09-04 — **Investigation + design session; no code shipped (two prototype fixes were written and
763
792
  deliberately reverted).** Four corrections and four new facts. **Corrected:** the `STAGE_MAP`
764
793
  section described a constant that does not exist — the shipped map is **`SALES_STAGE_MAP`** on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.796",
3
+ "version": "1.0.797",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",