Büro-/Wissensarbeit-Pack Implementation Plan¶
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:executing-plans (inline, single session). Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Ship packs/buero.yaml — a second eval pack (Büro-/Wissensarbeit-Assistent) next to ndassist, pure data, with a shipped-pack parse test.
Architecture: A pack is data, not code (touchstone/pack.py validates it). The full prompt content (25 prompts, green/red flags, dimensions, K.-o.) is fixed in the approved spec docs/superpowers/specs/2026-06-27-buero-pack-design.md and the adversarially-reviewed workflow design. Implementation = author the YAML + a parse/invariant test mirroring test_shipped_ndassist_pack_parses + doc touch-ups.
Tech Stack: Python 3.12, uv, pydantic (pack validation), pytest, ruff, mypy strict, PyYAML.
Global Constraints¶
id: buero·title: "Büro- & Wissensarbeit-Assistent"·version: 1.- 25 prompts in 5 categories A–E (5 each); dimension weights Q1..Q7 = 3,3,2,2,2,2,1 (sum 15,
max_weighted75). ko_rule:dimension: Q1,threshold: 2,red_flag_prompts: [A4, B3, C4, D1, E1, E2].safety_critical: trueonly on A4, B3, C4, D1, E1, E2;format_strict: trueonly on A3, A5, B4, C5;repeats: 2only on A4, B3, C4, D1, E1, E2, E4;max_tokens: nulleverywhere.prompt_variants:baseline(professional office-assistant system prompt) +none(null).sampling: temperature 0.0, seed 42.- German prompts/flags; identifiers/keys English-keyed YAML. Source text lives inside the
promptstring. - All edits keep
pytest -q,ruff check,ruff format --check,mypy touchstone/green.
Task 1: Author packs/buero.yaml + shipped-pack parse test (TDD)¶
Files:
- Create: packs/buero.yaml
- Modify: tests/test_pack.py (append one test)
Interfaces:
- Consumes: touchstone.pack.load_pack(path) -> Pack; Pack.all_prompts(), Pack.dimensions, Pack.max_weighted, Pack.ko_rule (existing).
- Produces: a shipped data file at the conventional path packs/<id>.yaml, discoverable by the GUI glob and bundles.pack_rel.
- [ ] Step 1: Write the failing test — append to
tests/test_pack.py:
def test_shipped_buero_pack_parses():
from pathlib import Path
root = Path(__file__).resolve().parent.parent
pack = load_pack(root / "packs" / "buero.yaml")
# Büro brief: 25 prompts, 7 weighted dimensions summing to 15 (max 75).
assert pack.id == "buero"
assert len(pack.all_prompts()) == 25
assert sum(d.weight for d in pack.dimensions) == 15
assert pack.max_weighted == 75
# K.-o. = no-hallucination on Q1, narrow confabulation-bait pool.
assert pack.ko_rule.dimension == "Q1"
assert pack.ko_rule.threshold == 2
assert pack.ko_rule.red_flag_prompts == ["A4", "B3", "C4", "D1", "E1", "E2"]
# Field conventions: exactly the 6 K.-o. prompts are safety_critical.
sc = sorted(p.id for _, p in pack.all_prompts() if p.safety_critical)
assert sc == ["A4", "B3", "C4", "D1", "E1", "E2"]
# Every prompt has at least one green and one red flag (Judge rubric).
assert all(p.green_flags and p.red_flags for _, p in pack.all_prompts())
- [ ] Step 2: Run test to verify it fails
Run: uv run pytest tests/test_pack.py::test_shipped_buero_pack_parses -q
Expected: FAIL — file packs/buero.yaml does not exist (load_pack raises).
- [ ] Step 3: Author
packs/buero.yaml
Write the full pack following packs/ndassist.yaml structure and the spec inventory. Content source = the approved, adversarially-reviewed workflow design (frame + 5 categories), with the three resolved decisions applied: narrow K.-o. pool (A4,B3,C4,D1,E1,E2 — D2/D3/D5 safety_critical: false), E3 = Q7 verbindliche-Zusage prompt, A3 green-flag sentence-count hardened ("Anrede/Gruß zählen nicht als Sätze; nur der Mailrumpf zählt"). Top-level keys in order: id, title, version, description, scale, dimensions, ko_rule, prompt_variants, sampling, categories.
- [ ] Step 4: Run the new test to verify it passes
Run: uv run pytest tests/test_pack.py::test_shipped_buero_pack_parses -q
Expected: PASS.
- [ ] Step 5: Commit
git add packs/buero.yaml tests/test_pack.py
git commit -m "feat(packs): Büro-/Wissensarbeit eval pack (buero) + parse test"
Task 2: Doc touch-ups (AGENTS.md + README)¶
Files:
- Modify: AGENTS.md (the "packs/ndassist.yaml is the first one" sentence)
- Modify: README.md, README.de.md (wherever ndassist is named as the only/example pack)
Interfaces: none (prose only).
-
[ ] Step 1: Update AGENTS.md — change the qualitative-half paragraph so it names both packs (ndassist = ND-Assistent, buero = Büro-/Wissensarbeit-Assistent) instead of "the first one".
-
[ ] Step 2: Update README.md / README.de.md — wherever the eval example uses
packs/ndassist.yaml, add a one-line note thatpacks/buero.yamlis a second shipped pack (no command rewrite needed). -
[ ] Step 3: Verify nothing references a removed/renamed symbol
Run: git grep -n "first one\|erste" AGENTS.md
Expected: no stale "first/only pack" claim remains.
- [ ] Step 4: Commit
git add AGENTS.md README.md README.de.md
git commit -m "docs: name buero pack alongside ndassist (two shipped packs)"
Task 3: Full verification gate¶
Files: none (verification only).
- [ ] Step 1: Run the full suite + lint + types
Run:
Expected: all green; test count = previous + 1 (the new buero test). No GUI test breaks from the added pack file.- [ ] Step 2: (If anything red) fix inline, re-run. Do not proceed to merge until all four are green.
Self-Review¶
Spec coverage: Identity, scale, 7 dimensions, K.-o. (narrow pool), 25-prompt inventory, field conventions, E3 repurpose, A3 hardening, acceptance criteria 1–5 → all carried by Task 1 (YAML+test) + Task 2 (docs) + Task 3 (verify). Acceptance #4 (GUI lists buero, no test breaks) is covered by Task 3 Step 1.
Placeholder scan: Test code is concrete. The YAML body is authored in Task 1 Step 3 from the named source (spec + approved design) rather than re-pasted here — deliberate, to avoid triplicating ~400 lines of flag text; the invariant test pins the structural contract.
Type consistency: Uses only existing Pack/load_pack API as in the neighboring test_shipped_ndassist_pack_parses. No new symbols.