Files
krow_talent_app/scripts/__baseline__
2026-08-28 11:02:02 +05:30
..
2026-08-28 11:02:02 +05:30
2026-08-28 11:02:02 +05:30

Owliver behaviour baseline

owliver-baseline.json records how the panel routed and answered before the agent layer existed. skill-check.mjs asserts against it on every run.

Regenerating it is a deliberate act, and the reason belongs here.

2026-08-27 — the seed gained the three statuses nothing exercised

application_status has seven values. The fixture produced four: applied, ai_screened, interview, hired. shortlisted, rejected and assigned existed only in the schema, and Assignment shipped empty by design.

That gap was hiding real defects, all found the same week and none visible against the old data:

  • atOrBeyond ranks a status by its index in STAGE_ORDER, which listed five of the seven. rejected and assigned scored -1 and dropped out of every bucket including applied, so a position's funnel lost people and a role whose candidates had all been assigned read as unfilled.
  • The agent's candidates_awaiting excluded hired and rejected from "still in the running", so somebody already working a shift was offered as a person to chase.
  • insights.stalled counted "screened and waiting on a decision" as status === 'ai_screened' only, silently dropping the shortlisted — the people that phrase most describes. Caught by this regeneration, not before it.

The change: three existing applications were converted, not added, so every regression anchor holds — 24 applications, 9 scored averaging 76, 3 staff, 8 postings, all unchanged.

app_kevin   applied      → rejected      (never scored; a hard requirement)
app_sofia   ai_screened  → shortlisted   (the strongest screened candidate)
app_marco   hired        → assigned      (hired, then rostered)

Plus one Assignment for Marco — the minimum that makes assigned real. Eight of the nine positions still have none, so every reader still meets the empty case.

What drifted, verified before regenerating: one number, in four prompts. Kevin left applied, so the unscored count reads 9 where it read 10:

"Show the 10 applications waiting for review"  →  "…9 applications…"
"10 have no score" / "10 unscored applicants" / "10 unscored applications"

Nothing else moved. 1 waiting on a decision briefly became a fallback prompt and that was the stalled defect above — fixed in insights.js rather than absorbed into the baseline, and the prompt came back on its own.

2026-08-27 — the local simulator was removed

The panel used to answer from two places: an agent, and ~3,300 lines of browser-side templates. Two paths behind one avatar meant the same question got different answers depending on phrasing, so the templates were deleted.

What actually drifted, verified before regenerating: one thing. The "I do not have that on this page" decline used to list the page's capability labels as bullets — those labels were the simulator's canned readings and went with it. It now names the page's topics in a sentence.

doc shape:  ["text","list","note"]  →  ["text","text","note"]

Every intent kind was unchanged. No routing moved, no skill matching changed. That is why this regeneration was safe: the diff was read first, and it was one cosmetic change on a path that only runs when no agent is configured at all.