Commit 4ba4034
fix(frontend): respect workspace timezone setting in date formatters (#59)
* fix(telegram): remove reply() from prod-review-todoist skill
Telegram notification was still in the skill file, causing the agent
to call reply() multiple times per run (3x observed on 25/04 at 06:51).
Notification now controlled by notify_telegram=True in review_todoist.py
(gitignored custom routine, already updated on disk).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(chat-bridge): resolve agent file from WORKSPACE_ROOT, not session cwd
Ticket threads pass workspace_path (e.g. workspace/personal/) as the
session cwd. loadAgentFile was building the path relative to that cwd,
so it looked for .claude/agents/ inside the ticket's folder instead of
the workspace root — always failing for every agent.
Fix: try WORKSPACE_ROOT/.claude/agents/{name}.md first, fall back to
cwd for custom per-directory agents.
Affected: kai-personal-assistant, flux-finance, and any ticket with
a workspace_path set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(telegram): eliminate duplicate notifications from inline reply() template
Root cause: notify_telegram instruction showed reply(chat_id=..., text="...")
as an inline code snippet, causing the agent to execute it immediately on
reading the instruction AND again at the end — 2x per instruction.
Financial Pulse was getting 4x because the skill's Step 8 also contained
a reply() call instruction (2 instructions × 2 executions = 4 messages).
Fixes:
- runner.py: rewrite notify_telegram prompt to describe the action in
plain text without an inline function-call template
- fin-daily-pulse SKILL.md: remove Step 8 Telegram section — notification
is handled by the routine caller via notify_telegram=True
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(telegram): remove all inline reply() calls from skill SKILL.md files
Comprehensive sweep of all 175+ skills. Root cause of all duplicate
Telegram notifications: skills contained inline reply(chat_id=...) code
examples that Claude executed immediately on reading, then called again
at the actual end-of-skill step — causing 2x (or 4x when combined with
a second instruction from notify_telegram=True in the routine).
Changes:
- Removed "Notify via Telegram" sections entirely from 10 skills that
have a corresponding routine using notify_telegram=True:
fin-weekly-report, gog-email-triage, prod-dashboard, prod-trends,
pulse-monthly, pulse-weekly, sage-strategy-digest,
fin-monthly-close-kickoff, social-analytics-report, social-youtube-report
- Rewrote Telegram instructions without inline reply() code in 4 skills
that are called without notify_telegram (heartbeat or conditional):
int-sync-meetings, int-github-review, int-linear-review (plain text),
custom-getfy-sync, custom-omc-sync (plain text, local/gitignored)
The corresponding routines (gitignored) were updated locally to add
notify_telegram=True where the section was removed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(frontend): respect workspace timezone setting in date formatters
The workspace settings page exposes a timezone selector (Settings.tsx
already saves `workspace.timezone` via /api/settings/workspace), but
the four pages that render timestamps — Topics, TicketDetail, Tasks,
and the "last seen" text on Settings itself — hardcoded
`timeZone: 'America/Sao_Paulo'` in their local formatDate helpers.
Effect: users outside São Paulo saw timestamps shifted by their local
offset minus −03:00. A user in Europe/London (BST) saw all ticket
timestamps 4 hours behind their wall clock.
This patch centralises date formatting in `lib/format.ts`:
- `loadWorkspaceTimezone()` fetches the workspace config once after
login (called from App.tsx alongside the other hydrate calls) and
caches the IANA tz in a module variable + localStorage so subsequent
paints don't have to wait on the API.
- `getTimezoneSync()` returns cache → localStorage → browser default,
in that order, never throwing.
- `formatDateTime(iso)` and `formatDate(iso)` use the cached tz.
- `refreshWorkspaceTimezone(tz)` is called from the Settings save
handler so the change is reflected without a hard reload.
Topics.tsx, TicketDetail.tsx and Tasks.tsx now alias their local
`formatDate` to the shared `formatDateTime`, removing the hardcoded
São Paulo string. The behaviour is unchanged for users on São Paulo
(workspace setting still defaults to that value); users on any other
configured timezone now see correct timestamps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(format): don't overwrite freshly-refreshed cache on slow API resolve
Sourcery flagged a race in loadWorkspaceTimezone: if the user updated
the timezone via Settings → refreshWorkspaceTimezone while the initial
GET /settings/workspace was still in flight, the eventual resolution
of that GET would overwrite cachedTz (and localStorage) with the stale
server value, silently reverting the user's change until the next
reload.
Fix: in both the success and failure handlers, only write if cachedTz
is still null. If anything else claimed the cache in the meantime,
keep the fresher value.
Reported-by: sourcery-ai[bot] on PR #59
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: regenerate uv.lock after rebase on develop
Develop bumped evo-nexus to 0.33.0 (release aa33f7d) and added
flask-limiter / limits / wrapt / etc. via the rate-limit + plugin
contract work. The branch's old uv.lock was carrying 0.32.2 which
would regress the project version on merge. Re-running `uv lock`
syncs the file with the current pyproject.toml and develop's deps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Davidson Gomes <davidson.gomes@etus.com.br>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Davidson Gomes <davidson.gomes@evofoundation.com.br>1 parent 51a93ba commit 4ba4034
25 files changed
Lines changed: 285 additions & 133 deletions
File tree
- .claude/skills
- fin-daily-pulse
- fin-monthly-close-kickoff
- fin-weekly-report
- gog-email-triage
- int-github-review
- int-linear-review
- int-sync-meetings
- prod-dashboard
- prod-review-todoist
- prod-trends
- pulse-monthly
- pulse-weekly
- sage-strategy-digest
- social-analytics-report
- social-youtube-report
- ADWs
- dashboard
- frontend/src
- lib
- pages
- terminal-server
- src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
157 | 157 | | |
158 | 158 | | |
159 | 159 | | |
160 | | - | |
| 160 | + | |
161 | 161 | | |
162 | | - | |
| 162 | + | |
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | | - | |
175 | | - | |
176 | | - | |
| 174 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
182 | 182 | | |
183 | 183 | | |
184 | 184 | | |
185 | | - | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
164 | 164 | | |
165 | 165 | | |
166 | 166 | | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
354 | 354 | | |
355 | 355 | | |
356 | 356 | | |
357 | | - | |
358 | | - | |
359 | | - | |
360 | | - | |
361 | | - | |
362 | | - | |
363 | | - | |
364 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
186 | 186 | | |
187 | 187 | | |
188 | 188 | | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
| 189 | + | |
193 | 190 | | |
194 | | - | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
195 | 196 | | |
196 | 197 | | |
197 | 198 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
142 | 142 | | |
143 | 143 | | |
144 | 144 | | |
145 | | - | |
146 | | - | |
147 | | - | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
173 | | - | |
0 commit comments