9740bc64c9
Firmware QEMU Tests (ADR-061) / QEMU Test (edge-tier1) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (full-adr060) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (tdm-3node) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / Swarm Test (ADR-062) (push) Has been skipped
npm packages / tools/ruview-mcp (node 22) (push) Failing after 1s
nvsim-server → ghcr.io / build-and-publish (push) Failing after 1s
ruview-swarm CI guard / tests (full+train) (push) Failing after 2s
Bench Regression Guard / bench compile-verify (--no-run) (push) Failing after 0s
Bench Regression Guard / bench fast-run (informational, non-gating) (push) Has been skipped
Firmware CI / Verify version.txt matches release tag (push) Has been skipped
Dashboard a11y + cross-browser / a11y (push) Failing after 0s
nvsim Dashboard → GitHub Pages / build-and-deploy (push) Failing after 2s
Firmware CI / Build firmware (esp32s3 / 4mb) (push) Failing after 15s
Firmware QEMU Tests (ADR-061) / Build Espressif QEMU (push) Failing after 1s
Firmware QEMU Tests (ADR-061) / Fuzz Testing (ADR-061 Layer 6) (push) Failing after 1s
Continuous Deployment / Pre-deployment Checks (push) Has been skipped
Firmware CI / Build firmware (esp32c6 / c6-4mb) (push) Failing after 15s
Firmware CI / Build firmware (esp32s3 / 8mb) (push) Failing after 15s
Firmware QEMU Tests (ADR-061) / QEMU Test (boundary-max) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (boundary-min) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (default) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (edge-tier0) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / NVS Matrix Generation (push) Failing after 1s
Security Scanning / Security Policy Compliance (push) Failing after 0s
Security Scanning / Dependency Vulnerability Scan (push) Failing after 0s
Security Scanning / Static Application Security Testing (push) Failing after 1s
Security Scanning / Infrastructure Security Scan (push) Failing after 1s
Security Scanning / Secret Scanning (push) Failing after 1s
npm packages / harness/ruview (node 22) (push) Failing after 17s
Security Scanning / License Compliance Scan (push) Failing after 1s
Security Scanning / Container Security Scan (push) Failing after 4s
three.js demos → GitHub Pages / build-and-deploy (push) Failing after 1s
Verify Pipeline Determinism / Verify Pipeline Determinism (3.11) (push) Failing after 1s
Fix-Marker Regression Guard / Verify fix markers (push) Failing after 1s
ADR-115 MQTT integration tests / mqtt-integration (push) Failing after 1s
npm packages / harness/ruview (node 20) (push) Failing after 1s
npm packages / tools/ruview-mcp (node 20) (push) Failing after 1s
npm packages / tools/ruview-cli (node 20) (push) Failing after 1s
npm packages / tools/ruview-cli (node 22) (push) Failing after 1s
BFLD MQTT Integration / cargo test --features mqtt (live mosquitto) (push) Failing after 29s
ruview-swarm CI guard / build train_marl bin (push) Failing after 2s
ruview-swarm CI guard / clippy (-D warnings, --no-deps) (push) Failing after 3s
ruview-swarm CI guard / tests (ruflo) (push) Failing after 1s
ruview-swarm CI guard / tests (train) (push) Failing after 2s
ruview-swarm CI guard / tests (default) (push) Failing after 2s
Point Cloud Viewer → GitHub Pages / build-and-deploy (push) Failing after 8s
ruview-swarm CI guard / ITAR / publish guard (push) Failing after 0s
wifi-densepose sensing-server → Docker Hub + ghcr.io / build · push · smoke-test (push) Failing after 1s
Continuous Deployment / Deploy to Production (push) Has been cancelled
Continuous Deployment / Rollback Deployment (push) Has been cancelled
Continuous Deployment / Post-deployment Monitoring (push) Has been cancelled
Continuous Deployment / Notify Deployment Status (push) Has been cancelled
Continuous Deployment / Deploy to Staging (push) Has been cancelled
Security Scanning / Security Report (push) Has been cancelled
152 lines
6.2 KiB
YAML
152 lines
6.2 KiB
YAML
name: GitHub Clone Tracking → data/clone-data.rvf
|
|
|
|
# Persists rolling 14-day clone-traffic snapshots to data/clone-data.rvf in
|
|
# the ruvector JSONL RVF format. GitHub's /traffic/clones endpoint only
|
|
# retains the last 14 days server-side, so without this scheduled scrape
|
|
# the data is gone forever the moment it falls outside the window.
|
|
#
|
|
# Format: JSONL RVF
|
|
# - line 1 is a `metadata` segment that initializes the file
|
|
# - each subsequent run appends one `clone_snapshot` segment carrying the
|
|
# 14-day rollup PLUS per-day breakdown
|
|
# - file is idempotent: per-day entries are keyed by `timestamp` so a
|
|
# downstream reader can dedupe across overlapping snapshot windows
|
|
#
|
|
# Schedule: every 14 days (1st + 15th of each month, ~14-day cadence in
|
|
# practice). Workflow can also be dispatched manually for backfill or test.
|
|
|
|
on:
|
|
schedule:
|
|
# 01:23 UTC on the 1st and 15th of every month — close to 14-day cadence
|
|
# without cron's "every 14 days" monthly-reset weirdness. Picking :23
|
|
# avoids the cron herd on :00.
|
|
- cron: '23 1 1,15 * *'
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
concurrency:
|
|
group: clone-tracking
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
snapshot:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Fetch /traffic/clones + /traffic/views from GitHub
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
mkdir -p data
|
|
gh api repos/${{ github.repository }}/traffic/clones > /tmp/clones.json
|
|
gh api repos/${{ github.repository }}/traffic/views > /tmp/views.json
|
|
echo "--- clones rollup ---"
|
|
jq '{count, uniques, days: (.clones | length)}' /tmp/clones.json
|
|
echo "--- views rollup ---"
|
|
jq '{count, uniques, days: (.views | length)}' /tmp/views.json
|
|
|
|
- name: Append snapshot to data/clone-data.rvf
|
|
env:
|
|
REPO: ${{ github.repository }}
|
|
run: |
|
|
set -e
|
|
RVF="data/clone-data.rvf"
|
|
FETCHED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
|
|
# Initialize the file with a metadata segment on first run.
|
|
if [ ! -f "$RVF" ]; then
|
|
echo "Initializing $RVF with metadata segment"
|
|
jq -n --arg repo "$REPO" --arg ts "$FETCHED_AT" '{
|
|
type: "metadata",
|
|
name: "ruview-clone-traffic-history",
|
|
version: "1.0.0",
|
|
schema: "ruvector.rvf.jsonl/v1",
|
|
format: "github-traffic-snapshots",
|
|
repo: $repo,
|
|
source: "GitHub Traffic API /repos/{repo}/traffic/{clones,views}",
|
|
policy: "GitHub retains only 14 days server-side; this file is the long-term record.",
|
|
segments: ["metadata", "clone_snapshot", "view_snapshot"],
|
|
created_at: $ts,
|
|
custom: {
|
|
cadence: "twice monthly (1st and 15th, ~14-day intervals)",
|
|
idempotency_key: "timestamp (per-day records de-duplicate across overlapping snapshot windows)"
|
|
}
|
|
}' >> "$RVF"
|
|
fi
|
|
|
|
# Append the clone snapshot.
|
|
jq --arg ts "$FETCHED_AT" '{
|
|
type: "clone_snapshot",
|
|
fetched_at: $ts,
|
|
window_count: .count,
|
|
window_uniques: .uniques,
|
|
per_day: .clones
|
|
}' /tmp/clones.json >> "$RVF"
|
|
|
|
# Append the views snapshot (free with the same auth).
|
|
jq --arg ts "$FETCHED_AT" '{
|
|
type: "view_snapshot",
|
|
fetched_at: $ts,
|
|
window_count: .count,
|
|
window_uniques: .uniques,
|
|
per_day: .views
|
|
}' /tmp/views.json >> "$RVF"
|
|
|
|
echo "--- RVF tail (last 4 lines) ---"
|
|
tail -4 "$RVF" | jq -c '{type, fetched_at, window_count, window_uniques}' || true
|
|
echo "--- file size ---"
|
|
wc -l "$RVF"
|
|
|
|
- name: Compute aggregates for the commit summary
|
|
id: agg
|
|
run: |
|
|
# Count distinct per-day entries across all snapshots so we can
|
|
# show "cumulative observed clones" in the commit message.
|
|
python3 - <<'PY'
|
|
import json, os
|
|
path = "data/clone-data.rvf"
|
|
per_day_clones = {}
|
|
per_day_views = {}
|
|
with open(path, encoding="utf-8") as f:
|
|
for line in f:
|
|
if not line.strip():
|
|
continue
|
|
d = json.loads(line)
|
|
if d.get("type") == "clone_snapshot":
|
|
for entry in d.get("per_day", []):
|
|
per_day_clones[entry["timestamp"]] = entry
|
|
elif d.get("type") == "view_snapshot":
|
|
for entry in d.get("per_day", []):
|
|
per_day_views[entry["timestamp"]] = entry
|
|
|
|
tot_clones = sum(e.get("count", 0) for e in per_day_clones.values())
|
|
tot_uniq_clones = sum(e.get("uniques", 0) for e in per_day_clones.values())
|
|
tot_views = sum(e.get("count", 0) for e in per_day_views.values())
|
|
tot_uniq_views = sum(e.get("uniques", 0) for e in per_day_views.values())
|
|
print(f"clone days observed: {len(per_day_clones)} total clones: {tot_clones:,} total unique cloners: {tot_uniq_clones:,}")
|
|
print(f"view days observed: {len(per_day_views)} total views: {tot_views:,} total unique viewers: {tot_uniq_views:,}")
|
|
|
|
with open(os.environ["GITHUB_OUTPUT"], "a") as out:
|
|
out.write(f"clones={tot_clones}\n")
|
|
out.write(f"clone_days={len(per_day_clones)}\n")
|
|
out.write(f"views={tot_views}\n")
|
|
out.write(f"view_days={len(per_day_views)}\n")
|
|
PY
|
|
|
|
- name: Commit + push if changed
|
|
run: |
|
|
git config user.name "github-actions[bot]"
|
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
if git diff --quiet data/clone-data.rvf; then
|
|
echo "no changes to commit"
|
|
exit 0
|
|
fi
|
|
git add data/clone-data.rvf
|
|
git commit -m "chore(traffic): clone snapshot — ${{ steps.agg.outputs.clone_days }} days observed → ${{ steps.agg.outputs.clones }} clones, ${{ steps.agg.outputs.view_days }} view-days → ${{ steps.agg.outputs.views }} views"
|
|
git push
|