You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Scope per the issue: src/objects/task.object.ts, src/views/task.view.ts, src/hooks/task.hook.ts, plus zh-CN entries and tests. Not touching duty.*, dashboards/, datasets/, pages/ (parallel cards #107 / #109 / #13).
{
"issue": 108,
"status": "done",
"branch": "claude/issue-108-frontline-ui",
"pr": "https://github.com/objectstack-ai/duly/pull/115",
"premise_still_valid": true,
"summary": "All three parts shipped as metadata. (1) `duly_task.progress` — four preset phrases beside `note`, no default, inline-editable on `my_week` and the board; `progress` added to `task.hook.ts`'s `last_update_at` field list, with `attachments` deliberately left OFF it so an upload cannot be the cheap way to look busy. (2) `duly_task.attachments` — the platform `file` field, `multiple: true`; `storage` is in PLATFORM_ALWAYS_ON_CAPABILITIES so StorageServicePlugin mounts with nothing configured, and a real upload landed through the record form. Never a completion gate: pinned in the metadata (required / requiredWhen / no rule names it) and against a booted engine. (3) List columns in the deck's p16 order, board card face with source·due·progress, record page fieldGroups 基本/进展与附件/历史. Two changes the card did not ask for, both named in the PR: the board is scoped to `owner = {current_user_id}` (dragging a card writes status, and unscoped the first 100 of 186 rows were all `done` so Open/In-progress rendered empty), and the demo's in-flight tasks carry a phrase so the new column is not empty on every row.",
"tests": "Four gates through the shared verify lock on the MERGED head 3b717e0 (origin/main merged after #110/#112 landed; no conflicts): `pnpm validate` → '✓ Validation passed (499ms) Data: 5 Objects 61 Fields'; `pnpm typecheck` → `tsc --noEmit` exit 0; `pnpm test` → 'Test Files 31 passed (31) · Tests 789 passed (789)'; `pnpm build` → '✓ Build complete (755ms)'. Lock line: 'os-verify-lock: VERDICT command-exit 0 · held the lock 34s · waited 0s'. RED-FIRST ABLATION on the hook: `perl -0pi` reverted the field list to ['status','note','skip_reason'], mutation confirmed on disk by grepping BOTH spellings before reading any result ('real spelling now 0 (want 0) · mutated spelling now 1 (want 1)') — vitest then exited 1 with exactly the two new assertions red and 62 others green ('advances when a progress phrase is picked', 'advances when the phrase CHANGES, and not when it is re-sent'). No rebuild leg was needed: the suite imports src through vitest and pins artifactPath at a nonexistent file. Restore ran from a trap on EXIT/INT/TERM and was verified in both directions on disk (mutated spelling 0, real spelling 1) plus a clean `git status`. BROWSER (the acceptance, live `pnpm demo` on port 4108, Chromium 1194, my PIDs only, all killed after): inline-selected a preset phrase on a `My week` row and pressed Save All — API before `progress: null, last_update_at: 2026-08-03T07:00:00.000Z`, after `progress: \"in_hand\", last_update_at: 2026-09-02T05:00:35.098Z`, i.e. the hook stamped through a real HTTP write; uploaded a file into `attachments` via the record form — stored as `[{id, name: 'audit-cover-sheet.txt', size: 73, mimeType: 'text/plain', url: '/api/v1/storage/files/…'}]` with `last_update_at` unchanged, which is the asymmetry pin confirmed in the running app; record page rendered Basics / Progress and attachments / History; board rendered OPEN 5 · IN PROGRESS 1 · DONE 20 · SKIPPED 0 with source and progress chips on the cards; relative dates rendered with no `format` key ('Overdue 7d' in red, 'In 3 days'); zh-CN console showed 最新进展 / 附件 / 待反馈 / 已下发各部门 / 处理中 / 逾期 7 天 and the 基本 / 进展与附件 / 历史 headings. 8 screenshots pushed to the throwaway branch `screenshots/issue-108` and embedded in the PR.",
"open_questions": [
{
"question": "The card says of swimlanes '能就配' — configure them if they can be expressed. They CAN (view-level `grouping`, not `kanban.swimlaneField`), and I still left them off. Confirm that call, or tell me to turn them on.",
"options": [
"A — ship without lanes (what the PR does): the status column-header row renders at HEIGHT 0 in swimlane mode on console 17.2.0, so a laned board has no OPEN/IN PROGRESS/DONE labels at all. `source` sits on every card face instead, and the one-line re-enable is in the view comment. Filed as objectstack-ai/objectui#7303.",
"B — turn lanes on now and accept an unlabelled board until #7303 lands: the deck's p17 layout is literally satisfied, and the demo screen loses the one thing a kanban is for."
],
"recommendation": "A, because this is a p0 pre-sales screen and a board whose columns are unlabelled is not a board — a viewer cannot tell Open from Done except by dragging a card. Both halves are measured, not inferred: with `grouping` authored the lanes render (`▼ CATALOG (19)`) and the five titles sit in the DOM at y=233 inside a flex container whose measured height is 0, with a hit test at a title's own centre returning the lane's collapse button behind it; with the key absent the same board renders them as real <h3>s. Worth flagging that my first draft of this comment claimed swimlanes were IMPOSSIBLE and would have filed a bug that does not exist — that reading came from the console's other relay (ObjectView, which forwards no `grouping`), and these views do not go through it. The browser corrected it."
}
],
"out_of_scope_findings": [
"filed as objectstack-ai/objectui#7303: kanban swimlanes render the status column-header row at height 0, so a laned board loses its column labels (measured both ways on console 17.2.0, with DOM coordinates and a hit test)",
"not filed, recorded here: in a zh-CN console the attachments cell renders the count as the console's own untranslated string ('1 file' beside 附件). It is a platform i18n hole, not ours — cosmetic, and I did not want to file it without measuring which key is missing."
]
}
(Re-posted as literal text: the HTML-comment marker on the identical report above was stripped by GitHub's body sanitizer after it landed, which makes that copy invisible to a marker scan. Same JSON, nothing changed.)
{
"issue": 108,
"status": "done",
"branch": "claude/issue-108-frontline-ui",
"pr": "https://github.com/objectstack-ai/duly/pull/115",
"premise_still_valid": true,
"summary": "All three parts shipped as metadata. (1) `duly_task.progress` — four preset phrases beside `note`, no default, inline-editable on `my_week` and the board; `progress` added to `task.hook.ts`'s `last_update_at` field list, with `attachments` deliberately left OFF it so an upload cannot be the cheap way to look busy. (2) `duly_task.attachments` — the platform `file` field, `multiple: true`; `storage` is in PLATFORM_ALWAYS_ON_CAPABILITIES so StorageServicePlugin mounts with nothing configured, and a real upload landed through the record form. Never a completion gate: pinned in the metadata (required / requiredWhen / no rule names it) and against a booted engine. (3) List columns in the deck's p16 order, board card face with source·due·progress, record page fieldGroups 基本/进展与附件/历史. Two changes the card did not ask for, both named in the PR: the board is scoped to `owner = {current_user_id}` (dragging a card writes status, and unscoped the first 100 of 186 rows were all `done` so Open/In-progress rendered empty), and the demo's in-flight tasks carry a phrase so the new column is not empty on every row.",
"tests": "Four gates through the shared verify lock on the MERGED head 3b717e0 (origin/main merged after #110/#112 landed; no conflicts): `pnpm validate` → '✓ Validation passed (499ms) Data: 5 Objects 61 Fields'; `pnpm typecheck` → `tsc --noEmit` exit 0; `pnpm test` → 'Test Files 31 passed (31) · Tests 789 passed (789)'; `pnpm build` → '✓ Build complete (755ms)'. Lock line: 'os-verify-lock: VERDICT command-exit 0 · held the lock 34s · waited 0s'. RED-FIRST ABLATION on the hook: `perl -0pi` reverted the field list to ['status','note','skip_reason'], mutation confirmed on disk by grepping BOTH spellings before reading any result ('real spelling now 0 (want 0) · mutated spelling now 1 (want 1)') — vitest then exited 1 with exactly the two new assertions red and 62 others green ('advances when a progress phrase is picked', 'advances when the phrase CHANGES, and not when it is re-sent'). No rebuild leg was needed: the suite imports src through vitest and pins artifactPath at a nonexistent file. Restore ran from a trap on EXIT/INT/TERM and was verified in both directions on disk (mutated spelling 0, real spelling 1) plus a clean `git status`. BROWSER (the acceptance, live `pnpm demo` on port 4108, Chromium 1194, my PIDs only, all killed after): inline-selected a preset phrase on a `My week` row and pressed Save All — API before `progress: null, last_update_at: 2026-08-03T07:00:00.000Z`, after `progress: in_hand, last_update_at: 2026-09-02T05:00:35.098Z`, i.e. the hook stamped through a real HTTP write; uploaded a file into `attachments` via the record form — stored as `[{id, name: 'audit-cover-sheet.txt', size: 73, mimeType: 'text/plain', url: '/api/v1/storage/files/…'}]` with `last_update_at` unchanged, which is the asymmetry pin confirmed in the running app; record page rendered Basics / Progress and attachments / History; board rendered OPEN 5 · IN PROGRESS 1 · DONE 20 · SKIPPED 0 with source and progress chips on the cards; relative dates rendered with no `format` key ('Overdue 7d' in red, 'In 3 days'); zh-CN console showed 最新进展 / 附件 / 待反馈 / 已下发各部门 / 处理中 / 逾期 7 天 and the 基本 / 进展与附件 / 历史 headings. 8 screenshots pushed to the throwaway branch `screenshots/issue-108` and embedded in the PR.",
"open_questions": [
{
"question": "The card says of swimlanes '能就配' — configure them if they can be expressed. They CAN (view-level `grouping`, not `kanban.swimlaneField`), and I still left them off. Confirm that call, or tell me to turn them on.",
"options": [
"A — ship without lanes (what the PR does): the status column-header row renders at HEIGHT 0 in swimlane mode on console 17.2.0, so a laned board has no OPEN/IN PROGRESS/DONE labels at all. `source` sits on every card face instead, and the one-line re-enable is in the view comment. Filed as objectstack-ai/objectui#7303.",
"B — turn lanes on now and accept an unlabelled board until #7303 lands: the deck's p17 layout is literally satisfied, and the demo screen loses the one thing a kanban is for."
],
"recommendation": "A, because this is a p0 pre-sales screen and a board whose columns are unlabelled is not a board — a viewer cannot tell Open from Done except by dragging a card. Both halves are measured, not inferred: with `grouping` authored the lanes render (`▼ CATALOG (19)`) and the five titles sit in the DOM at y=233 inside a flex container whose measured height is 0, with a hit test at a title's own centre returning the lane's collapse button behind it; with the key absent the same board renders them as real h3 elements. Worth flagging that my first draft of this comment claimed swimlanes were IMPOSSIBLE and would have filed a bug that does not exist — that reading came from the console's other relay (ObjectView, which forwards no `grouping`), and these views do not go through it. The browser corrected it."
}
],
"out_of_scope_findings": [
"filed as objectstack-ai/objectui#7303: kanban swimlanes render the status column-header row at height 0, so a laned board loses its column labels (measured both ways on console 17.2.0, with DOM coordinates and a hit test)",
"not filed, recorded here: in a zh-CN console the attachments cell renders the count as the console's own untranslated string ('1 file' beside 附件). It is a platform i18n hole, not ours — cosmetic, and I did not want to file it without measuring which key is missing."
]
}
Activity
os-warren commentedon Sep 2, 2026
Claiming this issue.
session_01SqkTcrxUFci7nqXdbBSe2pclaude/issue-108-frontline-ui../duly-issue-108offmain@dd3c619Scope per the issue:
src/objects/task.object.ts,src/views/task.view.ts,src/hooks/task.hook.ts, pluszh-CNentries and tests. Not touchingduty.*,dashboards/,datasets/,pages/(parallel cards #107 / #109 / #13).Generated by Claude Code
Generated by Claude Code
os-warren commentedon Sep 2, 2026
{ "issue": 108, "status": "done", "branch": "claude/issue-108-frontline-ui", "pr": "https://github.com/objectstack-ai/duly/pull/115", "premise_still_valid": true, "summary": "All three parts shipped as metadata. (1) `duly_task.progress` — four preset phrases beside `note`, no default, inline-editable on `my_week` and the board; `progress` added to `task.hook.ts`'s `last_update_at` field list, with `attachments` deliberately left OFF it so an upload cannot be the cheap way to look busy. (2) `duly_task.attachments` — the platform `file` field, `multiple: true`; `storage` is in PLATFORM_ALWAYS_ON_CAPABILITIES so StorageServicePlugin mounts with nothing configured, and a real upload landed through the record form. Never a completion gate: pinned in the metadata (required / requiredWhen / no rule names it) and against a booted engine. (3) List columns in the deck's p16 order, board card face with source·due·progress, record page fieldGroups 基本/进展与附件/历史. Two changes the card did not ask for, both named in the PR: the board is scoped to `owner = {current_user_id}` (dragging a card writes status, and unscoped the first 100 of 186 rows were all `done` so Open/In-progress rendered empty), and the demo's in-flight tasks carry a phrase so the new column is not empty on every row.", "tests": "Four gates through the shared verify lock on the MERGED head 3b717e0 (origin/main merged after #110/#112 landed; no conflicts): `pnpm validate` → '✓ Validation passed (499ms) Data: 5 Objects 61 Fields'; `pnpm typecheck` → `tsc --noEmit` exit 0; `pnpm test` → 'Test Files 31 passed (31) · Tests 789 passed (789)'; `pnpm build` → '✓ Build complete (755ms)'. Lock line: 'os-verify-lock: VERDICT command-exit 0 · held the lock 34s · waited 0s'. RED-FIRST ABLATION on the hook: `perl -0pi` reverted the field list to ['status','note','skip_reason'], mutation confirmed on disk by grepping BOTH spellings before reading any result ('real spelling now 0 (want 0) · mutated spelling now 1 (want 1)') — vitest then exited 1 with exactly the two new assertions red and 62 others green ('advances when a progress phrase is picked', 'advances when the phrase CHANGES, and not when it is re-sent'). No rebuild leg was needed: the suite imports src through vitest and pins artifactPath at a nonexistent file. Restore ran from a trap on EXIT/INT/TERM and was verified in both directions on disk (mutated spelling 0, real spelling 1) plus a clean `git status`. BROWSER (the acceptance, live `pnpm demo` on port 4108, Chromium 1194, my PIDs only, all killed after): inline-selected a preset phrase on a `My week` row and pressed Save All — API before `progress: null, last_update_at: 2026-08-03T07:00:00.000Z`, after `progress: \"in_hand\", last_update_at: 2026-09-02T05:00:35.098Z`, i.e. the hook stamped through a real HTTP write; uploaded a file into `attachments` via the record form — stored as `[{id, name: 'audit-cover-sheet.txt', size: 73, mimeType: 'text/plain', url: '/api/v1/storage/files/…'}]` with `last_update_at` unchanged, which is the asymmetry pin confirmed in the running app; record page rendered Basics / Progress and attachments / History; board rendered OPEN 5 · IN PROGRESS 1 · DONE 20 · SKIPPED 0 with source and progress chips on the cards; relative dates rendered with no `format` key ('Overdue 7d' in red, 'In 3 days'); zh-CN console showed 最新进展 / 附件 / 待反馈 / 已下发各部门 / 处理中 / 逾期 7 天 and the 基本 / 进展与附件 / 历史 headings. 8 screenshots pushed to the throwaway branch `screenshots/issue-108` and embedded in the PR.", "open_questions": [ { "question": "The card says of swimlanes '能就配' — configure them if they can be expressed. They CAN (view-level `grouping`, not `kanban.swimlaneField`), and I still left them off. Confirm that call, or tell me to turn them on.", "options": [ "A — ship without lanes (what the PR does): the status column-header row renders at HEIGHT 0 in swimlane mode on console 17.2.0, so a laned board has no OPEN/IN PROGRESS/DONE labels at all. `source` sits on every card face instead, and the one-line re-enable is in the view comment. Filed as objectstack-ai/objectui#7303.", "B — turn lanes on now and accept an unlabelled board until #7303 lands: the deck's p17 layout is literally satisfied, and the demo screen loses the one thing a kanban is for." ], "recommendation": "A, because this is a p0 pre-sales screen and a board whose columns are unlabelled is not a board — a viewer cannot tell Open from Done except by dragging a card. Both halves are measured, not inferred: with `grouping` authored the lanes render (`▼ CATALOG (19)`) and the five titles sit in the DOM at y=233 inside a flex container whose measured height is 0, with a hit test at a title's own centre returning the lane's collapse button behind it; with the key absent the same board renders them as real <h3>s. Worth flagging that my first draft of this comment claimed swimlanes were IMPOSSIBLE and would have filed a bug that does not exist — that reading came from the console's other relay (ObjectView, which forwards no `grouping`), and these views do not go through it. The browser corrected it." } ], "out_of_scope_findings": [ "filed as objectstack-ai/objectui#7303: kanban swimlanes render the status column-header row at height 0, so a laned board loses its column labels (measured both ways on console 17.2.0, with DOM coordinates and a hit test)", "not filed, recorded here: in a zh-CN console the attachments cell renders the count as the console's own untranslated string ('1 file' beside 附件). It is a platform i18n hole, not ours — cosmetic, and I did not want to file it without measuring which key is missing." ] }Generated by Claude Code
os-warren commentedon Sep 2, 2026
os-dev-report
(Re-posted as literal text: the HTML-comment marker on the identical report above was stripped by GitHub's body sanitizer after it landed, which makes that copy invisible to a marker scan. Same JSON, nothing changed.)
{ "issue": 108, "status": "done", "branch": "claude/issue-108-frontline-ui", "pr": "https://github.com/objectstack-ai/duly/pull/115", "premise_still_valid": true, "summary": "All three parts shipped as metadata. (1) `duly_task.progress` — four preset phrases beside `note`, no default, inline-editable on `my_week` and the board; `progress` added to `task.hook.ts`'s `last_update_at` field list, with `attachments` deliberately left OFF it so an upload cannot be the cheap way to look busy. (2) `duly_task.attachments` — the platform `file` field, `multiple: true`; `storage` is in PLATFORM_ALWAYS_ON_CAPABILITIES so StorageServicePlugin mounts with nothing configured, and a real upload landed through the record form. Never a completion gate: pinned in the metadata (required / requiredWhen / no rule names it) and against a booted engine. (3) List columns in the deck's p16 order, board card face with source·due·progress, record page fieldGroups 基本/进展与附件/历史. Two changes the card did not ask for, both named in the PR: the board is scoped to `owner = {current_user_id}` (dragging a card writes status, and unscoped the first 100 of 186 rows were all `done` so Open/In-progress rendered empty), and the demo's in-flight tasks carry a phrase so the new column is not empty on every row.", "tests": "Four gates through the shared verify lock on the MERGED head 3b717e0 (origin/main merged after #110/#112 landed; no conflicts): `pnpm validate` → '✓ Validation passed (499ms) Data: 5 Objects 61 Fields'; `pnpm typecheck` → `tsc --noEmit` exit 0; `pnpm test` → 'Test Files 31 passed (31) · Tests 789 passed (789)'; `pnpm build` → '✓ Build complete (755ms)'. Lock line: 'os-verify-lock: VERDICT command-exit 0 · held the lock 34s · waited 0s'. RED-FIRST ABLATION on the hook: `perl -0pi` reverted the field list to ['status','note','skip_reason'], mutation confirmed on disk by grepping BOTH spellings before reading any result ('real spelling now 0 (want 0) · mutated spelling now 1 (want 1)') — vitest then exited 1 with exactly the two new assertions red and 62 others green ('advances when a progress phrase is picked', 'advances when the phrase CHANGES, and not when it is re-sent'). No rebuild leg was needed: the suite imports src through vitest and pins artifactPath at a nonexistent file. Restore ran from a trap on EXIT/INT/TERM and was verified in both directions on disk (mutated spelling 0, real spelling 1) plus a clean `git status`. BROWSER (the acceptance, live `pnpm demo` on port 4108, Chromium 1194, my PIDs only, all killed after): inline-selected a preset phrase on a `My week` row and pressed Save All — API before `progress: null, last_update_at: 2026-08-03T07:00:00.000Z`, after `progress: in_hand, last_update_at: 2026-09-02T05:00:35.098Z`, i.e. the hook stamped through a real HTTP write; uploaded a file into `attachments` via the record form — stored as `[{id, name: 'audit-cover-sheet.txt', size: 73, mimeType: 'text/plain', url: '/api/v1/storage/files/…'}]` with `last_update_at` unchanged, which is the asymmetry pin confirmed in the running app; record page rendered Basics / Progress and attachments / History; board rendered OPEN 5 · IN PROGRESS 1 · DONE 20 · SKIPPED 0 with source and progress chips on the cards; relative dates rendered with no `format` key ('Overdue 7d' in red, 'In 3 days'); zh-CN console showed 最新进展 / 附件 / 待反馈 / 已下发各部门 / 处理中 / 逾期 7 天 and the 基本 / 进展与附件 / 历史 headings. 8 screenshots pushed to the throwaway branch `screenshots/issue-108` and embedded in the PR.", "open_questions": [ { "question": "The card says of swimlanes '能就配' — configure them if they can be expressed. They CAN (view-level `grouping`, not `kanban.swimlaneField`), and I still left them off. Confirm that call, or tell me to turn them on.", "options": [ "A — ship without lanes (what the PR does): the status column-header row renders at HEIGHT 0 in swimlane mode on console 17.2.0, so a laned board has no OPEN/IN PROGRESS/DONE labels at all. `source` sits on every card face instead, and the one-line re-enable is in the view comment. Filed as objectstack-ai/objectui#7303.", "B — turn lanes on now and accept an unlabelled board until #7303 lands: the deck's p17 layout is literally satisfied, and the demo screen loses the one thing a kanban is for." ], "recommendation": "A, because this is a p0 pre-sales screen and a board whose columns are unlabelled is not a board — a viewer cannot tell Open from Done except by dragging a card. Both halves are measured, not inferred: with `grouping` authored the lanes render (`▼ CATALOG (19)`) and the five titles sit in the DOM at y=233 inside a flex container whose measured height is 0, with a hit test at a title's own centre returning the lane's collapse button behind it; with the key absent the same board renders them as real h3 elements. Worth flagging that my first draft of this comment claimed swimlanes were IMPOSSIBLE and would have filed a bug that does not exist — that reading came from the console's other relay (ObjectView, which forwards no `grouping`), and these views do not go through it. The browser corrected it." } ], "out_of_scope_findings": [ "filed as objectstack-ai/objectui#7303: kanban swimlanes render the status column-header row at height 0, so a laned board loses its column labels (measured both ways on console 17.2.0, with DOM coordinates and a hit test)", "not filed, recorded here: in a zh-CN console the attachments cell renders the count as the console's own untranslated string ('1 file' beside 附件). It is a platform i18n hole, not ours — cosmetic, and I did not want to file it without measuring which key is missing." ] }Generated by Claude Code
Clear the 18 field-no-consumers warnings by grouping every field on i…