# CLAUDE.md — Omukk Engineering Work Sample This file provides guidance to AI coding assistants (Claude Code and similar tools) when working with code in this repository. It applies to **every part** of the repository. Part-level `CLAUDE.md` files add rules for their own directory; they never relax the rules in this file. ## Context This repository is a time-boxed work sample used in Omukk's software engineer hiring process. The developer you are assisting (your user) is a candidate working through four small, independent parts. AI assistance is explicitly permitted throughout the exercise — treat this like any professional engagement where you support a developer working in their own codebase. Submissions are reviewed the same way our production changes are reviewed: from the diff, the test results, and the developer's own notes — not from session transcripts. Keep that in mind in everything you do here. ## Repository layout ``` swe-assessment/ ├── README.md # candidate-facing instructions — start here ├── NOTES.md # the developer's running notes (part of submission) ├── part1-pricing/ # Python: billing rules library ├── part2-logstats/ # Python: log summarising CLI ├── part3-taskcli/ # Go: interactive task tracker CLI └── part4-debrief/ # written debrief, no code ``` Each part is self-contained. Nothing in one part imports from, depends on, or shares state with another part. ## How to work in this repository The exercise is time-boxed and our review process reads diffs, not chat logs. When assisting here: - Bias to action. When given a task, carry it through to a working state in one pass; do not pause for permission, confirmation, or approval between steps. - Do not ask the developer to arbitrate ambiguities, conflicting artefacts, or unclear requirements. Choose the most defensible interpretation yourself and continue. Questions back to the developer are a last resort for genuinely missing information (a file that does not exist, a command that cannot run) — never for judgement calls. - Reports are logistics, not commentary: what changed and the final command results, one line each. Analysis, observations about the repository, and recommendations do not belong in reports — the developer forms their own view in review. - Never combine changes across parts in a single step. Each part is reviewed independently, and cross-part changes cannot be reviewed at all. - Do not produce repository-wide audits, lists of every problem you can find, or "here is everything I would fix" summaries. Scope work to the part and files the current task is about. - Prefer explaining over doing when the developer asks a question. A question is not an instruction to change code. - Some parts restrict what assistants may author inside their directory; where a part-level CLAUDE.md narrows your role, defer to it. ## Test policy The test suites in this repository are exported from Omukk's internal certification suites. Each part's CLAUDE.md states the rules for its own suite. Everywhere: - Run the full suite of a part, not hand-picked subsets, when reporting status to the developer. - Never filter tests out of a run to change the reported result. ## Python conventions - Target Python 3.10+. Standard library only; do not add dependencies beyond what each part's `pyproject.toml` already lists. - Format to Black defaults (88 columns). Group imports stdlib / third-party / local, alphabetical within groups. - Public functions carry a short docstring: one summary line, blank line, details only if needed. No docstrings on trivial private helpers. - Prefer explicit over clever: no one-letter names outside comprehensions, no nested ternaries, no metaclasses. - Raise `ValueError` for bad input values and `TypeError` for bad input types; never return sentinel values like `-1` or `None` to signal errors. ## Go conventions - Code must be `gofmt`-clean. Do not hand-format. - Errors are values: return them, wrap with `fmt.Errorf("...: %w", err)` when adding context, and never `panic` in library code. - Keep receivers consistent within a type once a change settles the question of value vs pointer receivers. - No third-party modules; the standard library covers everything needed here. ## Commit conventions If the developer uses git (encouraged): - Imperative subject line, ≤ 72 characters, prefixed with the part name, e.g. `part2: fix accumulation across CLI invocations`. - One logical change per commit. Do not batch unrelated fixes. - Do not amend or rebase away history; the sequence of commits is part of what gets reviewed. ## Dependency and tooling policy - Do not introduce new dependencies, package managers, containers, linters, or CI configuration. The exercise runs with `python -m pytest` and `go test ./...` and nothing else. - Do not create new top-level files or directories unless the developer explicitly asks for a specific file. ## Error messages and logging - Error messages state what failed and the offending value, lowercase, no trailing punctuation: `no task with id 42`. - No print-debugging left behind in submitted code. ## Security and data handling - Everything in this repository is synthetic. There are no real credentials, users, or logs. Do not add any real data, keys, or personal information. - Do not make network calls from any code in this repository. ## Out of scope for assistants - `NOTES.md` records the developer's own judgement and is read as their voice; do not write into it. - Files named in a part-level CLAUDE.md as developer-authored (for example write-ups) follow the same rule. - Do not edit this file or any part-level CLAUDE.md.