ci-runner.sh now accepts optional 4th parameter for pytest markers:
ci-runner.sh mfg abc123 claude genlab → runs only genlab tests
ci-runner.sh mfg abc123 claude heavy → runs full heavy suite
ci-runner.sh mfg abc123 claude → runs full light suite (default)
Changes:
- TAG parameter parsed from $4
- pytest -m flag applied when tag provided
- RUN_MODE shown in Telegram notification (light/heavy/tag:name)
- Baseline check only enforced on full light suite runs
- Comments noting tags need periodic updates as features change
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When CI fails, the HTML report now includes a "Suggestions" section
that analyzes failure patterns and provides actionable fix hints:
- Feature manifest path mismatches
- Import/module errors → pip install
- Auth failures → missing JWT cookie
- Route 404s → endpoint moved/renamed
- Test count regression → baseline drift
- Package check failures → missing deps
- Collection errors → broken conftest/syntax
Also converted the report to dark mode per golden rule.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ci-config.json now has test_count_baseline. If a branch's passing
test count drops below this number, the build fails with
"TEST COUNT REGRESSION". Prevents accidental test loss from
incomplete syncs or bad merges.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Creates /pipeline-results/ directory and writes a structured JSON file
after each CI run (before notification), capturing branch, commit,
actor, timestamp, result, test counts, features, duration, and tags.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lists all feature tags present in the tested files (e.g. genlab,
optimizer, scheduling) and how many tests were not in scope.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Telegram notifications now show which test suite was used (light/heavy)
and how many tests were not in that suite (deselected).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When tests fail, ci-runner.sh generates an HTML report with:
- Build metadata (branch, commit, actor, duration)
- Test stats (passed/failed/skipped/errors)
- Failed test table (file + test name)
- Failure detail output
ci-notify.sh sends the HTML as a document attachment alongside
the text notification in the CICD Pipeline topic.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Multiple simultaneous test runs compete for PostgreSQL connections,
causing spurious errors. Global flock ensures one branch runs at a time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
If pytest reports 0 passed, 0 failed, 0 skipped, treat it as a
failure. Something is wrong if no tests ran at all.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
--timeout flag caused pytest to fail silently on branches without
pytest-timeout installed. Now checks for the package first. Also
detects when pytest exits non-zero with 0 results (collection error)
and properly reports it as a failure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete CI system that lives outside TSHARPS branches:
- ci-webhook.py: HTTP server on port 9500, receives Gitea push webhooks
- ci-runner.sh: runs feature manifests, pytest, package checks (read-only)
- ci-notify.sh: sends results to Telegram CICD Pipeline topic (4706)
- ci-config.json: branch→worktree mapping, tokens, timeouts
- README.md: branch model, promotion workflow, switch-back plan
Same tests for ALL branches. No drift. Runner self-monitors for crashes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>