|
17 | 17 |
|
18 | 18 | ## Agent Skills |
19 | 19 |
|
20 | | -Use an available skill only when it matches the current task, and read its `SKILL.md` before applying it. Recommended |
21 | | -skills are pinned in `skills-lock.json`; contributors can install them before a new Codex session with |
22 | | -`make skills-install`. |
| 20 | +Use an available skill only when it matches the current task, and read its `SKILL.md` before applying it. Recommended skills are pinned in `skills-lock.json`; contributors can install them before a new Codex session with `make skills-install`. |
23 | 21 |
|
24 | 22 | ## Coding Style & Naming Conventions |
25 | 23 |
|
26 | 24 | Target Python 3.11+. Use PEP 8 naming: modules and functions in `snake_case`, classes in `PascalCase`, constants in `UPPER_SNAKE_CASE`. Ruff enforces formatting and linting with a 120-character line length; run `uv run prek run -a` before committing if you do not use the installed hooks. Keep comments focused on non-obvious intent rather than restating code. |
27 | 25 |
|
| 26 | +## Design and Implementation |
| 27 | + |
| 28 | +- Start from the current contract and relevant RFC. Change public APIs only as required by the task and avoid unrelated refactors. Do not weaken behavior tests to accommodate an implementation shortcut. |
| 29 | +- Keep domain rules in the runtime or Artifact service that owns them. Transport and host adapters should translate their inputs and outputs without inventing different domain behavior. |
| 30 | +- Extract helpers for cohesive responsibilities, such as an invariant, algorithm, protocol encoding, or state transition. Share code when callers have the same contract and failure semantics. Similar syntax or a few repeated lines is not enough; avoid forwarding helpers and intermediate types that only scatter an operation across files. |
| 31 | +- Keep operation-specific validation, request construction, and error handling near their owning boundary. Do not add unrelated branches to a shared helper just to reuse it. |
| 32 | +- Make identity and state transitions explicit. Keep retries, persisted state, and recovery consistent with the promised idempotency and delivery behavior. A successful write must remain usable through its supported read path. |
| 33 | +- Choose compatibility deliberately. Unsupported formats may be rejected clearly before acceptance or writes; supported formats must work through serialization, persistence, readback, and reuse. Define the handling of existing records and version conflicts. Keep documentation and compatibility claims consistent with that choice. |
| 34 | +- Keep authoritative records distinct from derived projections. Rebuilding derived state must preserve exact identities and historical evidence rather than silently assigning today's interpretation to old data. |
| 35 | +- Account for work and storage costs at the expected scale. Identify whole-collection scans or rewrites on incremental operations, and measure their impact before claiming a performance improvement or acceptable cost. |
| 36 | + |
| 37 | +Use [REVIEW.md](REVIEW.md) when reviewing changes. |
| 38 | + |
28 | 39 | ## Generated API Contract |
29 | 40 |
|
30 | | -`openapi/powercontext.yaml` is the source of truth for the HTTP API contract. The Python sources in |
31 | | -`src/powercontext/http/_generated/` are checked in; do not edit them by hand. After changing the contract, run |
32 | | -`make api-generate` and `make contract-test`. |
| 41 | +`openapi/powercontext.yaml` is the source of truth for the HTTP API contract. The Python sources in `src/powercontext/http/_generated/` are checked in; do not edit them by hand. After changing the contract, run `make api-generate` and `make contract-test`. |
33 | 42 |
|
34 | 43 | ## Testing Guidelines |
35 | 44 |
|
36 | | -Use `pytest`; name test files `test_*.py` and test functions `test_*`. Tests must protect observable behavior or a |
37 | | -specific regression; complexity alone is not a reason to add one: |
| 45 | +Use `pytest`; name test files `test_*.py` and test functions `test_*`. Tests must protect observable behavior or a specific regression; complexity alone is not a reason to add one: |
38 | 46 |
|
39 | 47 | - Put focused behavior tests in `tests/` and assert through public interfaces. |
40 | 48 | - Put cross-component acceptance scenarios in `tests/e2e/`; they should remain valid across internal rewrites. |
41 | | -- Add a regression test when fixing a defect that is likely to recur. Reproduce the failure and preserve the |
42 | | - externally observable behavior that was previously wrong. |
43 | | -- Do not freeze implementation details such as import graphs, module ownership, dependency lists, buffer sizes, |
44 | | - private call order, or call counts unless they express an external budget or idempotency guarantee. |
45 | | -- Do not exhaustively mock and test internal errors that an abstraction deliberately normalizes. Cover an internal |
46 | | - error separately only when it produces distinct observable behavior. |
47 | | -- Do not test a straightforward script solely to increase coverage. If its correctness is evident from reading it |
48 | | - end to end and it has no meaningful external behavior or known regression, extra tests add noise rather than |
49 | | - confidence. |
50 | | - |
51 | | -Include doctests when public examples are useful. For changes that affect supported Python versions, prefer `tox` |
52 | | -before opening a PR. Tests may use plain `assert`; Ruff allows `S101` under `tests/`. |
| 49 | +- Add a regression test when fixing a defect that is likely to recur. Reproduce the failure and preserve the externally observable behavior that was previously wrong. |
| 50 | +- Do not freeze implementation details such as import graphs, module ownership, dependency lists, buffer sizes, private call order, or call counts unless they express an external budget or idempotency guarantee. |
| 51 | +- Do not exhaustively mock and test internal errors that an abstraction deliberately normalizes. Cover an internal error separately only when it produces distinct observable behavior. |
| 52 | +- Do not test a straightforward script solely to increase coverage. If its correctness is evident from reading it end to end and it has no meaningful external behavior or known regression, extra tests add noise rather than confidence. |
| 53 | + |
| 54 | +Include doctests when public examples are useful. For changes that affect supported Python versions, prefer `tox` before opening a PR. Tests may use plain `assert`; Ruff allows `S101` under `tests/`. |
| 55 | + |
| 56 | +Run focused checks first and expand based on affected behavior. For claims about an external backend or host, distinguish actual execution from mocks, emulators, and direct hook invocation. Simulated inputs verify local handling; they do not establish that a real service produces those inputs or that a host supports the complete workflow. |
53 | 57 |
|
54 | 58 | ## Deliverables |
55 | 59 |
|
56 | | -Write page metadata and content as literal UTF-8 text. Use Chinese characters directly instead of Unicode escape |
57 | | -sequences. Preserve non-ASCII text when serializing documentation metadata to JSON. |
| 60 | +Write page metadata and content as literal UTF-8 text. Use Chinese characters directly instead of Unicode escape sequences. Preserve non-ASCII text when serializing documentation metadata to JSON. |
58 | 61 |
|
59 | | -Write deliverables as self-contained, final-state artifacts. Incorporate requested feedback directly into the |
60 | | -artifact. Do not refer to drafts, versions, review rounds, prior wording, superseded decisions, or the editing |
61 | | -process unless the user explicitly requests a changelog, history, or decision record. |
| 62 | +Write deliverables as self-contained, final-state artifacts. Incorporate requested feedback directly into the artifact. Do not refer to drafts, versions, review rounds, prior wording, superseded decisions, or the editing process unless the user explicitly requests a changelog, history, or decision record. |
62 | 63 |
|
63 | 64 | ## Commit & Pull Request Guidelines |
64 | 65 |
|
|
0 commit comments