97 lines
No EOL
3.6 KiB
YAML
97 lines
No EOL
3.6 KiB
YAML
name: Claim Validation
|
|
on:
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
validate:
|
|
runs-on: docker
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Check Pentagon-Agent trailers
|
|
run: |
|
|
# Every commit in the PR must have a Pentagon-Agent trailer
|
|
MISSING=$(git log origin/main..HEAD --format="%H %s" | while read hash msg; do
|
|
if ! git log -1 --format="%B" $hash | grep -q "^Pentagon-Agent:"; then
|
|
echo "$hash: $msg"
|
|
fi
|
|
done)
|
|
if [ -n "$MISSING" ]; then
|
|
echo "Commits missing Pentagon-Agent trailer:"
|
|
echo "$MISSING"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Validate claim YAML frontmatter
|
|
run: |
|
|
# Check all new/modified .md files have valid frontmatter
|
|
FILES=$(git diff --name-only origin/main...HEAD -- '*.md')
|
|
for f in $FILES; do
|
|
if [ -f "$f" ] && head -1 "$f" | grep -q "^---"; then
|
|
# Has frontmatter — check required fields for claims
|
|
if grep -q "^type: claim" "$f"; then
|
|
for field in domain description confidence source created; do
|
|
if ! grep -q "^${field}:" "$f"; then
|
|
echo "FAIL: $f missing required field: $field"
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
done
|
|
|
|
- name: Check wiki link targets exist
|
|
run: |
|
|
# Extract all [[links]] from changed files and verify targets exist
|
|
FILES=$(git diff --name-only origin/main...HEAD -- '*.md')
|
|
BROKEN=""
|
|
for f in $FILES; do
|
|
if [ -f "$f" ]; then
|
|
links=$(grep -oP '\[\[([^\]]+)\]\]' "$f" | sed 's/\[\[//;s/\]\]//' || true)
|
|
for link in $links; do
|
|
# Search for a file whose name matches the link text
|
|
FOUND=$(find . -name "*.md" -path "*${link}*" 2>/dev/null | head -1)
|
|
if [ -z "$FOUND" ]; then
|
|
BROKEN="$BROKEN\n $f -> [[$link]]"
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
if [ -n "$BROKEN" ]; then
|
|
echo "Broken wiki links found:$BROKEN"
|
|
echo "(WARNING — not blocking merge, but flagged for review)"
|
|
fi
|
|
|
|
- name: Territory check
|
|
run: |
|
|
# Verify agents only modify files in their territory
|
|
AGENT=$(git log -1 --format="%B" HEAD | grep "^Pentagon-Agent:" | sed 's/Pentagon-Agent: \(.*\) <.*/\1/' | tr '[:upper:]' '[:lower:]')
|
|
if [ -z "$AGENT" ]; then exit 0; fi
|
|
|
|
FILES=$(git diff --name-only origin/main...HEAD)
|
|
case "$AGENT" in
|
|
rio) TERRITORY="domains/internet-finance/ agents/rio/ inbox/" ;;
|
|
clay) TERRITORY="domains/entertainment/ agents/clay/ inbox/" ;;
|
|
theseus) TERRITORY="domains/ai-alignment/ agents/theseus/ inbox/" ;;
|
|
vida) TERRITORY="domains/health/ agents/vida/ inbox/" ;;
|
|
astra) TERRITORY="domains/space-development/ agents/astra/ inbox/" ;;
|
|
leo) TERRITORY="core/ foundations/ agents/leo/ inbox/ maps/" ;;
|
|
*) TERRITORY="" ;;
|
|
esac
|
|
|
|
if [ -n "$TERRITORY" ]; then
|
|
for f in $FILES; do
|
|
ALLOWED=false
|
|
for t in $TERRITORY; do
|
|
if echo "$f" | grep -q "^$t"; then
|
|
ALLOWED=true
|
|
break
|
|
fi
|
|
done
|
|
if [ "$ALLOWED" = false ]; then
|
|
echo "TERRITORY VIOLATION: $AGENT modified $f (outside allowed: $TERRITORY)"
|
|
exit 1
|
|
fi
|
|
done
|
|
fi |