diff --git a/docs/evidence/issue-33/00-before-employers-pending-nav-slice.png b/docs/evidence/issue-33/00-before-employers-pending-nav-slice.png new file mode 100644 index 0000000..7a063d3 Binary files /dev/null and b/docs/evidence/issue-33/00-before-employers-pending-nav-slice.png differ diff --git a/docs/evidence/issue-33/01-after-employers-pending-nav-slice.png b/docs/evidence/issue-33/01-after-employers-pending-nav-slice.png new file mode 100644 index 0000000..ec2aaab Binary files /dev/null and b/docs/evidence/issue-33/01-after-employers-pending-nav-slice.png differ diff --git a/docs/evidence/issue-33/02-before-jobs-pending-nav-slice.png b/docs/evidence/issue-33/02-before-jobs-pending-nav-slice.png new file mode 100644 index 0000000..bdd7dc4 Binary files /dev/null and b/docs/evidence/issue-33/02-before-jobs-pending-nav-slice.png differ diff --git a/docs/evidence/issue-33/03-after-jobs-pending-nav-slice.png b/docs/evidence/issue-33/03-after-jobs-pending-nav-slice.png new file mode 100644 index 0000000..838fe63 Binary files /dev/null and b/docs/evidence/issue-33/03-after-jobs-pending-nav-slice.png differ diff --git a/docs/evidence/issue-33/04-before-seeker-my-profile-nav-slice.png b/docs/evidence/issue-33/04-before-seeker-my-profile-nav-slice.png new file mode 100644 index 0000000..5c34782 Binary files /dev/null and b/docs/evidence/issue-33/04-before-seeker-my-profile-nav-slice.png differ diff --git a/docs/evidence/issue-33/05-after-seeker-my-profile-nav-slice.png b/docs/evidence/issue-33/05-after-seeker-my-profile-nav-slice.png new file mode 100644 index 0000000..d90c76b Binary files /dev/null and b/docs/evidence/issue-33/05-after-seeker-my-profile-nav-slice.png differ diff --git a/docs/evidence/issue-33/06-before-employer-record-header-and-jobs-related-list.png b/docs/evidence/issue-33/06-before-employer-record-header-and-jobs-related-list.png new file mode 100644 index 0000000..e55638f Binary files /dev/null and b/docs/evidence/issue-33/06-before-employer-record-header-and-jobs-related-list.png differ diff --git a/docs/evidence/issue-33/07-after-employer-record-header-and-jobs-related-list.png b/docs/evidence/issue-33/07-after-employer-record-header-and-jobs-related-list.png new file mode 100644 index 0000000..2c8bd12 Binary files /dev/null and b/docs/evidence/issue-33/07-after-employer-record-header-and-jobs-related-list.png differ diff --git a/docs/evidence/issue-33/08-before-job-record-header.png b/docs/evidence/issue-33/08-before-job-record-header.png new file mode 100644 index 0000000..83b2d4e Binary files /dev/null and b/docs/evidence/issue-33/08-before-job-record-header.png differ diff --git a/docs/evidence/issue-33/09-after-job-record-header.png b/docs/evidence/issue-33/09-after-job-record-header.png new file mode 100644 index 0000000..42e448e Binary files /dev/null and b/docs/evidence/issue-33/09-after-job-record-header.png differ diff --git a/docs/evidence/issue-33/10-before-candidate-record-header.png b/docs/evidence/issue-33/10-before-candidate-record-header.png new file mode 100644 index 0000000..75327d9 Binary files /dev/null and b/docs/evidence/issue-33/10-before-candidate-record-header.png differ diff --git a/docs/evidence/issue-33/11-after-candidate-record-header.png b/docs/evidence/issue-33/11-after-candidate-record-header.png new file mode 100644 index 0000000..675d8a7 Binary files /dev/null and b/docs/evidence/issue-33/11-after-candidate-record-header.png differ diff --git a/docs/evidence/issue-33/12-after-authored-view-employer-all-unchanged.png b/docs/evidence/issue-33/12-after-authored-view-employer-all-unchanged.png new file mode 100644 index 0000000..03f4c34 Binary files /dev/null and b/docs/evidence/issue-33/12-after-authored-view-employer-all-unchanged.png differ diff --git a/docs/evidence/issue-33/13-after-authored-view-job-published-unchanged.png b/docs/evidence/issue-33/13-after-authored-view-job-published-unchanged.png new file mode 100644 index 0000000..a59a70e Binary files /dev/null and b/docs/evidence/issue-33/13-after-authored-view-job-published-unchanged.png differ diff --git a/docs/evidence/issue-33/README.md b/docs/evidence/issue-33/README.md new file mode 100644 index 0000000..a77f5d0 --- /dev/null +++ b/docs/evidence/issue-33/README.md @@ -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. diff --git a/src/objects/candidate.object.ts b/src/objects/candidate.object.ts index aa0ba85..6543cc6 100644 --- a/src/objects/candidate.object.ts +++ b/src/objects/candidate.object.ts @@ -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({ diff --git a/src/objects/employer.object.ts b/src/objects/employer.object.ts index 6ddfebb..bbdcc92 100644 --- a/src/objects/employer.object.ts +++ b/src/objects/employer.object.ts @@ -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', diff --git a/src/objects/job.object.ts b/src/objects/job.object.ts index e3136ea..0e274ff 100644 --- a/src/objects/job.object.ts +++ b/src/objects/job.object.ts @@ -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',