Files
molecule-ai-workspace-templ…/.gitea/workflows/seo-lint.yml
T
app-leadandClaude Opus 5.5 47c549a3c2
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
feat: seo-ops - move the agent's mechanical decisions into a tested script
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>
2026-10-12 19:00:33 -07:00

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