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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
60 changes: 60 additions & 0 deletions docs/evidence/issue-33/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Evidence — issue #33 (`highlightFields` on the three `filters`-slice objects)

Captured on 2026-09-07 against `OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai npx objectstack dev
--fresh --database-driver memory -p 4511 --log-level info`, after `[Seeder] Seed loading complete
{"inserted":818,...,"errored":0}`. `--database-driver memory` is required: on the default sqlite
driver `ats_employer` reads 0 rows to platform personas (#39), which empties the Employers Pending
queue and would make the "before" unmeasurable.

**Before** was re-measured on this branch's base (`62e496d`, `origin/main`) in the same container
and the same boot recipe — not quoted from the `docs/evidence/issue-3/` shots. It reproduces them
exactly.

| Persona | Sign-in |
|:--|:--|
| Platform administrator | `admin@platform.example` / `demo1234` |
| Job seeker | `candidate01@mail.example` / `demo1234` |

## The nav slices — the card's acceptance

| File | Persona | URL | What it shows |
|:--|:--|:--|:--|
| `00-before-employers-pending-nav-slice.png` | platform | `/_console/apps/ats/ats_employer/data?filter[verification_status]=pending` | **Before.** `Employer Name · Short Name · Logo · Industry · Company Size · City` (2 records). No verdict field, no contact. |
| `01-after-employers-pending-nav-slice.png` | platform | same | **After.** `Employer Name · Industry · City · Verification · Service Tier · Primary Contact` (2 records). |
| `02-before-jobs-pending-nav-slice.png` | platform | `/_console/apps/ats/ats_job/data?filter[status]=pending_review` | **Before.** `Job Title · Employer · Employer Organization · Department · Description · Requirements` (6 records) — two rich-text columns, no status, no location. |
| `03-after-jobs-pending-nav-slice.png` | platform | same | **After.** `Job Title · Employer · Status · City · Employment Type · Work Mode` (6 records). |
| `04-before-seeker-my-profile-nav-slice.png` | seeker | `/_console/apps/ats/ats_candidate/data?filter[user]={current_user_id}` (resolved to `usr_ats_c01`) | **Before.** `Full Name · Account · Photo · Phone · Email · City` (1 record). The third `filters` slice, from the card's comment. |
| `05-after-seeker-my-profile-nav-slice.png` | seeker | same | **After.** `Full Name · Current Title · City · Seeking Status · Years of Experience · Profile Visibility` (1 record). |

Both platform slices were reached by **clicking the nav entry**, not by typing the URL, so the shots
are of the shipped navigation.

## The other surfaces `highlightFields` feeds

| File | What it shows |
|:--|:--|
| `06-before-employer-record-header-and-jobs-related-list.png` | **Before.** One frame with both: the employer record header strip (`Primary Contact · Industry`) and, under Related, the Jobs related list (`Job Title · Employment Type · Work Mode · Salary Period · Min. Education · Status`). |
| `07-after-employer-record-header-and-jobs-related-list.png` | **After.** Header `Industry · City · Verification: Pending · Service Tier: Trial · Primary Contact`; Jobs related list `Job Title · Status · City · Employment Type · Work Mode`. `Employer` is in `ats_job.highlightFields` but is (correctly) suppressed on its own parent's related list. |
| `08-before-job-record-header.png` / `09-after-job-record-header.png` | Job record header: `Employer · Employer Organization` → `Employer · Status · City · Employment Type · Work Mode`. **Regression to note:** at five items two badges truncate (`Pendi…`, `Full-ti…`), and `Status` is now shown twice — once in the strip and once in the state-machine stage bar directly below it. |
| `10-before-candidate-record-header.png` / `11-after-candidate-record-header.png` | Candidate record header: `Phone · Email` → `Current Title · City · Seeking Status · Years of Experience · Profile Visibility`. **Trade-off to note:** phone and email leave the header; both remain on the Details tab as live `tel:` / `mailto:` links. |

## Non-regression — authored views are untouched

`highlightFields` feeds only the surfaces that derive their columns. Views that author a column list
are unaffected; these two shots are the check, and each rendered set is byte-identical to the array
in `src/views/`.

| File | Rendered | Authored in |
|:--|:--|:--|
| `12-after-authored-view-employer-all-unchanged.png` | `Employer Name · Industry · Company Size · City · Verification · Service Tier · Primary Contact` (12 records) | `src/views/employer.view.ts` `columns` |
| `13-after-authored-view-job-published-unchanged.png` | `Job Title · Employer · City · Work Mode · Salary (min) · Salary (max) · Employment Type` (22 records) | `src/views/job.view.ts` `seekerColumns` |

`ats_job.all` (`platformColumns`) and `ats_inquiry.inbox` were checked the same way and are also
unchanged.

## Unrelated observation, visible in these shots

`Primary Contact` (a `Field.user`) renders as the raw user id — `usr_ats_pixelforge_admin` — in every
grid, including the authored `ats_employer.all` view in `12-…` which this change does not touch. It
resolves to a display name on the record header and on the Details tab. Pre-existing and independent
of this card; filed separately.
8 changes: 8 additions & 0 deletions src/objects/candidate.object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ export const Candidate = ObjectSchema.create({
// tenant wall and isolation is carried by the row-level rules alone.
tenancy: { enabled: false },
nameField: 'full_name',
// ADR-0085 ordered "most important fields". The seeker's "My Profile" entry
// is a `filters` slice (`{ user: '{current_user_id}' }`) on the bare data
// surface, so it derives its columns from this and nothing else; undeclared,
// the walk led with `Account`, `Photo` and `Phone` (#33). Listing
// `profile_visibility` makes the value legible to whoever may already read
// the row — it does not make it enforced; that is #13's job, and no entry
// here should be mistaken for it.
highlightFields: ['full_name', 'current_title', 'city', 'seeking_status', 'experience_years', 'profile_visibility'],

fields: {
full_name: Field.text({
Expand Down
12 changes: 12 additions & 0 deletions src/objects/employer.object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@ export const Employer = ObjectSchema.create({
// security layer; job seekers only ever see verified employers through jobs.
sharingModel: 'private',

// The ordered "most important fields" role (ADR-0085, spec 17 — renamed from
// `compactLayout` in 11.7.0). Every surface that has no authored column list
// derives from this: the platform "Employers Pending" nav slice (a `filters`
// slice on the bare data surface, which never reads an object's authored
// list), the record header strip, lookup previews. Undeclared, the walk took
// the first six business fields and gave a verification reviewer
// `Short Name`, `Logo` and `Company Size` but not the verdict field, not the
// contact (#33). `verification_docs` is deliberately absent: the seed carries
// it on 0 of 12 rows and a multi-file column cannot be read at a glance —
// the reviewer opens it on the record.
highlightFields: ['name', 'industry', 'city', 'verification_status', 'service_tier', 'owner'],

fields: {
name: Field.text({
label: 'Employer Name',
Expand Down
14 changes: 14 additions & 0 deletions src/objects/job.object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,20 @@ export const Job = ObjectSchema.create({
// `employer_org` at the row-level layer.
tenancy: { enabled: false },

// ADR-0085 ordered "most important fields" — what the platform "Jobs Pending"
// nav slice, the employer record's Jobs related list and the job record
// header lead with when no column list is authored (#33). Undeclared, the
// field walk handed a reviewer `Description` and `Requirements` — two
// rich-text columns — and neither `status` nor the location.
//
// `work_mode` sits where the card proposed `published_at`: the state machine
// only reaches `published` THROUGH `pending_review`, so `published_at` is
// null on every row this queue can ever contain (measured: 0 of 6 pending,
// and 0 of the 12 rows in draft/pending_review/rejected). `work_mode` is set
// on 40 of 40 and completes the terms pair a reviewer checks with
// `employment_type`. `published_at` stays on the record's Details tab.
highlightFields: ['title', 'employer', 'status', 'city', 'employment_type', 'work_mode'],

fields: {
title: Field.text({
label: 'Job Title',
Expand Down
Loading