Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/web/src/core/hub/ChunkErrorBoundary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export default class ChunkErrorBoundary extends Component<
<button
type="button"
onClick={this.handleReload}
className="px-4 py-2 rounded-xl bg-primary text-bg text-style-label shadow-card hover:brightness-110 transition-[filter] focus:outline-none focus-visible:ring-2 focus-visible:ring-focus/50"
className="min-h-[44px] min-w-[44px] px-4 py-2 rounded-xl bg-primary text-bg text-style-label shadow-card hover:brightness-110 transition-[filter] focus:outline-none focus-visible:ring-2 focus-visible:ring-focus/50"
>
{messages.actions.reload}
</button>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# C3 — Workspace dependency graph

> **Last validated:** 2026-06-08 by @Skords-01. **Next review:** 2026-09-06.
> **Last validated:** 2026-06-09 by @Skords-01. **Next review:** 2026-09-07.
> **Status:** Active

<!-- AUTO-GENERATED FILE. Do not edit by hand. Regenerate via `pnpm docs:gen-architecture-diagrams`. -->
Expand Down
2 changes: 1 addition & 1 deletion docs/04-governance/governance/knowledge-graph.html
Original file line number Diff line number Diff line change
Expand Up @@ -1099,7 +1099,7 @@ <h1>Sergeant — Knowledge Graph</h1>
>HubSettings lazy boundaries — CLS + chunk-load follow-up</a
>
</td>
<td>Open</td>
<td>Closed</td>
<td></td>
</tr>
<tr>
Expand Down
2 changes: 1 addition & 1 deletion docs/04-governance/governance/knowledge-graph.json
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,7 @@
"type": "audit",
"title": "HubSettings lazy boundaries — CLS + chunk-load follow-up",
"path": "docs/90-work/audits/2026-05-25-hubsettings-cls-chunk-load.md",
"status": "Open",
"status": "Closed",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Audit closure status missing metadata.

The status field for the closed audit lacks the closure details present in other closed audits (e.g., lines 741, 750). The established pattern includes:

  • Closure date
  • Implementation metrics (e.g., "X/Y implemented")
  • Outstanding work summary

Current: "status": "Closed"
Expected: "status": "Closed (2026-06-08 — MEDIUM #1implemented via PR#3477; MEDIUM #2 deferred as documented)"

This inconsistency reduces the self-documenting value of the knowledge graph.

Suggested fix
-      "status": "Closed",
+      "status": "Closed (2026-06-08 — ChunkErrorBoundary shipped in PR `#3477`, wraps 4 lazy HubSettings sections; MEDIUM `#1` resolved, MEDIUM `#2` deferred)",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"status": "Closed",
"status": "Closed (2026-06-08 — ChunkErrorBoundary shipped in PR `#3477`, wraps 4 lazy HubSettings sections; MEDIUM `#1` resolved, MEDIUM `#2` deferred)",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/04-governance/governance/knowledge-graph.json` at line 849, Replace the
plain "status": "Closed" entry in the JSON node with the full closure metadata
following the established pattern used elsewhere (see the "status" fields at
lines that include closure date, implementation metrics, and outstanding work
summary); specifically update the status string to include the closure date,
implemented items summary (e.g., "MEDIUM `#1` implemented via PR `#3477`"), and
outstanding items summary (e.g., "MEDIUM `#2` deferred as documented") so it reads
like: Closed (2026-06-08 — MEDIUM `#1` implemented via PR `#3477`; MEDIUM `#2`
deferred as documented); ensure the change is applied to the same status
property in this knowledge-graph JSON node so formatting matches other closed
entries.

"tier": "core",
"meta": {}
},
Expand Down
10 changes: 7 additions & 3 deletions docs/90-work/audits/2026-05-25-hubsettings-cls-chunk-load.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# HubSettings lazy boundaries — CLS + chunk-load follow-up

> **Last validated:** 2026-05-25.
> **Status:** Open
> **Last validated:** 2026-06-09.
> **Status:** Closed
> **Source:** Code review of merged batch `chore/orchestrated-batch-2026-05-22` (рebase виявив, що всі коміти вже в main; знахідки актуальні для поточного main).
> **Initiative:** [0017 — hub tabs mount perf](../initiatives/0017-hub-tabs-mount-perf.md) — Sprint 1 PR-1.2 closeout.

Expand Down Expand Up @@ -55,4 +55,8 @@ Sprint 1 PR-1.2 ([apps/web/src/core/hub/HubSettingsPage.tsx](../../../apps/web/s

## Closure

Коли PR merge'нутий — `Status:` → `Closed`, дописати link на PR.
Closed: PR [ChunkErrorBoundary] landed 2026-06-09.

MEDIUM #1 — chunk-load failure = white screen — fixed. `ChunkErrorBoundary` wraps each of the four lazy sections (`FinykSection`, `FizrukSection`, `NutritionSection`, `RoutineSection`) in `HubSettingsPage`. Chunk-load failures now show a localized retry card (`SectionSkeleton` footprint + reload button) instead of propagating to the global boundary and blanking the entire Settings tab.

MEDIUM #2 — Suspense fallback minH CLS — deferred. Requires live browser measurement (ResizeObserver or Lighthouse CLS trace). Tracked separately; not addressed in this PR.
4 changes: 2 additions & 2 deletions docs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@
- [#2889](https://github.com/Skords-01/Sergeant/pull/2889) — feat(docs): per-package symbol catalog (Initiative 0014 Phase 2) _(2026-05-15)_
- [#2876](https://github.com/Skords-01/Sergeant/pull/2876) — feat(docs): knowledge graph generator (Initiative 0014 Phase 1) _(2026-05-15)_

## 🔵 В роботі — 74 відкритих
## 🔵 В роботі — 73 відкритих

| Трекер | Відкрито |
| -------------------------------- | -------- |
| Ініціативи | 20 |
| Планування | 14 |
| Launch / запуск | 17 |
| Аудити й прожарки | 16 |
| Аудити й прожарки | 15 |
| Security hardening | 2 |
| Техборг | 5 |
| Superpowers — плани впровадження | 0 |
Expand Down
5 changes: 2 additions & 3 deletions docs/open-work.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

**Колонки.** `Документ` — шлях відносно директорії трекера. `Статус` — повний текст `Status:` хедера (truncated до 180 символів; `❓` = `unknown` бакет, треба полагодити header). `PR-згадки` — auto-extracted `#NNNN` згадки (≥3 цифри, deduped, sorted ascending; перші 10 показано). Це навігаційні згадки з документа, не live-стан GitHub PR. Ініціативи й Plans мають додатково: `Agent-ready` (🟢 yes / 🟡 needs-decision / 🔴 blocked — рядки сортуються `yes` → `needs-decision` → `blocked`), `Skill` (canonical Sergeant specialist skill) і `Playbook` (best-fit playbook). Останні дві — heuristic suggestions з [`scripts/docs/skill-mapping.json`](../scripts/docs/skill-mapping.json), editable вручну.

**Усього відкритих документів:** **74** — Ініціативи: **20** · Планування: **14** · Launch / запуск: **17** · Аудити й прожарки: **16** · Security hardening: **2** · Техборг: **5** · Superpowers — плани впровадження: **0**.
**Усього відкритих документів:** **73** — Ініціативи: **20** · Планування: **14** · Launch / запуск: **17** · Аудити й прожарки: **15** · Security hardening: **2** · Техборг: **5** · Superpowers — плани впровадження: **0**.

## Ініціативи (20)

Expand Down Expand Up @@ -85,7 +85,7 @@
| [`tech/ai-memory-activation.md`](./01-product/launch/tech/ai-memory-activation.md) | Active (operational activation runbook; behavior SSOT is architecture doc) | — |
| [`tech/telegram-improvements-roadmap.md`](./01-product/launch/tech/telegram-improvements-roadmap.md) | Active | [#1449](https://github.com/Skords-01/Sergeant/pull/1449) [#1462](https://github.com/Skords-01/Sergeant/pull/1462) [#1469](https://github.com/Skords-01/Sergeant/pull/1469) [#1473](https://github.com/Skords-01/Sergeant/pull/1473) [#1480](https://github.com/Skords-01/Sergeant/pull/1480) [#1514](https://github.com/Skords-01/Sergeant/pull/1514) [#1517](https://github.com/Skords-01/Sergeant/pull/1517) [#2531](https://github.com/Skords-01/Sergeant/pull/2531) [#2534](https://github.com/Skords-01/Sergeant/pull/2534) |

## Аудити й прожарки (16)
## Аудити й прожарки (15)

> Прожарки, аудити та implementation roadmap-и. Source: [`docs/90-work/audits/`](./90-work/audits/README.md).

Expand All @@ -103,7 +103,6 @@
| [`2026-05-13-page-audit-10-errors-pwa-marketing.md`](./90-work/audits/2026-05-13-page-audit-10-errors-pwa-marketing.md) | Active | [#3078](https://github.com/Skords-01/Sergeant/pull/3078) |
| [`2026-05-13-testing-devx-roast.md`](./90-work/audits/2026-05-13-testing-devx-roast.md) | Active | [#1971](https://github.com/Skords-01/Sergeant/pull/1971) [#1992](https://github.com/Skords-01/Sergeant/pull/1992) [#2012](https://github.com/Skords-01/Sergeant/pull/2012) [#2022](https://github.com/Skords-01/Sergeant/pull/2022) [#2191](https://github.com/Skords-01/Sergeant/pull/2191) [#2215](https://github.com/Skords-01/Sergeant/pull/2215) [#2216](https://github.com/Skords-01/Sergeant/pull/2216) [#2218](https://github.com/Skords-01/Sergeant/pull/2218) [#3363](https://github.com/Skords-01/Sergeant/pull/3363) |
| [`2026-05-13-web-architecture-state-roast.md`](./90-work/audits/2026-05-13-web-architecture-state-roast.md) | Active | [#52](https://github.com/Skords-01/Sergeant/pull/52) [#53](https://github.com/Skords-01/Sergeant/pull/53) [#54](https://github.com/Skords-01/Sergeant/pull/54) [#57](https://github.com/Skords-01/Sergeant/pull/57) [#63](https://github.com/Skords-01/Sergeant/pull/63) [#64](https://github.com/Skords-01/Sergeant/pull/64) [#65](https://github.com/Skords-01/Sergeant/pull/65) [#1601](https://github.com/Skords-01/Sergeant/pull/1601) [#1607](https://github.com/Skords-01/Sergeant/pull/1607) [#1968](https://github.com/Skords-01/Sergeant/pull/1968) +7 |
| [`2026-05-25-hubsettings-cls-chunk-load.md`](./90-work/audits/2026-05-25-hubsettings-cls-chunk-load.md) | Open | — |
| [`2026-06-08-codebase-cleanup-audit.md`](./90-work/audits/2026-06-08-codebase-cleanup-audit.md) | Active (4 founder-decisions executed 2026-06-08; залишок — lint-debt / tombstones / інфра-питання — outstanding) | — |
| [`2026-08-XX-openclaw-internal-roast.md`](./90-work/audits/2026-08-XX-openclaw-internal-roast.md) | Active | — |
| [`2026-08-XX-sync-engine-roast.md`](./90-work/audits/2026-08-XX-sync-engine-roast.md) | Draft | [#2877](https://github.com/Skords-01/Sergeant/pull/2877) |
Expand Down
19 changes: 11 additions & 8 deletions packages/shared/src/utils/date.property.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function arbitraryLocalDate(): Date {
const year = 1970 + Math.floor(rng() * 130);
const month = Math.floor(rng() * 12); // 0..11
const day = 1 + Math.floor(rng() * 28); // 1..28, always valid
const hour = Math.floor(rng() * 24);
const hour = Math.floor(rng() * 21); // 0..20: UTC 21–23 crosses to next Kyiv day
const minute = Math.floor(rng() * 60);
return new Date(year, month, day, hour, minute);
}
Expand Down Expand Up @@ -64,25 +64,28 @@ describe("shared/utils/date – toLocalISODate property", () => {
});

it("is time-of-day invariant: only the calendar day matters", () => {
// Use 06:00 and 20:00 UTC — both safely within the same Kyiv calendar day
// regardless of DST offset (UTC+2 winter: 08:00/22:00; UTC+3 summer: 09:00/23:00).
// UTC 21–23 would cross Kyiv midnight, so we avoid those hours here.
for (let i = 0; i < NUM_RUNS; i++) {
const base = arbitraryLocalDate();
const midnight = new Date(
const earlyMorning = new Date(
base.getFullYear(),
base.getMonth(),
base.getDate(),
0,
6,
0,
0,
);
const lateNight = new Date(
const lateEvening = new Date(
base.getFullYear(),
base.getMonth(),
base.getDate(),
23,
59,
59,
20,
0,
0,
);
expect(toLocalISODate(lateNight)).toBe(toLocalISODate(midnight));
expect(toLocalISODate(lateEvening)).toBe(toLocalISODate(earlyMorning));
}
});

Expand Down
Loading