agent build

This commit is contained in:
2026-08-28 12:21:44 +05:30
parent b6f8655909
commit f7df96c973
138 changed files with 24164 additions and 207 deletions

View File

@@ -0,0 +1,99 @@
---
id: activity-analysis
name: Activity Analysis
description: Break down what has happened in this workspace, by kind of event and by account.
category: operations
pages:
- activity
status: active
version: 1
triggers:
- activity breakdown
- event breakdown
- what kind of events
- events by type
- who did what
- busiest account
owliver:
enabled: true
suggestions:
- label: What kinds of event are there?
capability: table
- label: Summarize workspace activity
capability: summary
- label: Activity over recent periods
capability: flow
capabilities:
- summary
- stats
- table
- list
- progress
- flow
responses:
summary:
title: Activity breakdown
source: activity.breakdown
stats:
title: Activity breakdown
source: activity.breakdown
table:
title: Events by kind
source: activity.breakdown
list:
title: Events by kind
source: activity.breakdown
progress:
title: Events by kind
source: activity.breakdown
flow:
title: Activity over time
source: activity.breakdown
periods:
- last-7-days
- this-month
- previous-month
---
# Activity Analysis
## Purpose
- Report what has happened in this workspace and in what proportion.
- Count how many accounts are active.
- Show activity across recent periods.
## Capabilities
- Break events down by kind, with each kind's share.
- Count distinct event kinds and active accounts.
- Window the breakdown by period.
## Data
Reads `activity.breakdown`, which counts `UserActivity` records by `event_type`
and by account.
## Analysis
Events are counted by kind and expressed as a share of the total, because a raw
count means little without knowing whether twelve logins is most of the log or a
fraction of it.
Stored event names are machine keys; they are rendered as words so a reader does
not have to translate `hire_candidate` in their head.
## Output
Total events, number of distinct kinds, number of active accounts, then a row
per kind with its count and share.
## Limitations
- This describes the audit log, not the underlying records. Ten `apply_job`
events mean ten logged actions, which is not a guarantee of ten applications
surviving in the pipeline.
- Overlapping periods are deduplicated by event, so asking for today and the
last seven days together does not double-count today.
- This counts activity; it does not judge it. Whether a pattern is unusual is
Anomaly Detection's question.

View File

@@ -0,0 +1,27 @@
---
id: analytics-insights
name: Analytics Insights
description: Help Owliver explain the analytics shown on the current page.
pages:
- analytics
status: active
actions:
- navigate_to_analytics
---
# Analytics Insights
## Purpose
Explain the figures on the Analytics page — conversion, speed, department
performance — using the same records the page renders.
## Capabilities
- Explain hiring trend and conversion.
- Compare department performance.
- Identify where the funnel loses candidates.
## Actions
- navigate_to_analytics

View File

@@ -0,0 +1,96 @@
---
id: anomaly-detection
name: Anomaly Detection
description: Surface activity that departs from this workspace's own pattern — and stay quiet when nothing does.
category: operations
pages:
- activity
- control-center
status: active
version: 1
triggers:
- anomaly
- anomalies
- anomalous
- unusual
- out of pattern
- suspicious
owliver:
enabled: true
suggestions:
- label: Is anything unusual?
capability: insight
- label: Show the signals
capability: table
capabilities:
- summary
- insight
- list
- table
- stats
responses:
summary:
title: Activity signals
source: activity.signals
insight:
title: Unusual activity
source: activity.signals
list:
title: Signals
source: activity.signals
table:
title: Signals
source: activity.signals
stats:
title: Activity signals
source: activity.signals
---
# Anomaly Detection
## Purpose
- Surface activity that departs from this workspace's own baseline.
- Explain each signal rather than only naming it.
- Report nothing when nothing departs, so a signal keeps its meaning.
## Capabilities
- Detect concentration, bursts, off-hours activity, silence and privileged-action share.
- Report how many signals are currently raised.
- Explain what each one means.
## Data
Reads `activity.signals`, which is the same detection the assistant's own
greeting counts — one implementation in `lib/activitySignals.js`, so "two
unusual patterns" means the same two wherever it is said.
## Analysis
Five patterns are checked against this workspace's own history:
1. **Concentration** — one account is responsible for half or more of events.
2. **Burst** — more than three actions from one account inside one hour.
3. **Off-hours** — activity before 06:00 or after 22:00.
4. **Silent** — a log that has events but nothing in the last 24 hours.
5. **Privileged share** — more than 30% of events change who is employed or
what is being hired for.
Only patterns that clear their threshold are reported. A workspace with nothing
unusual returns no signals, not a low-severity note.
## Output
A count of raised signals, and one row per signal explaining what triggered it
with the figure behind it.
## Limitations
- **A signal is a deviation from a baseline, not a verdict.** On a live
deployment most resolve to an integration, a bulk import or a busy afternoon.
Nothing here asserts wrongdoing.
- Thresholds are fixed, not learned. A workspace whose normal pattern is one
busy account will report concentration every time it is asked.
- The baseline is the whole activity log, not a rolling window, so a young
workspace has little to compare against.

View File

@@ -0,0 +1,105 @@
---
id: attendance-analysis
name: Attendance Analysis
description: Analyse workforce attendance, lateness and absence, and compare people and departments.
category: workforce
pages:
- analytics
- control-center
status: active
version: 1
triggers:
- attendance
- absence
- absences
- absenteeism
- late arrival
- missed shift
- missed shifts
owliver:
enabled: true
suggestions:
- label: How is attendance?
capability: summary
- label: Compare attendance by person
capability: table
- label: Attendance over recent periods
capability: flow
capabilities:
- summary
- stats
- table
- progress
- flow
- insight
responses:
summary:
title: Attendance
source: workforce.attendance
stats:
title: Attendance
source: workforce.attendance
table:
title: Attendance by person
source: workforce.attendance
progress:
title: Attendance by person
source: workforce.attendance
flow:
title: Attendance over time
source: workforce.attendance
periods:
- last-7-days
- this-month
- previous-month
insight:
title: Attendance
source: workforce.attendance
---
# Attendance Analysis
## Purpose
- Report how reliably the workforce is turning up.
- Separate turning up from turning up on time, because they have different causes.
- Compare people and departments so a problem can be located rather than only counted.
## Capabilities
- Summarize attendance, punctuality and missed shifts.
- Compare attendance per person, worst first.
- Show attendance across recent periods.
## Data
Reads `workforce.attendance`, which counts `ShiftRecord` entries — every shift
scheduled, whether it was worked, how late it started and how long it ran.
Department is the position's `role_category`, the same field Hired History and
Analytics group by.
## Analysis
Attendance is the share of scheduled shifts that were **turned up for at all**,
late or not. Punctuality is reported separately, as the share turned up for on
time. Folding the two together would make a reliably-late team look absent and
a genuinely absent one look better than it is.
Minutes lost to lateness are reported alongside the count, because four late
arrivals says nothing about whether it cost ten minutes or two hours.
## Output
Headline attendance and punctuality rates, missed shifts split into absences and
no-shows, and a row per person with their record. Over periods, one figure per
window.
## Limitations
- Only shifts that were scheduled are counted. Unrostered work does not appear.
- A no-show and an absence are counted separately but both reduce attendance;
the distinction is in the detail line, not in the headline rate.
- The roster is whoever has shift records. This workspace has three, so a
department average is one person's record — the per-person view is the more
honest read at this size.
- Excused absence is a recognised status but none is currently recorded.

View File

@@ -0,0 +1,37 @@
---
id: bartending-training
name: Bartending Training
description: Training path for specs, speed and responsible service behind a bar.
skill: bartending
pages:
- positions
- profile
---
# Bartending Training
Speed, specs, and the judgement to run a bar alone.
Attached to Positions and Profile but not Candidates: bar levels are read when
matching someone to a role and when they are planning their own development, and
the recruiter's candidate view is kept to the skills the roles on file ask for.
## Beginner
Pour to spec and keep a station clean through a service.
## Intermediate
Refuse service without a scene, and document what happened.
## Advanced
Run a bar alone through a full event.
## Expert
Design a list and train the people who pour it.
## Verification
Owliver evaluates the recorded pour and the spoken refusal.

View File

@@ -0,0 +1,98 @@
---
id: candidate-analysis
name: Candidate Analysis
description: Analyse the applicant pool's quality, and how much of it has actually been screened.
category: hiring
pages:
- candidates
- candidates-analysis
status: active
version: 1
triggers:
- candidate quality
- quality of candidates
- score band
- score bands
- screening coverage
- how strong*candidates
- how good*candidates
owliver:
enabled: true
suggestions:
- label: How strong is the candidate pool?
capability: summary
- label: Show candidates by score
capability: table
- label: Score bands
capability: progress
capabilities:
- summary
- stats
- table
- list
- progress
- insight
responses:
summary:
title: Candidate quality
source: candidates.quality
stats:
title: Candidate quality
source: candidates.quality
table:
title: Candidates by score
source: candidates.quality
limit: 10
list:
title: Strongest candidates
source: candidates.quality
limit: 5
progress:
title: Candidate quality
source: candidates.quality
insight:
title: Candidate quality
source: candidates.quality
---
# Candidate Analysis
## Purpose
- Report how strong the applicant pool is.
- Report how much of it anyone has actually looked at, beside the quality figure.
- Rank candidates by score so a shortlist has a starting point.
## Capabilities
- Summarize pool size, screening coverage, average score and interview count.
- List or tabulate candidates by score.
- Break the scored pool into quality bands.
## Data
Reads `candidates.quality`, which counts `JobApplication` records and their
`ai_score`, joined to `AIInterview` records for interview coverage.
## Analysis
Coverage is reported next to quality, always. An average score computed from a
fifth of the pool is not the pool's average, and reporting the first without the
second is how a hiring dashboard talks itself into confidence.
Scored candidates are grouped into four bands — 80 and above, 70 to 79, 50 to 69,
and below 50 — because a mean hides whether a pool is uniformly mediocre or
split between strong and weak.
## Output
Pool size, share screened, average score across scored candidates only, and
interview count. Then candidates ranked by score with their role and stage.
## Limitations
- Unscored candidates are excluded from the average rather than counted as zero.
They are reported separately as the unscreened share.
- A score is an AI screening score, not an interview outcome or a hiring decision.
- Filtering by period counts applications by when they were received, not by when
they were screened.

View File

@@ -0,0 +1,29 @@
---
id: candidate-search
name: Candidate Search
description: Help Owliver search and summarize candidates.
pages:
- candidates
- candidates-analysis
status: active
actions:
- navigate_to_candidates
---
# Candidate Search
## Purpose
Read the candidate pipeline on the current page and answer questions about who
is waiting, who is strongest, and where screening is incomplete.
## Capabilities
- Summarize the candidate pipeline.
- Identify candidates waiting on a decision.
- Surface unscored or incomplete records.
- Compare candidates by screening score.
## Actions
- navigate_to_candidates

69
skills/create-position.md Normal file
View File

@@ -0,0 +1,69 @@
---
id: create-position
name: Create Position
description: Create a position by answering a few questions in the chat.
pages:
- positions
status: active
prompt: Create a position
triggers:
- create a position
- create position
# A client is the company a position is staffed for, so asking for one starts
# the same conversation — it simply leads with the company question.
- create a client
- create client
- add a client
- new client
- create a * position
- create * position
- new position
- new * position
- post a job
- post a * job
- open a role
- open a * role
- add a position
- i want to hire
actions:
- create_position
---
# Create Position
## Purpose
Create a position without leaving the Positions page. Owliver asks for what it
does not already know, one question at a time, offers the answers as chips, then
reads the whole thing back before anything is written.
No form opens. No page is navigated to. The record created is the same
`JobPosting` the manual form writes, through the same create action.
## Capabilities
- Understand requests to create positions.
- Read the role, location, pay, experience, English level and certifications out
of a single sentence.
- Ask only for what the request did not already answer.
- Offer each answer as a suggestion, so the whole flow can be clicked.
- Read the position back for confirmation before creating it.
- Create the position on the page you are already on.
## Conversation
Each line is `field | question | suggestions | required?`. Suggestions beginning
with `@` come from the application's own data, so a role category added in the
form is offered here without this file changing.
- company | Which client is this role for? Type the company name. | | required
- role_category | What role are you hiring for? | @roles | required
- location | Where will this role be based? | Chennai; Bengaluru; Coimbatore; Bay Area; Other | required
- pay | What is the pay range? | $18–$28/hr; $25–$35/hr; $30–$40/hr; Custom | required
- min_experience_years | Any minimum experience? | No minimum; 1 year; 2 years; 3+ years | optional
- english_required | What is the minimum English level? | @english | optional
- certifications_required | Any required certifications? | @certifications; None | optional
## Actions
- create_position

View File

@@ -0,0 +1,33 @@
---
id: customer-service-training
name: Customer Service Training
description: Training path for handling guests, complaints and recovery.
skill: customer_service
pages:
- positions
- candidates
- profile
---
# Customer Service Training
Reading a guest, handling what goes wrong, and leaving them better than you
found them. Three rungs: there is no fourth thing to be good at here, and
inventing an Expert tier would make Expert mean less everywhere else.
## Beginner
Greet, read and serve a guest without supervision.
## Intermediate
Handle a complaint to resolution without escalating it.
## Advanced
Recover a badly broken experience and keep the guest.
## Verification
Owliver scores the response against the criteria on each module — what was
acknowledged, what was offered, and whether the table was protected.

View File

@@ -0,0 +1,81 @@
---
id: executive-summary
name: Executive Summary
description: The whole workspace in one reading — positions, candidates, hires, talent and attendance.
category: analytics
pages:
- control-center
status: active
version: 1
triggers:
- executive summary
- workspace summary
- overall summary
- state of the workspace
- brief me
owliver:
enabled: true
suggestions:
- label: Give me an executive summary
capability: summary
- label: Show the headline figures
capability: stats
capabilities:
- summary
- stats
- card
- table
- insight
responses:
summary:
title: Workspace summary
source: workspace.summary
stats:
title: Workspace summary
source: workspace.summary
card:
title: Workspace summary
source: workspace.summary
table:
title: Workspace summary
source: workspace.summary
insight:
title: Workspace summary
source: workspace.summary
---
# Executive Summary
## Purpose
- Give a management-level reading of the whole workspace in one answer.
- Draw every figure from the source that owns it, so the summary cannot drift
from the pages it summarizes.
## Capabilities
- Report open roles, candidates, hires, talent pool size, attendance and logged events.
## Data
Reads `workspace.summary`, which counts `JobPosting`, `JobApplication`, `Staff`,
`WorkerProfile`, `UserActivity` and `ShiftRecord`.
## Analysis
Each figure is read from the domain that owns it rather than recomputed here. A
domain with no records contributes a zero and says so in its detail line — the
summary reports what is there, including an absence.
## Output
Six headline figures: open roles, candidates, hires, talent pool, attendance
rate and events logged, each with a supporting detail.
## Limitations
- This is a count, not a diagnosis. Which figures are a problem is what Staffing
Risk, Operational Risk and Anomaly Detection answer.
- Attendance is 0 where no shifts have been recorded, and the detail line says
so rather than implying nobody turned up.
- No trend or comparison to a previous period is included.

View File

@@ -0,0 +1,31 @@
---
id: food-safety-training
name: Food Safety Training
description: Training path for hazard awareness, temperature control and hygiene.
skill: food_safety
pages:
- positions
- candidates
- profile
---
# Food Safety Training
Finding the hazard before it finds you. Every level is evidenced against a real
prep station rather than a quiz score alone.
## Beginner
Identify the common hazards in a prep station.
## Intermediate
Hold, store and label food at safe temperatures through a full service.
## Advanced
Run a station to audit standard and correct others on it.
## Verification
Owliver judges the hazards identified and the ones missed.

View File

@@ -0,0 +1,64 @@
---
id: forge-skill-management
name: Forge Skill Management
description: Create workforce skills, training and verification in KROW Forge.
pages:
- university
status: active
prompt: Create a skill
triggers:
- create a skill
- create skill
- create a new skill
- create a skill for *
- create a * skill
- new skill
- add a skill
- build a skill
- draft a skill
- create a skill training
- create skill training
- add skill training
- create training
- create a training for *
- create training for *
- create a * training
- add training
- add training to *
- build training
- write training
- create a challenge for *
- add a challenge for *
- review the * skill
- review skill
actions:
- open_create_skill_training
- open_create_training
- navigate_to_forge
---
# Forge Skill Management
## Purpose
Help an administrator build the workforce skill library: define what the
workforce must be able to do, write the training that teaches it, decide what
counts as proof, and say what the evaluation checks — using the Forge authoring
flow the page already has.
Owliver never publishes. It drafts, and hands the draft back to the existing
flow for review, which is the same rule Create Position follows.
## Capabilities
- Create workforce skills
- Create training
- Define verification
- Explain Forge skills
- Navigate Forge workflows
## Actions
- open_create_skill_training
- open_create_training
- navigate_to_forge

View File

@@ -0,0 +1,61 @@
---
id: hiring-activity-assistant
name: Hiring Activity Assistant
description: Answer questions about recent hiring activity on a position.
pages:
- positions
status: active
triggers:
- hiring activity
- hiring summary
- hiring flow
- recent applications
- applications over time
owliver:
enabled: true
# One suggestion per capability. A bare `- Show hiring activity` used to sit
# above these two: with no `capability:` it fell through to the first declared
# one — `summary` — so it and "Summarize hiring activity" were two chips for a
# single answer. Every suggestion here now names the capability it asks for,
# which is what makes a chip and an answer one-to-one.
suggestions:
- label: Summarize hiring activity for this position
capability: summary
- label: Show hiring activity as a flow
capability: flow
capabilities:
- summary
- flow
responses:
summary:
title: Hiring Activity Summary
source: position.activity
periods:
- today
- yesterday
- last-week
flow:
title: Hiring Activity Flow
source: position.activity
steps:
- today
- yesterday
- last-week
---
# Hiring Activity Assistant
## Purpose
Answer questions about how many people have applied to a position lately, in the
panel beside the Positions experience.
This is a separate definition from the Hiring Activity UI skill, and each is
managed on its own list — but both name `position.activity`, so both are read by
the one shared resolver from the same application records. Switching either off
leaves the other exactly as it was.
## Capabilities
- Summarize applications to this position over today, yesterday and last week.
- Draw the same counts as a flow inside the answer.

View File

@@ -0,0 +1,88 @@
---
id: hiring-history-analysis
name: Hiring History Analysis
description: Analyse completed hires — who was hired, how quickly, and how well they scored.
category: hiring
pages:
- hired-history
status: active
version: 1
triggers:
- hiring history
- hire quality
- quality of hire
- time to hire
- who did we hire
- recent hires
owliver:
enabled: true
suggestions:
- label: Who did we hire recently?
capability: list
- label: How is hiring performance?
capability: summary
capabilities:
- summary
- stats
- list
- table
- timeline
- insight
responses:
summary:
title: Hiring performance
source: hires.performance
stats:
title: Hiring performance
source: hires.performance
insight:
title: Hiring performance
source: hires.performance
list:
title: Recent hires
source: hires.recent
limit: 10
table:
title: Recent hires
source: hires.recent
timeline:
title: Recent hires
source: hires.recent
---
# Hiring History Analysis
## Purpose
- Report hires that have already happened.
- Report how long they took and how well they scored.
- Keep the record after the decision separate from the pipeline before it.
## Capabilities
- Summarize total hires, average days to hire, quality of hire and conversion rate.
- List recent hires with their role and date.
## Data
Reads `hires.performance` and `hires.recent`, which join `Staff` to their
`JobApplication` and `JobPosting` records.
## Analysis
Time to hire is the span between an application arriving and its final update.
Quality of hire is the average AI score across scored applications. Conversion
is hires as a share of all applications.
## Output
Headline hiring figures, and a list or timeline of recent hires.
## Limitations
- This is the record after the decision. Candidates still under consideration
are Candidate Analysis's question.
- Time to hire is measured from the application record's timestamps, not from
when a role was opened.
- Quality of hire is a screening score, not a performance review. Nothing here
reports how a hire has since worked out.

View File

@@ -0,0 +1,88 @@
---
id: hiring-pulse-analysis
name: Hiring Pulse Analysis
description: Read the recent rhythm of hiring — applications arriving, and how the funnel is converting.
category: hiring
pages:
- control-center
- analytics
status: active
version: 1
triggers:
- hiring pulse
- hiring velocity
- hiring rhythm
- application rate
owliver:
enabled: true
suggestions:
- label: What is the hiring pulse?
capability: summary
- label: Applications over recent periods
capability: flow
capabilities:
- summary
- flow
- stats
- insight
responses:
summary:
title: Hiring pulse
source: candidates.activity
periods:
- today
- last-7-days
- previous-month
flow:
title: Applications over time
source: candidates.activity
periods:
- today
- last-7-days
- this-month
- previous-month
stats:
title: Hiring performance
source: hires.performance
insight:
title: Hiring performance
source: hires.performance
---
# Hiring Pulse Analysis
## Purpose
- Report the recent rhythm of hiring: how many applications are arriving, and
how the funnel is converting them.
- Distinguish a quiet week from a broken pipeline.
## Capabilities
- Count applications arriving across recent periods.
- Report conversion, speed and quality of hire.
## Data
Reads `candidates.activity` for arrival counts over periods, and
`hires.performance` for conversion, time-to-hire and quality.
## Analysis
Arrival counts are reported per period rather than as a single rate, because a
rate averages away the shape — thirty applications in a month is a different
situation depending on whether they arrived steadily or all on one day.
## Output
Applications per period, and headline conversion, speed and quality figures.
## Limitations
- **This is the analysis definition only.** The Hiring Pulse card that appears
on Krow pages is a separate UI configuration with its own placement and
period settings; the two are deliberately not the same definition and changing
one does not change the other.
- Arrival counts are by application creation date, not by when a role opened.
- A period with no applications reports zero, which is a real reading — it does
not distinguish "nobody applied" from "the role was not advertised".

View File

@@ -0,0 +1,37 @@
---
id: leadership-training
name: Leadership Training
description: Training path for briefing, assigning and correcting a floor team.
skill: leadership
pages:
- profile
---
# Leadership Training
Pre-shift briefings, section assignments, and correcting a teammate without
deflating them.
Attached to Profile only: this is a development path an employee plans for
themselves. It is deliberately not surfaced on the recruiter-facing pages, which
demonstrates that `pages` controls visibility per page rather than globally.
## Beginner
Run a pre-shift briefing for a small section.
## Intermediate
Assign sections and hold a service to time.
## Advanced
Lead a floor team of eight through a large event.
## Expert
Build the rota and develop the leads who run it.
## Verification
Owliver evaluates the recorded briefing against ownership, timing and tone.

View File

@@ -0,0 +1,80 @@
---
id: learning-analysis
name: Learning Analysis
description: Report what the training library holds and how far the workforce has progressed through it.
category: workforce
pages:
- krow-forge
status: active
version: 1
triggers:
- learning analysis
- training progress
- course progress
- training library
- what training
owliver:
enabled: true
suggestions:
- label: How is training progressing?
capability: progress
- label: What does the library hold?
capability: list
capabilities:
- summary
- progress
- list
- table
- stats
responses:
summary:
title: Training progress
source: workforce.training
progress:
title: Training progress
source: workforce.training
list:
title: Training paths
source: workforce.training
table:
title: Training paths
source: workforce.training
stats:
title: Training progress
source: workforce.training
---
# Learning Analysis
## Purpose
- Report what the training library holds.
- Report how far the workforce has progressed against it.
## Capabilities
- Summarize training paths and progress against them.
- List or tabulate the paths in the library.
## Data
Reads `workforce.training`, the existing source behind the Forge progression
views.
## Analysis
Progress is counted against the paths the library actually defines, so adding a
path changes the denominator rather than being reported as a sudden fall in
completion.
## Output
Training paths with progress against each.
## Limitations
- A skill in Forge is something a person learns and is verified in. It is not an
Owliver capability, and the two must not be described as the same thing.
- Progress is personal to the signed-in worker where their record is loaded, and
library-level otherwise.
- This reports progression, not whether the training is any good.

View File

@@ -0,0 +1,94 @@
---
id: operational-risk
name: Operational Risk
description: Surface what is going wrong operationally across hiring and the roster.
category: operations
pages:
- control-center
- activity
status: active
version: 1
triggers:
- operational risk
- operations risk
- what is going wrong
- backlog
- decisions owed
owliver:
enabled: true
suggestions:
- label: What is going wrong operationally?
capability: list
- label: Summarize operational risk
capability: summary
capabilities:
- summary
- list
- table
- stats
- insight
responses:
summary:
title: Operational risk
source: operations.risk
list:
title: Operational risks
source: operations.risk
table:
title: Operational risks
source: operations.risk
stats:
title: Operational risk
source: operations.risk
insight:
title: Biggest operational risk
source: operations.risk
---
# Operational Risk
## Purpose
- Surface the operational problems that need somebody to act.
- Draw them from every domain, because they feel like one problem to the person
who has to fix them.
- Report nothing when the operation is running.
## Capabilities
- Detect strong candidates left awaiting a decision.
- Detect an unscreened application backlog.
- Detect open roles with no applicants.
- Detect shifts going unworked.
## Data
Reads `operations.risk`, which joins `JobApplication`, `JobPosting` and
`ShiftRecord`.
## Analysis
Four checks, each with a floor so ordinary operation does not trip them:
1. **Decisions owed** — a candidate scoring 70 or above, screened or
shortlisted, and not moved on. Any such candidate counts.
2. **Unscreened backlog** — three or more applications with no score.
3. **Roles with no applicants** — any open role nobody has applied to.
4. **Shifts unworked** — two or more absences or no-shows in the last 7 days.
Findings are ordered most severe first. A finding is included only when it
exists; an empty list means the operation is running, not that the check was
skipped.
## Output
A count of open risks, then a row per risk naming what is wrong and the figures
behind it.
## Limitations
- Thresholds are fixed rather than tuned to this workspace's volume.
- "Decisions owed" assumes a screened, strong candidate should be progressed.
A candidate deliberately held is indistinguishable from one overlooked.
- The shift check covers the last 7 days only; a longer pattern is Attendance
Analysis's question.

View File

@@ -0,0 +1,98 @@
---
id: overtime-analysis
name: Overtime Analysis
description: Analyse overtime hours, who is carrying them, and whether they are growing.
category: workforce
pages:
- analytics
- control-center
status: active
version: 1
triggers:
- overtime
- extra hours
- hours worked
- working late
owliver:
enabled: true
suggestions:
- label: How much overtime are we running?
capability: summary
- label: Who is working the most overtime?
capability: table
- label: Overtime over recent periods
capability: flow
capabilities:
- summary
- stats
- table
- progress
- flow
- insight
responses:
summary:
title: Overtime
source: workforce.overtime
stats:
title: Overtime
source: workforce.overtime
table:
title: Overtime by person
source: workforce.overtime
progress:
title: Overtime by person
source: workforce.overtime
flow:
title: Overtime over time
source: workforce.overtime
periods:
- last-7-days
- this-month
- previous-month
insight:
title: Overtime
source: workforce.overtime
---
# Overtime Analysis
## Purpose
- Report how much overtime the workforce is carrying.
- Say who is carrying it, since a total spread evenly and a total sitting on one
person are different problems.
- Show whether it is growing.
## Capabilities
- Summarize overtime hours and their share of scheduled time.
- Compare overtime per person, most hours first.
- Show overtime across recent periods.
## Data
Reads `workforce.overtime`, which compares scheduled hours to hours actually
worked across `ShiftRecord` entries.
## Analysis
Overtime is reported both as hours and as a share of scheduled time. The ratio
is what makes two teams comparable — forty hours means one thing across a
fortnight and another across a year.
Attendance and overtime are kept separate because one hides the other: a team
can have perfect attendance and be running on thirty hours of overtime a week,
and a single "workforce hours" figure would report that as healthy.
## Output
Total overtime hours, share of scheduled time, average per shift, and a row per
person. Over periods, hours per window.
## Limitations
- Overtime is derived from recorded shift end times, not from an approvals
process. A shift that ran long appears here whether or not it was authorised.
- A person with no overtime appears with zero, which is a real reading rather
than missing data.
- Cost is not calculated. No pay rate is attached to a shift record.

37
skills/server-training.md Normal file
View File

@@ -0,0 +1,37 @@
---
id: server-training
name: Server Training
description: Training path for server employees.
skill: server
pages:
- positions
- candidates
- profile
---
# Server Training
The path from a first shift on the floor to running a section in a fine dining
room. Each level is held only when every module on that rung has been completed
and Owliver has passed the evidence.
## Beginner
Complete the fundamentals of guest service.
## Intermediate
Complete advanced table service and order management.
## Advanced
Complete fine dining service and guest recovery.
## Expert
Lead a floor team through a full service without supervision.
## Verification
Owliver evaluates the employee's practical response against the criteria on each
module, and the level is awarded only on a pass.

99
skills/staffing-risk.md Normal file
View File

@@ -0,0 +1,99 @@
---
id: staffing-risk
name: Staffing Risk
description: Identify open roles that will not fill on their own, and say why.
category: workforce
pages:
- positions
- control-center
status: active
version: 1
triggers:
- staffing risk
- staffing gap
# `*` stands for anything in between, so one line covers "roles at risk",
# "roles that are at risk" and "roles most at risk" without listing each.
- roles*at risk
- positions*at risk
- understaffed
owliver:
enabled: true
suggestions:
- label: Which roles are at risk?
capability: list
- label: Summarize staffing risk
capability: summary
capabilities:
- summary
- list
- table
- insight
responses:
summary:
title: Staffing risk
source: positions.risk
list:
title: Roles at risk
source: positions.risk
limit: 5
table:
title: Roles at risk
source: positions.risk
insight:
title: Biggest staffing risk
source: positions.risk
---
# Staffing Risk
## Purpose
- Name the open roles that are not going to fill without intervention.
- Say which of four distinct problems each one has, because each has a
different fix.
- Rank them so the reader knows which to deal with first.
## Capabilities
- Count the open roles currently at risk.
- List those roles, worst first, with the reason for each.
- Identify the single role most in need of attention.
## Data
Reads `positions.risk`, which joins open `JobPosting` records to their
`JobApplication` records through the same `buildPosition` reading the Positions
page renders from. No separate calculation, so a risk reported here and a health
badge shown there cannot disagree.
## Analysis
A role is at risk when any of the following is true. They are kept apart rather
than combined into a score, because the score would hide the only part that
tells the reader what to do:
1. **No applicants yet** — nobody has applied. Needs sourcing.
2. **No candidate scoring 70 or above** — people applied, none are viable.
Needs the requirements or the pay revisiting.
3. **Three or more unscreened** — a backlog nobody has looked at. Needs
screening.
4. **Someone awaiting a decision** — a strong candidate has been screened and
not moved on. Needs a person to decide.
Ranking weights an empty pipeline above a busy one that needs attention, since
an empty pipeline takes longest to recover.
## Output
A count of roles at risk, then a row per role naming its department and its
reasons. A role with no problems is not listed.
## Limitations
- Only open roles are considered. A paused or closed role is not at risk.
- "Viable" means an AI score of 70 or above. An unscored candidate is not
counted as viable, so a role whose applicants nobody has screened will report
both an unscreened backlog and no viable candidate — those are two true
statements about the same cause.
- This reads the pipeline, not the roster. It does not know how many people a
role needs, because no position in this workspace states a headcount.

View File

@@ -0,0 +1,93 @@
---
id: talent-pool-analysis
name: Talent Pool Analysis
description: Analyse the talent already known to this workspace — who is in it, how they score, and who is available.
category: hiring
pages:
- talent-pool
status: active
version: 1
triggers:
- talent pool
- pool health
- available talent
- who is available
- supply of talent
owliver:
enabled: true
suggestions:
- label: How healthy is the talent pool?
capability: summary
- label: Who is in the pool?
capability: table
- label: Strongest people in the pool
capability: list
capabilities:
- summary
- stats
- table
- list
- progress
- insight
responses:
summary:
title: Talent pool
source: talent.pool
stats:
title: Talent pool
source: talent.pool
table:
title: Talent pool
source: talent.pool
list:
title: Strongest in the pool
source: talent.pool
limit: 5
progress:
title: Talent pool
source: talent.pool
insight:
title: Talent pool
source: talent.pool
---
# Talent Pool Analysis
## Purpose
- Report who this workspace already knows and could place.
- Say how much of the pool has been assessed, and how much has not.
- Report availability and certification coverage.
## Capabilities
- Summarize pool size, how many are scored, and average score.
- List or tabulate people by score.
- Report how many have availability on file and how many are certified.
## Data
Reads `talent.pool`, which counts `WorkerProfile` records — their `krow_score`,
`availability`, `certifications` and stated role.
## Analysis
The average score is computed across **scored profiles only**. Counting an
unassessed profile as zero would report a healthy pool as poor in exact
proportion to how much of it nobody has got to yet — a figure that gets worse
as the pool grows, which is the opposite of what it should do.
An unscored person is reported as "Not yet scored" rather than shown with a
zero, because a zero reads as a bad assessment rather than an absent one.
## Output
Pool size, how many are scored and how many are not, average score across the
scored, availability and certification counts, then people ranked by score.
## Limitations
- This is supply, not applicants. Someone in the pool has not applied to anything
by being here, and must not be described as a candidate for a role.
- Availability is what a person stated on their profile, not a live calendar.
- A profile with no score is unassessed, which is not the same as being weak.

View File

@@ -0,0 +1,88 @@
---
id: workforce-analytics
name: Workforce Analytics
description: Report workforce coverage — open roles and who has actually been hired into them.
category: analytics
pages:
- analytics
status: active
version: 1
triggers:
- workforce analytics
- workforce coverage
- roles covered
- coverage
owliver:
enabled: true
suggestions:
- label: How well are open roles covered?
capability: summary
- label: Coverage by role
capability: table
capabilities:
- summary
- stats
- table
- list
- progress
- insight
responses:
summary:
title: Workforce coverage
source: workforce.coverage
stats:
title: Workforce coverage
source: workforce.coverage
table:
title: Coverage by role
source: workforce.coverage
list:
title: Coverage by role
source: workforce.coverage
progress:
title: Coverage by role
source: workforce.coverage
insight:
title: Workforce coverage
source: workforce.coverage
---
# Workforce Analytics
## Purpose
- Report how many open roles have somebody hired into them.
- Name the roles that have nobody yet.
- State plainly where a role has not said how many people it needs.
## Capabilities
- Count open roles, those with someone hired, and those with nobody.
- Report coverage per role.
## Data
Reads `workforce.coverage`, which reads open `JobPosting` records through
`demandFor` — the same reading the Positions page uses — joined to `Staff` by
`job_posting_id`.
## Analysis
A role's coverage is the number of people hired into it against the number it
asked for. Where a role has not declared a headcount, this reports the hires and
says the target is unstated. It does **not** assume one person per role: that
would produce a confident fill percentage that means nothing, and nothing on
screen would say so.
## Output
Counts of open roles, covered roles and uncovered roles, how many roles state a
headcount, and a row per role.
## Limitations
- No position in this workspace currently states a headcount, so no fill
percentage is reported. The count of hires per role is real.
- Only open roles are counted. Paused and closed roles are excluded.
- Assignment records would refine this, but none exist yet; coverage is
therefore counted from hires.