People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

People lands on all users, and My week's row link is the task - #119

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first
Sep 2, 2026
Merged

People lands on all users, and My week's row link is the task#119
os-warren merged 1 commit into
mainfrom
claude/issue-118-people-view-subject-first

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Closes#118

Two metadata fixes, both re-measured in a browser on this branch rather than reasoned about. All four gates green at 8d1711d.

1. nav_peopleviewName: 'all_users'

The entry named sys_user with no viewName, so the Console opened that object's default view — me, "My Profile", filtered id == {current_user_id} with pageSize: 1. A manager who followed the Duty-health dashboard to People in order to look at other people got exactly one row: themselves.

all_users is the platform's own unfiltered lens (@objectstack/platform-objects, sys_user.listViews.all_users) — named, not redeclared, because the views of a runtime-provided object are not ours to author and a local copy would drift.

Measured on the running demo, signed in as the dev admin:

whatrows
/sys_user (the default view nav used to open)1
/sys_user/view/all_users (what the nav entry points at now)13

The nav entry's href is now /_console/apps/ai.objectstack.duly/sys_user/view/all_users, breadcrumb User / All Users, first row Ana Ferreira · ana.ferreira@ardenline.example.

One correction to the card: all_users renders Name / Email / Phone Number / Email Verified / Identity Source / Two-Factor Enabled / Created At — not "Name / Email / Business unit". The column set is the platform's, so it is not something this PR chooses; the row count, which is the defect, is exactly the 13 the card predicted.

2. my_week leads with subject; attachments dropped

The first column is not merely the leftmost one — two renderers read it as the row's identity, so status leading made the state of a thing stand in for the thing. Both halves confirmed fixed:

  • Desktop grid. Headers are now # · Task · Status · Source · Due · Latest progress · Actions, and the row's a[href*="/record/"] is in the Task cell with the subject as its text — e.g. Emissions return — Northgate/duly_task/record/rWCkoZEut6a7ngu2. Open is plain text beside it, no longer the only clickable thing on the row.
  • 390px cards. Cards are now titled Emissions return — Northgate, Waste transfer log review — Northgate, Keep up with regulator bulletins — not open / in_progress.

attachments is dropped from this lens only: it was a dash on every row of the busiest screen in the product. The field is untouched, the shared columns array still carries it on the other four grids, and the upload #108 built is still on the record page's "Progress and attachments" group.

late, stalled and by_unit already led with subject and are unchanged.

Guards

Both walked rather than listed by name, so a lens added later is covered on the day it lands.

  • test/views.test.ts — the my_week order pin is updated, and a new test asserts the rule that outlives the exact column list: everyduly_task grid leads with subject. The defect was one lens disagreeing with the other four, which a per-view pin would not have said. It reaches the container default (list) too, which byName cannot address.
  • test/member-page.test.ts — pins nav_people.viewName, so dropping it is a red test rather than a silently-refiltered screen.
  • test/metadata-bindings.test.ts — this is the app's first nav reference across the platform-object boundary, and that file pins boundaries to an exact zero, by design, to "fail the day one is authored". It did. Widening the pin would have been the wrong answer: a platform object's fields genuinely cannot be judged from @objectstack/spec, but its views can, because @objectstack/platform-objects is a devDependency that ships them on disk. So the walk now resolvessys_user.all_users for real and boundaries stays zero — which means a typo'd platform view name is now a finding instead of an unjudgeable gap. That is the same silent-fallback defect this PR fixes, so the guard covers the surface where it was just measured. Three self-tests cover the branch's three outcomes (resolves / fires on a typo / still records a boundary when no map is supplied).

Reverse-verification

Each new guard was mutated on the committed tree and observed failing, then restored (tree confirmed clean afterwards):

mutationresult
drop viewName from nav_peoplemember-page red — expected undefined to be 'all_users'
put status back first in my_weekviews red on both the order pin and the new leading-column guard
viewName: 'all_userz'metadata-bindings red — "the platform object sys_user declares no list view named all_userz … Declared: all_users, banned, me, two_factor, unverified"

That third message lists the five real SysUser.listViews names, which is the evidence the walk reads the platform package rather than a hand-copied list.

Gates

Run on the final tree at 8d1711d:

pnpm validate ✓ Validation passed (445ms)
pnpm typecheck exit 0
pnpm test Test Files 32 passed (32) · Tests 837 passed (837)
pnpm build ✓ Build complete

validate prints the one expected hierarchy-security capability warning, which AGENTS.md §7 says is this repo's normal state and must not be silenced.

Not in this card

Bulk confirm / approve / return on the duty views, board card tweaks, and dashboard number formatting are all untouched, as the issue directs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p


Generated by Claude Code

Two nav/column defects measured in the browser on the demo, both of which
made a screen show the wrong thing while looking correct.
`nav_people` named `sys_user` with no `viewName`, so the Console opened that
object's DEFAULT view — `me`, "My Profile", filtered `id == {current_user_id}`
with `pageSize: 1`. A manager who followed the Duty-health dashboard to People
in order to look at other people saw exactly one row: themselves. It now names
`all_users`, the platform's own unfiltered lens, rather than redeclaring a view
for an object this app does not own.
`my_week.columns` led with `status`, and the first column is not merely the
leftmost one: the desktop grid makes it the record link and the 390px card
renderer makes it the card title. So the only clickable thing on a row was the
`Open` pill, with the task name inert beside it, and every card was headed with
a raw `open` / `in_progress`. `subject` now leads and `status` follows.
`attachments` is dropped from this lens alone — it was a dash on every row of
the busiest screen; the field, the other grids and the record page's upload are
untouched.
Guards, both walked rather than listed so a later lens is covered on the day it
lands:
- `test/views.test.ts` pins the new order and adds the rule that outlives it:
every `duly_task` grid leads with `subject`. The defect was one lens
disagreeing with the other four, which a per-view pin would not have said.
- `test/metadata-bindings.test.ts` — this is the app's first nav reference
across the platform-object boundary, and that file pins boundaries to an
exact zero. Widening the pin was the wrong answer: a platform object's FIELDS
cannot be judged from `@objectstack/spec`, but its VIEWS can, because
`@objectstack/platform-objects` ships them on disk. The walk now resolves
`sys_user.all_users` for real, so a typo'd platform view name is a finding
instead of an unjudgeable boundary — the same silent-fallback defect this
commit fixes. Three self-tests cover the branch's three outcomes.
Closes#118
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqkTcrxUFci7nqXdbBSe2p
@os-warren
os-warren marked this pull request as ready for review September 2, 2026 10:33
@os-warren
os-warren merged commit b7d4c90 into mainSep 2, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

People lands on "My Profile" (one row), and My week's row link is the status pill — two nav/column fixes

1 participant

@os-warren