8a812a174b
Three defects let a lane's pipeline map claim progress that was not this
pass's work, all of them on the "going back" path a new request takes:
- `setStage` cleared the detection columns on a real transition but never
pruned the `stages` records AHEAD of the new stage. A lane that ran through
`done` and was then declared back at `plan` rendered `plan` as `current`
while `tests`/`review`/`done` still read `done`, carrying the previous
pass's evidence, and contradicting `progress` (computed from the declared
index alone). A backwards declaration now drops every record it can prove
is ahead; a key matching no node is unplaceable and left alone.
- `activateFeature` rewrote the live lane row for the incoming feature but
carried the outgoing one's `detected_*` across. A never-seen slug starts at
`stage='idle'`/`stages={}`, exactly the shape `inferredDisplayStage` renders
from detection, so the new feature opened painted with the old one's
progress — and forward-only rejected every real detection for it until the
carried-over one aged past DETECTION_TTL_MS. Now cleared, like every other
real transition; deliberately not archived, since detection is live-only.
- `codex-ingest` classified a rollout journal by raw `now - mtime`, which goes
negative for a future mtime (clock stepped back, NTP correction, a restore
that preserved timestamps) and read as "written milliseconds ago". A
finished thread's journal could replay as live work; a file claiming to be
from the future is now idle.
Also fixes `check-headers.sh`, which audited via `find` and so reported local
gitignored runtime state (a lane's own `.ccam/profile/hooks/*.sh`) that is not
this repo's source and can never be made compliant here. It now lists files
through git (tracked + untracked-but-not-ignored), so a file an agent just
wrote is still caught before it is staged while ignored state is not.
Tests: 1359 pass (4 new). Header audit exits 0.
123 lines
4.7 KiB
Markdown
123 lines
4.7 KiB
Markdown
---
|
|
name: file-headers
|
|
description: MANDATORY for every coding agent (Claude Code, Codex, or any other) on every change-set — every applicable source file the agent creates or updates MUST start with the project's copyright/authorship header (file overview + exact author line). Use automatically whenever writing a new file or editing an existing one; do not wait to be asked. Covers JS/TS/TSX/CJS/MJS, Python, shell, and CSS. Includes the audit script to verify repo-wide compliance.
|
|
---
|
|
|
|
# File Headers — Copyright Comment + File Overview
|
|
|
|
Every applicable source file in this repository starts with a header comment
|
|
containing a **file overview** and the **exact author line**:
|
|
|
|
```
|
|
@author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
```
|
|
|
|
The name and email must be exactly as above — no variations, no substitutions,
|
|
no other names. This applies to **every coding agent** working in this repo
|
|
(Claude Code, Codex, or any other tool): when you **create** a new applicable
|
|
file, write the header first; when you **update** an existing applicable file
|
|
that is missing the header, add it as part of the same change.
|
|
|
|
## Applicable files
|
|
|
|
| Included | Excluded |
|
|
| -------- | -------- |
|
|
| `*.js`, `*.ts`, `*.tsx`, `*.cjs`, `*.mjs` | anything under `node_modules/`, `dist/`, `build/`, `data/` |
|
|
| `*.py`, `*.sh` | vendored/minified files (`*.min.js`) |
|
|
| `*.css` | generated files (they carry their own AUTO-GENERATED banner), including the committed `mcp/build/` |
|
|
| | snapshots (`__snapshots__/`), lockfiles, JSON/YAML/Markdown |
|
|
| | anything **gitignored** — local runtime state that happens to live in the checkout (a lane's own `.ccam/profile/hooks/*.sh`, a scratch venv) is not this repo's source and can never be made compliant here |
|
|
|
|
## Header formats by file type
|
|
|
|
**JS / TS / TSX — server & scripts style** (overview inline in `@file`):
|
|
|
|
```js
|
|
/**
|
|
* @file One-to-few-sentence overview of what this file does and why it
|
|
* exists. Mention the key contracts or invariants the file owns.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
```
|
|
|
|
**JS / TS / TSX — client style** (`@file` name + `@description` overview), used
|
|
under `client/src/`:
|
|
|
|
```ts
|
|
/**
|
|
* @file ComponentName.tsx
|
|
* @description What the component/module renders or provides and how it fits
|
|
* into the app.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
```
|
|
|
|
**CSS** (same block-comment shape as `client/src/index.css`):
|
|
|
|
```css
|
|
/**
|
|
* @file file.css
|
|
* @description What these styles cover.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
```
|
|
|
|
**Shell** (`#` block right after the shebang; existing overview comments count —
|
|
just make sure the `@author` line is in the block):
|
|
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
# script-name.sh — what the script does, one to few lines.
|
|
# @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
```
|
|
|
|
**Python** (inside the module docstring):
|
|
|
|
```python
|
|
"""
|
|
module.py — what the module does.
|
|
|
|
@author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
"""
|
|
```
|
|
|
|
## Rules
|
|
|
|
1. **New file → header first.** Any applicable file you create starts with the
|
|
header before any code (after the shebang for scripts).
|
|
2. **Touched file missing header → add it.** If you edit a file that lacks the
|
|
header, add one in the same commit. Write a real overview — describe what
|
|
the file actually does; never a placeholder like "TODO" or "utility file".
|
|
3. **Exact author line.** `@author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>` —
|
|
byte-exact, in every file type (shell and Python use it inside `#` / docstring
|
|
comments).
|
|
4. **Don't churn existing headers.** If a file already has a compliant header,
|
|
leave it alone unless the file's purpose changed (then update the overview).
|
|
5. **Overviews must stay truthful.** When an edit changes what a file does,
|
|
update its `@file`/`@description` overview in the same change.
|
|
|
|
## Audit
|
|
|
|
Run the bundled checker to list any applicable file missing the header:
|
|
|
|
```bash
|
|
bash skills/file-headers/scripts/check-headers.sh
|
|
```
|
|
|
|
Exit code `0` = fully compliant; `1` = the printed files are missing headers.
|
|
Run it before finishing any change-set that adds files, and during reviews.
|
|
|
|
It audits the files **git can see** — tracked plus untracked-but-not-ignored —
|
|
so a file you just wrote is caught before it is staged, while gitignored local
|
|
runtime state is not reported. It therefore needs to run inside a git work tree
|
|
and exits `1` with a message if it is not.
|
|
|
|
On every pull request, GitHub Actions runs
|
|
`skills/file-headers/scripts/check-headers-pr.sh` against only the
|
|
files changed in the PR diff (added, copied, renamed, or modified). Test locally
|
|
before pushing:
|
|
|
|
```bash
|
|
bash skills/file-headers/scripts/check-headers-pr.sh origin/master HEAD
|
|
```
|