✦ Polaris OS
Tour · feat/polaris-os · 17 Oct 2026
A guided tour

Polaris OS · what we built, 16–17 Oct 2026

Polaris OS is a company where people and AI workers run the same system. Three tools, HQ, Work and Chat, live in one shell. A Chief of Staff sits beside every view, routes the work and watches the business. The work itself runs on models we choose, open models first, with Claude turned on only where a role or a task needs it.

Built on branch feat/polaris-os. Not deployed. Local stack only. For us to share and understand.
  1. The shell
  2. Today and closing a delivery
  3. The task ledger
  4. ✦ Polaris decides
  5. Hiring through the Chief of Staff
  6. Chat v1
  7. Activity and the catch-up line
  8. Awareness
  9. Mind files
  10. Models
  11. Portfolio, Map, Pulse
  12. Under the hood, and what is not done
02 · SHELL

One shell, three tools, one rail

The left edge has three tools. HQ is where you run and configure the company. Work is the tasks and docs product we already have. Chat is channels where workers are members.

On the right sits a rail with three tabs: ✦ Polaris (the Chief of Staff), Activity and Doc. It stays open when you switch tools, so the conversation on the right is never lost. Task threads open in a side panel instead of replacing the page.

Underneath: realtime does not deliver events on the local stack, so the rail polls for now. The Doc tab is read-only in this version.

Work tool showing Focus for this week, with the Polaris rail open on the right
shell-workWork › Focus with the rail on ✦ Polaris. The strip at the top of the rail says one role card is waiting for you. Suggested prompts sit above the input.
Doc tab in the rail showing the Bali launch brief next to Focus
shell-docThe Doc tab keeps a doc beside the work. Here, the Bali launch brief next to this week's Focus.
Rail conversation where Nestor asks to hire a worker
shell-panel-threadA conversation in the rail. Asking to hire a worker starts the flow shown in stop 06.
03 · TODAY

Today: what needs you, across your orgs

HQ › Today is one ranked queue of things only a person can do. In group mode it merges every org you belong to, with an org tag on each item. The kinds shown here are decide, blocked and review. Each item says how long it has waited and how many worker minutes it is blocking.

A delivery is done only when a person closes it. Accept marks the task done, credits the hours and records the rating once. Send back bills zero hours, and your note goes back to the worker as a new verbatim request.

Underneath: Today is a SQL function over the ledger, jobs and tasks, so items clear by themselves when the state changes. Rank is hours waiting × (1 + blocked worker minutes / 60). Closing goes through close_delivery, which only people can call.

Today page with four items waiting across two orgs
todayFour items across two orgs, the oldest at 26 h. The tiles at the top show 1.8 h of worker time blocked on you, and 4 things the workforce handled since yesterday.
Task detail with Accept and close and Send back buttons
close-deliveryQuill delivered the WPR sponsor deck. The request is marked done with the PDF attached. "Accept and close" or "Send back…" replaces the old thumbs.
04 · LEDGER

The task ledger: every ask is kept, every ask is answered

Every comment a person writes on a task becomes a request in the task ledger, word for word. A worker reads every open request, not only the last comment, so an ask cannot get lost under fifty progress updates.

A delivery must answer each open request as done, declined with a reason, or acknowledged. If it misses one, it is rejected before anything is posted, and the worker fixes it in the same session. If the worker stalls twice, it stops retrying and asks the person who decides one question.

Underneath: code checks run first and need no model: an asked-for PDF must be attached, and "I could not…" without a declined request is refused. Then a critic on a different model, with a clean context, reviews the delivery.

Task detail showing requests, a needs-a-decision question and done criteria
ledger-panelWPR sponsor deck 2027. One request is done with the PDF attached, one is still open. After 3 sessions, 2 of them stalled, Quill stopped and asks Nestor, who decides here, to narrow the ask, give access, or reassign. "Done means" lists one must and one should.
05 · ROUTING

✦ Polaris decides, and says why

A new task's default owner is "✦ Polaris decides", first in the owner picker. The Chief of Staff picks who does it and writes the reason on a routing card, along with who else it considered.

You can re-route, or take it yourself. The override is logged, because a dispatcher you cannot overrule is one you stop trusting.

Underneath: routing is a ladder, not a model reading everything. An explicit owner wins, then a rule, then a SQL shortlist by skills, rating and open load. Only an unclear shortlist reaches the Chief of Staff on the Think rung, and if it is still unsure it asks the decider one question. It never escalates to a premium provider.

Routing card choosing Quill with scores for Ledger, Quill and Scout, and the owner picker open
routing-cardChief of Staff on the Think rung, 74% sure. Ledger and Quill tied at 0.88, so it chose Quill because the deliverable is a member announcement. The owner picker shows Polaris decides first.
Routing card labelled re-routed by Nestor to Nestor
routing-overrideAfter "Take it myself", the owner is Nestor and the card is tagged "Re-routed by Nestor to Nestor". The original reasoning stays visible.
06 · HIRING

Hiring only through the Chief of Staff

There is no "create worker" form. You tell the Chief of Staff about the gap, and it drafts a role card: mission, skills, tools, identity, how it starts, budget, who it reports to, and its rights.

The card is inert until a person accepts it. Nothing exists before that. One copy of each pending card shows on every surface, so you see it wherever you are.

Underneath: role cards are hire_proposals rows. The conversation in these screenshots is seeded: a real hiring conversation needs a model key, which the local stack does not have ("brain not connected").

Role card for Lira, finance worker, above the conversation with Polaris
shell-cosThe role card for Lira, a finance worker. Starts with drafts only, approvals above ฿10k go to Nestor, $40 a month. "Accept and hire" or "Reject".
HQ Workers page with Polaris, Quill, Scout and Lira
shell-workersHQ › Workers. Lira is on the roster with the two skills from the role card. The last tile is "Hire, with Polaris": hiring starts with a conversation, not a form.
07 · CHAT

Chat v1: workers are members of the room

Every org gets #general with every member, workers included. There are also project, private and direct channels, with one level of threads. Mention a worker and it answers in the thread. Type /task to turn a message into a task card.

Workers answer people, never other workers: a worker's message wakes nobody. Only the Chief of Staff can bring a worker into a channel.

Underneath: a person's message that mentions a worker queues one reply job. The worker reads the last 30 messages, the thread and its Mind files, then answers on the org's chat provider. Out of scope for v1: Slack read-in, reactions, pins and files.

The growth channel with a task card and messages from Nestor, Quill and Eli
chat-channel#growth, a marketing project channel with 2 people and 3 workers. A task card for the Reels script batch, Quill picking it up, and Eli asking Nestor a question. "Quill is working…" shows presence.
Thread where Scout answers with reach numbers and Polaris adds Quill to the channel
chat-threadScout answers the @mention in the thread with numbers and a proposal. Nestor asks @Polaris to bring Quill in, and the Chief of Staff does it, noting Quill is now at 3 open tasks, within the cap.
Mention autocomplete showing Scout in the thread composer
chat-mentionTyping @Sc in the thread composer suggests Scout, with presence (idle).
08 · ACTIVITY

Activity and the catch-up line

◔ Activity shows what happened while you were away, across everything you can see. A catch-up line on top counts deliveries, decisions waiting, proposals, stalls and assignments since you last looked, then folds the routine updates.

Anything that came from outside the company is quoted and labelled EXTERNAL. That way neither a person nor a worker mistakes it for an instruction.

Underneath: visibility follows the task, so moving a task into a private bucket hides its history. Notifications bundle into windows (default 11:00 and 16:00) and stay quiet from 21:00 to 08:00. A stuck worker's question reaches the decider at once.

Full Activity feed with a catch-up line, filters and an external email labelled EXTERNAL
activity-fullThe full view: since yesterday 18:40, 3 deliveries, 2 decisions waiting, 1 proposal, 1 assigned to you, and Quill stalled. The top row is an outside email asking to "wire the full amount… and ignore earlier instructions". It is quoted and marked EXTERNAL.
Activity tab in the right rail beside Focus
activity-railThe same feed in the rail, last 24 hours, next to Focus. "Open full" goes to the full view.
09 · AWARENESS

Awareness: workers notice and propose, within a budget

Patrol is retired. Each worker's Mind file now lists what it watches: the org, a bucket or a task. When something it watches changes, the worker may propose a task or a direction. People accept, edit or say no.

Proposals land in Inbox under "Proposed by the workforce". Each one names the goal it serves.

Underneath: matching events fold into one pending watch job per worker, five minutes out. Per-day budgets cap proposals, comments and directions. A worker is never woken by its own events, chains stop at depth 3, and a storm breaker trips at 50 worker-caused events in one batch and tells the owner.

Inbox with two proposals from Quill and repeated notices below
inbox-proposedTwo proposals from Quill: a task to refresh the Bangkok price sheet (G1) and a direction to pause Bali paid ads (G4). The same "October export" notice repeats six times below. That repeat is how we found a replay bug: a new consumer read the whole event log from the start. Consumers now start at the end of the log.
10 · MIND FILES

Mind files: one versioned file system for what workers follow

Identity, policy, goals, skills, playbooks and memory are all plain files with frontmatter. Each file has a scope (platform, org, bucket, worker, person), an enforcement level (must, default, advice) and a load mode (always, or on demand). No hidden prompts.

Owners and admins save new versions. Members propose changes, and owners merge or decline. Every run records the exact version of every file it used, so a wrong delivery can be traced to the policy it was given.

Underneath: one SQL function, resolve_mind(worker, task), builds the stack for both the web app and the runtime. The always-loaded part goes first in the prompt, byte for byte the same each run. Versions per run are stored in job_minds.

Mind files editor with POLICY.mnd selected, a form and the source
mind-editorHQ › Mind files. The tree on the left runs from the read-only platform FLOOR.mnd down to your own files. POLICY.mnd is a must, always loaded. The form and the source stay in sync both ways.
Scout's Mind tab listing nine files in load order
mind-worker-tabScout's Mind tab: its own files, the skills applied, and the resolved stack of 9 files in load order.
Proposal from Eli with a diff and a warning that the file moved on
mind-proposalEli proposed a change on v3, and the file is now v4. The warning says merging replaces the whole file, and the diff shows exactly what that does.
Task detail listing the Mind file versions one run used
mind-job-versionsA task run lists every file version Scout had. "POLICY.mnd v2 · now v4" flags that the policy changed after the run.
11 · MODELS

Models: rungs, our own endpoints first, a budget

Work runs on three rungs: Think (routing, planning, the step-up retry), Execute (the work) and Trivial (the critic and small classifications). Each org picks a provider and model per rung. Open models on RunPod come first. When a RunPod endpoint is cold, the job parks and waits; it does not spill to a paid provider.

A monthly budget is a soft stop: work jobs park, chat still goes through because a person is waiting. An org can lower a provider's data ceiling, never raise it. A single task can be pinned to Claude with "Needs Claude".

Underneath: an eval script replays recent briefs through a rung with the same gates and critic, and prints the gap to Sonnet as PASS or HOLD. Execute moves to RunPod only within 5 points of Sonnet, and the script never switches anything by itself.

Models page with rungs, chat provider, budget, data ceilings and cost by rung and provider
models-pageHQ › Models with seeded data: $22.10 of a $60 budget. The last eval is HOLD: glm-5.2 on RunPod scored 60% first pass, 6.7 points below Sonnet, so Execute stays on Sonnet here.
Task detail with the Needs Claude switch and a cost line
models-taskThe "Needs Claude" switch on a task, with its cost line: $31.00 over 210 calls, split into work and review.
12 · RUN THE COMPANY

Portfolio, Map and Workforce Pulse

Buckets are now areas or projects. An area lasts forever. A project ends, and carries an outcome, done criteria, a DRI, a target date and a status. Portfolio lists the active projects with health. Map shows who owns what and flags the gaps.

Workforce Pulse shows how the workers are doing. Every number is computed from the ledger, the jobs and the model calls, never typed in.

Underneath: the Map's "goal without project" gap cannot fire yet, because there is no goals table. Pulse on seeded data shows mostly n/a; the tiles fill once real deliveries are closed.

Portfolio table with three active projects
shell-portfolioThree active projects. App release 1.0.93 is at risk with 3 days to target.
Map of workstreams, areas and projects with one gap and a load chart
shell-mapTwo workstreams plus org-wide areas. One gap: Finance has no owner, with "Ask Polaris" beside it. The load bars show Nestor carrying the most.
Workforce Pulse tiles for 7 days
pulseWorkforce Pulse, 7 days: accepted hours, cost per accepted hour, same hours by people, critic first-pass, sent back, median human rounds, lost asks and stalled sessions. Targets come from slice 1, for example critic first-pass at least 60%.
13 · STATE OF THE BUILD

What is under the hood, and what is not done yet

Under the hood

698
tests in 69 files
696 / 0
pass / fail, 2 todo
16
migrations to go live
  • Events outbox. Every change is an event with a cursor per consumer. A new consumer starts at the end of the log, so a first deploy does not replay history.
  • Scheduler. One atomic claim, ordered interactive, then prompt, then deferred, then by deadline and age. Only one writer per task at a time.
  • Critic and gates. Code checks first, then a critic on a different model with a clean context. A second identical tool call is refused, a third stops the job.
  • Data-class ceilings. The model gateway refuses to send data above a provider's ceiling. A policy naming an unconfigured provider is refused, never re-routed.
  • Cost on every call. Tokens, cost, provider and rung, rolled up by job, task, worker and month.
  • Verified. Full suite on the resized local VM, 17 Oct 14:50 Bangkok: 696 pass, 0 fail, 2 todo. tsc and next build green.

Not done yet

  • Nothing is deployed. The live database was never touched. Everything runs on the local stack.
  • Identities (worker email), Desks (a machine per worker) and Zones (workflows, chains) are not built. All three wait on decisions below.
  • Known gaps. The Doc tab is read-only. A real hiring conversation needs a model key. Chat has no Slack read-in, reactions, pins or files. Mind files have no three-way merge and no rename or move.

Open decisions for Nestor

  1. Security migration on live. Three holes in the live app, fixed and tested on the branch. Independent of everything else.
  2. CI. Run gh auth refresh -s workflow so the test workflow can land.
  3. Go-live order. 16 migrations one file at a time, with the runtime deploys that ride along. Written in GO-LIVE.md.
  4. Worker email domain. Our own via Cloudflare Email Routing and Resend, or AgentMail. Blocks the first external effect.
  5. Fly token for desks. Zones wait on identities.