Files
zeekay 1b367e2b62 chore: rebase the tree onto upstream master
The tree was a debranded snapshot of upstream taken around 2026-02-20, and
upstream has moved about five months since. This replaces it with upstream
master, mechanically re-derived: bin/debrand does the rename, and the
pipeline and squashed migrations are restored from the shipped tree.

Not a merge. The previous import replaced the tree wholesale in a single
commit, so there is no shared content history to merge against. Reproducing
the rename on the new tree is what actually converges.

What survives: .hanzo/workflows, the Dockerfiles and bin/docker* entrypoints,
compose files, LLM.md, and insights/migrations. The squashed initial
migration is load-bearing — the live database records it by name, so
upstream's ~918 individual migrations cannot come back.

Nine products are dropped as unreferenced. Twenty-one more that we do not run
are kept anyway because the core app still imports them; unpicking those is a
refactor and does not belong in a rebase.

This base does not build yet, and the reasons are not in the rename:
upstream now wants Python 3.13.13 against our 3.12.12 and Django 5.2 against
our 4.2, and the dependency manifests still name upstream packages that we
republish under our own names. Those are decisions, not renames.
2026-08-01 15:44:40 -07:00

2.1 KiB

Devex semgrep rules

Devex / hygiene rules for the Insights codebase. Run by the semgrep-devex job in ci-security.yaml in two passes:

  1. Warnings (informational) — semgrep --severity=WARNING runs all severity: WARNING rules. Findings appear in the CI run output but the step does not fail. Use this mode when a rule has a non-zero backlog of existing violations — the list shows up in CI without blocking master while the codebase is cleaned up.
  2. Errors (blocking) — semgrep --severity=ERROR --error runs all severity: ERROR rules and fails CI on any finding. Use this mode for hard regression guards: patterns that should never appear, or migration-style rules whose backlog has been cleaned up.

Picking a severity

Pick the severity that matches the rule's intent:

  • ERROR when zero violations are expected — either because the pattern is genuinely new (regression guard) or because a previously-WARNING rule has been cleaned up.
  • WARNING when there's a known non-zero backlog that will be migrated over time.

A WARNING rule typically gets flipped to ERROR once its backlog hits zero. The rule stays in .semgrep/rules/devex/; only the severity changes. To flip a rule:

  1. Verify locally that semgrep --config .semgrep/rules/devex/<rule>.yaml common/ ee/ frontend/ insights/ products/ returns zero findings.
  2. Edit the rule file: change severity: WARNING to severity: ERROR.
  3. Update the rule's message: to drop any "informational, not blocking" phrasing — it's now blocking.

Conventions for new rules

  • Decide severity by expected finding count: zero → ERROR; non-zero → WARNING.
  • Include the migration playbook (or a pointer to a skill) in the rule's message: field — that's what reviewers and authors see when the rule fires.
  • Scope with paths.include: rather than relying only on paths.exclude: — narrower scope means faster scans and clearer intent.
  • For legitimate exceptions, prefer paths.exclude: for categorical cases (whole dirs/files) and # nosemgrep: <rule-id> for case-by-case exemptions at the call site.