meta-ci-advisory / meta (advisory) (push) Skipped
SEO Skill Lint / Validate seo-all slash commands (push) Skipped
meta-ci-advisory / meta (advisory) (pull_request) Successful in 3s
SEO Skill Lint / Validate seo-all slash commands (pull_request) Successful in 4s
minimal-ci / minimal-validate (push) Successful in 12s
minimal-ci / minimal-validate (pull_request) Successful in 10s
The prod agent (dinecall-ai, 2026-10-13) closed four of its own PRs in one tick: it ran `npx tsc` without installed dependencies, read npm's stub as "tsc unavailable", and judged a 3-minute-old commit "older than 20 min" because it believed the date was a day ahead. The independent review of this PR found the same class of gap in the prompt-only gate (CI read as green with no checks, an unenforceable merge cap, a revert path that could not finish, ownership by token identity, SERP scraping against robots.txt). agent-skills/seo-all/scripts/seo-ops.py now owns those decisions: the real date (and repair of invented future dates), PR verdicts from check runs or mergeable_state plus real commit age, local typecheck/tests with pre-existing-failure detection, marker-based PR ownership, a self-review record bound to the head SHA, a guarded squash merge (CI, review, hold label, daily cap, pending live check), live verification with revert, robots-aware fetch, and API-key search with a budget. Stdlib unit tests run in seo-lint. Prompts shrink to judgment: the tick and daily post call seo-ops; B prompts point at the real command files and run at :15 so they never start with a tick; the blog run works in its own worktree. Fact sources are operator-set only; the system prompt states precedence over self-written skills/memory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
33 lines
1.0 KiB
YAML
33 lines
1.0 KiB
YAML
name: SEO Skill Lint
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
validate-seo-commands:
|
|
name: Validate seo-all slash commands
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
steps:
|
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
|
|
- name: Check for residual space-form /seo invocations
|
|
run: |
|
|
set -euo pipefail
|
|
# grep exits 1 when no matches, which is what we want.
|
|
if grep -REn --include='*.md' --include='*.json' --include='*.yaml' --include='*.yml' '/seo ' agent-skills/seo-all/; then
|
|
echo "::error::Found residual space-form '/seo ' invocations above."
|
|
exit 1
|
|
fi
|
|
echo "::notice::No residual space-form '/seo ' invocations found."
|
|
|
|
- name: Validate slash-command references and evals.json
|
|
run: python3 .gitea/scripts/validate_seo_commands.py
|
|
|
|
- name: seo-ops unit tests
|
|
run: python3 -m unittest discover -s agent-skills/seo-all/scripts -p 'test_*.py' -v
|