Workers P2: Roster-Spiegel und gemeinsame Fixture
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7b1342fbb1
commit
92ee4bfbad
3 files changed
+165
No files matched your search
Vendored
+24
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"floors": ["bruecke","anfragen","ohne_website","bewertung","gespraeche","werkstatt","pruefung","freigabe","tresor","keller"],
|
||||
"roles": [
|
||||
{"workerId":"otto","name":"Otto","floor":"bruecke","room":"bruecke","model":"opus","role":"plant die Nacht, verteilt Aufträge, Budget, Morgenbericht","caps":["plan","report"]},
|
||||
{"workerId":"rita","name":"Rita","floor":"anfragen","room":"netz","model":"haiku","role":"sucht frische „Suche Webdesigner“-Posts über Websuche","caps":["web_search","web_fetch"]},
|
||||
{"workerId":"kim","name":"Kim","floor":"anfragen","room":"kleinanzeigen","model":"haiku","role":"liest Kleinanzeigen-Suchauftrags-Mails im Alarm-Postfach","caps":["alert_inbox"]},
|
||||
{"workerId":"pia","name":"Pia","floor":"anfragen","room":"portale","model":"haiku","role":"liest Projekt-Alerts/RSS der Portale","caps":["alert_inbox","rss"]},
|
||||
{"workerId":"finn","name":"Finn","floor":"anfragen","room":"foren","model":"haiku","role":"sucht in Foren/Frage-Seiten (nur erlaubte)","caps":["web_search","web_fetch"]},
|
||||
{"workerId":"ali","name":"Ali","floor":"ohne_website","room":"aerzte","model":"haiku","role":"Branchen-Scout Ärzte & Praxen","caps":["web_search","web_fetch","places","osm"]},
|
||||
{"workerId":"hanna","name":"Hanna","floor":"ohne_website","room":"handwerk","model":"haiku","role":"Branchen-Scout Handwerk","caps":["web_search","web_fetch","places","osm"]},
|
||||
{"workerId":"sven","name":"Sven","floor":"ohne_website","room":"selbst","model":"haiku","role":"Branchen-Scout Selbstständige","caps":["web_search","web_fetch","places","osm"]},
|
||||
{"workerId":"lea","name":"Lea","floor":"ohne_website","room":"laden","model":"haiku","role":"Branchen-Scout Läden & Gastro","caps":["web_search","web_fetch","places","osm"]},
|
||||
{"workerId":"bea","name":"Bea","floor":"bewertung","room":"waage","model":"sonnet","role":"bewertet, verteilt Top 3 / Rest","caps":["score"]},
|
||||
{"workerId":"max","name":"Max","floor":"gespraeche","room":"mail","model":"sonnet","role":"schreibt Mails und ist einziger Absender","caps":["draft","send_mail"]},
|
||||
{"workerId":"clara","name":"Clara","floor":"gespraeche","room":"forum","model":"sonnet","role":"schreibt Antworten auf Anfragen","caps":["draft","pult"]},
|
||||
{"workerId":"nora","name":"Nora","floor":"gespraeche","room":"posteingang","model":"haiku","role":"liest + sortiert Eingänge","caps":["read_inbox","classify"]},
|
||||
{"workerId":"theo","name":"Theo","floor":"gespraeche","room":"abschluss","model":"sonnet","role":"Nachrichten rund um den Kauf (Entwürfe)","caps":["draft","pult","offer"]},
|
||||
{"workerId":"bob","name":"Bob","floor":"werkstatt","room":"tisch1","model":"opus","role":"baut Vorschauen (nur nach Ja)","caps":["build"]},
|
||||
{"workerId":"bianca","name":"Bianca","floor":"werkstatt","room":"tisch2","model":"opus","role":"baut Vorschauen","caps":["build"]},
|
||||
{"workerId":"ben","name":"Ben","floor":"werkstatt","room":"tisch3","model":"opus","role":"baut Vorschauen","caps":["build"]},
|
||||
{"workerId":"paul","name":"Paul","floor":"pruefung","room":"pruefung","model":"sonnet","role":"prüft Vorschauen (Screenshots)","caps":["review","screenshot"]},
|
||||
{"workerId":"arne","name":"Arne","floor":"keller","room":"archiv","model":"haiku","role":"Nie-doppelt-Register + Bot-Lead-Liste","caps":["register","archive"]}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { loadModule } from './load.mjs'
|
||||
const { ROLES, FLOORS, SEARCH_ROOMS, FLOOR_TITLES, ROOM_TITLES, MODEL_IDS, hatForModel, hatForWorker, roleOf } = await loadModule('src/lib/workersRoster.js')
|
||||
const fixture = JSON.parse(readFileSync(new URL('../fixtures/workers-roster.json', import.meta.url), 'utf8'))
|
||||
|
||||
test('Spiegel ist gleich der gemeinsamen Fixture', () => {
|
||||
assert.deepEqual([...FLOORS], fixture.floors)
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(ROLES)), fixture.roles)
|
||||
})
|
||||
test('19 Worker, workerId und Raum einmalig, Etagen und Titel vollständig', () => {
|
||||
assert.equal(ROLES.length, 19)
|
||||
assert.equal(new Set(ROLES.map((r) => r.workerId)).size, 19)
|
||||
assert.equal(new Set(ROLES.map((r) => r.room)).size, 19)
|
||||
for (const r of ROLES) assert.ok(FLOORS.includes(r.floor), r.workerId)
|
||||
assert.equal(FLOORS.length, 10)
|
||||
assert.deepEqual(Object.keys(FLOOR_TITLES).sort(), [...FLOORS].sort())
|
||||
assert.deepEqual(Object.keys(ROOM_TITLES).sort(), [...ROLES.map((r) => r.room), 'pult', 'tresor'].sort())
|
||||
})
|
||||
test('Hut zeigt das Modell, Otto trägt die Kommandomütze', () => {
|
||||
assert.deepEqual(['opus', 'claude-sonnet-5-5', 'claude-haiku-5-5', 'claude-xyz', undefined].map(hatForModel), ['opus', 'sonnet', 'haiku', 'haiku', 'haiku'])
|
||||
assert.deepEqual(['otto', 'bob', 'bea', 'kim', 'zed'].map(hatForWorker), ['overseer', 'opus', 'sonnet', 'haiku', 'haiku'])
|
||||
assert.equal(roleOf('paul').room, 'pruefung')
|
||||
assert.equal(roleOf('zed'), null)
|
||||
assert.equal(roleOf('constructor'), null)
|
||||
assert.equal(hatForWorker('__proto__'), 'haiku')
|
||||
assert.deepEqual(MODEL_IDS, { opus: 'claude-opus-5-5', sonnet: 'claude-sonnet-5-5', haiku: 'claude-haiku-5-5' })
|
||||
})
|
||||
test('SEARCH_ROOMS: festgenagelt wie im Dienst (P1-T05) und aus der Fixture ableitbar; nur diese Worker können grau sein (P1-E9)', () => {
|
||||
assert.deepEqual([...SEARCH_ROOMS], ['netz', 'kleinanzeigen', 'portale', 'foren', 'aerzte', 'handwerk', 'selbst', 'laden'])
|
||||
assert.deepEqual([...SEARCH_ROOMS], fixture.roles.filter((r) => ['anfragen', 'ohne_website'].includes(r.floor)).map((r) => r.room))
|
||||
assert.deepEqual(ROLES.filter((r) => SEARCH_ROOMS.includes(r.room)).map((r) => r.workerId), ['rita', 'kim', 'pia', 'finn', 'ali', 'hanna', 'sven', 'lea'])
|
||||
assert.equal(ROLES.filter((r) => !SEARCH_ROOMS.includes(r.room)).length, 11)
|
||||
})
|
||||
Reference in new issue
Block a user