Files
AgentHub/skills/file-headers/SKILL.md
T
nntrivi2001 8a812a174b fix(lanes): keep stage detection honest across rollbacks and feature switches
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.
2026-09-03 15:29:08 +07:00

4.7 KiB

name, description
name description
file-headers 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):

/**
 * @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/:

/**
 * @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):

/**
 * @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):

#!/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):

"""
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 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 skills/file-headers/scripts/check-headers-pr.sh origin/master HEAD