Repository navigation
watchdog: daily software-health report (CI, open PRs, rc.1 issues) and openamrobot-embodied-ai in the scan - #69
BotshareAI wants to merge 1 commit into
Conversation
…d openamrobot-embodied-ai in the scan
- rollout/repositories.yaml and maintainers.yaml: add openamrobot-embodied-ai
(agent_rules: required, software-lead); test_org_scan counts 14 -> 15.
- tools/watchdog_daily.py: standard-library collector over the GitHub REST API
(CI per workflow on the default branch over 7 days and green rate, open PRs,
rc.1 issues, items idle 14 days); pagination via Link, rate-limit waits,
fail closed per repository ("not measured", run INCOMPLETE, exit 1);
writes daily.json and a daily.md of at most 60 lines.
- tools/watchdog_issue_sync.py: --daily replaces only the dashboard's Daily
section; the Thursday rewrite carries that section over.
- .github/workflows/watchdog-daily.yml: weekdays 04:41 UTC and dispatch,
contents read, issues write, actions read; artifact watchdog-daily.
- rollout/workflows/watchdog-daily-summary.yml: AI summary, design only,
guarded by AI_STAGE_1_ENABLED and issue #43; SETUP.md section 9.
- WATCHDOG.md: Daily report section. Tests with recorded API fixtures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DZnPEPJrZ6MioobL2aYbRm
Signed-off-by: Alex Reznichenko <info@botshare.ai>
panthera-momagdii
left a comment
There was a problem hiding this comment.
Draft review for head 49a20d0b9b6ca6ff81667b90f2999087f9ea9b8c: the deterministic collector, fail-closed handling, dashboard-section isolation, sanitization, and fixture coverage are well structured, and the current repository-quality checks pass. I am not approving the draft yet because the production path is still unverified: the only live collection recorded in the PR measured 1 of 15 repositories, and this new scheduled/manual workflow has not demonstrated that its actual GITHUB_TOKEN can read all enrolled repositories, upload the artifact, and update only the Daily section. Before marking ready, add a safe live dry-run path or equivalent evidence, record a COMPLETE run for all 15 repositories (or document any intentional inaccessible repository), then retain the required two human approvals for the Watchdog safety-path changes. Do not weaken the existing **/*watchdog* review rule.
wikki26
left a comment
There was a problem hiding this comment.
[P1] Reject repository entries that the daily collector cannot parse.
Reviewed head 49a20d0. In tools/watchdog_daily.py, load_repositories() silently continues past every non-flow-mapping line. A valid YAML block-style entry, or a damaged flow entry, is therefore omitted while the remaining entries determine both expected and measured. collect() can label that reduced scan complete.
Local reproduction: a repositories file containing - {name: good, default_branch: main} followed by a block mapping - name: silently-omitted / default_branch: main returns only [('good', 'main')] without an error. Both entries are part of the supplied repository list. This repeats the incomplete-scan failure class fixed in the organization scanner.
Please parse and validate the complete YAML structure (or strictly reject every unsupported repository-list line), retain an independent expected-coverage check, and add regressions for block-style entries, malformed entries among valid entries, and truncated lists. Missing repositories must be explicitly incomplete, never silently dropped.
Validation: python3 -m pytest -q tests on this exact head: 308 passed, 226 subtests passed. The standalone parser reproduction above was run locally and exposes a gap outside those tests. Existing live-token/artifact/Daily-section acceptance concerns remain; no live workflow, dashboard write, hardware or safety validation was performed. OpenAI ChatGPT/Codex-assisted review; not approval or activation.
Summary
This PR adds a deterministic, read-only daily software-health report to the Watchdog and adds openamrobot-embodied-ai to the scanned repositories. No AI runs in this PR.
decisions.yamland the Thursday workflow.github/workflows/watchdog-org-scan.ymlare unchanged.The report runs on weekdays at 04:41 UTC and on demand. For every repository in
rollout/repositories.yamlit collects, through the GitHub REST API:It uploads
daily.jsonanddaily.mdas thewatchdog-dailyartifact and writesdaily.mdinto a "Daily" section of the existing "[watchdog] Organization dashboard" issue. A repository it cannot read is "not measured", and the run is then INCOMPLETE and red.Precondition
openAMRobot/.githubclaude/cool-babbage-jyje2v. It was restarted fromorigin/mainbecause its previous PR, decisions: head camera 42 mm forward and baseline pitch 30 degrees, second E-stop on the static lift column (P-03 rev20.0) #68, is merged.71c439e3b6dc823589ba2020a7063cf4dce72c13STATE.md: not present in this repository.Work package
Changes
Task 1: openamrobot-embodied-ai
rollout/repositories.yaml:{name: openamrobot-embodied-ai, default_branch: main, agent_rules: required}.maintainers.yaml:openamrobot-embodied-ai: [software-lead], in the same style as the other software repositories.tests/test_org_scan.py: the repository count goes from 14 to 15, and the INCOMPLETE counts change to match.required/missingAGENTS.md. That is the intended finding.Task 2:
tools/watchdog_daily.py(standard library only)rc.1or with[rc.1]in the title. Pull requests are removed from the issues list. Each entry shows assignees and age.Link rel="next", because GitHub returns/repositories/<id>/URLs.Retry-AfterorX-RateLimit-Reset, for at most--max-wait.daily.jsonholds all data.daily.mdhas at most 60 lines: header, then changes since the previousdaily.json, then one table row per repository. With 15 repositories, one table per repository would not fit in 60 lines, so the table has one row each.@mentions.Task 3: tests
tests/test_watchdog_daily.pyhas 23 tests.tests/test_watchdog_issue_sync.pyhas 7 new tests for--daily.tests/fixtures/watchdog_daily/holds recorded API fixtures. The response layout was recorded from openAMRobot/.github on 2026-10-29 and trimmed; repositories, numbers and logins are synthetic.Task 4:
.github/workflows/watchdog-daily.yml41 4 * * 1-5(UTC) plusworkflow_dispatch.contents: read,issues: write,actions: read.watchdog-dailywithout cancel; timeout 20 minutes.watchdog-dailyartifact for the diff, usinggh apiandactions: read. If there is none, the report says there is no previous report.watchdog-dailyartifact (30 days).watchdog_issue_sync.py --daily ... --apply.tools/check_workflow_policy.pyreports 0 findings; both actions are pinned to the same SHAs as the Thursday workflow.--dailyintools/watchdog_issue_sync.py:<!-- watchdog:daily:start -->and<!-- watchdog:daily:end -->and leaves the title and labels unchanged.daily.mdis published as "Daily report INCOMPLETE" and the tool exits 1.Task 5:
rollout/workflows/watchdog-daily-summary.yml(design only, not under.github/workflows)workflow_runof "Watchdog daily".if: vars.AI_STAGE_1_ENABLED == 'true'.daily.json; there is no checkout.anthropics/claude-code-action@8c3fd987fa6a6b2654f69275e323d08207fcd36c # v1.0.264, with--max-turns 15and--allowedTools "Read,Grep,Glob".rollout/workflows/SETUP.mdgains state rows and section 9, which has the activation steps and points to Activation gate for AI workflows (docs-sync, weekly audit, monthly retro) #43.Task 6:
WATCHDOG.mdIntegration Gate
create_issue/ensure_labels/fetch_existingofwatchdog_issue_sync.py;watchdog-org-scan.yml;safety_pathsinmaintainers.yamlto stop the**/*watchdog*glob matching these files. That would weaken a check. See Safety impact.gh apiwithactions: readneeds no new pinned action.Sample report
I ran the collector once in this session against the real organization:
python3 tools/watchdog_daily.py --repositories rollout/repositories.yaml --out <dir> --previous <first run>/daily.json --max-wait 30. It exited 1 (INCOMPLETE). This session's token is scoped to openAMRobot/.github; the session proxy answered HTTP 403 for the API of every other repository. I did not attach credentials with write access to those repositories just to read them. The run therefore shows the fail-closed path for 14 repositories, and live data only for.github. A scheduled or manual run with the workflow token is the first full measurement.Tests
python3 -m pytest tests -q278 passed;bash rollout/verify.sh278 tests, 0 skipped, PASS.python3 -m pytest tests -q308 passed (23 new intest_watchdog_daily.py, 7 new intest_watchdog_issue_sync.py);bash rollout/verify.sh308 of 308, 0 skipped, PASS.Revert run. Each behaviour was reverted in the tool, one at a time, and the tests were run with
python3 -m pytest tests/test_watchdog_daily.py tests/test_watchdog_issue_sync.py -q. The source was restored after each run, and the suite then passed, 55 of 55.Evidence
Base SHA: 71c439e
Head SHA: 49a20d0
Dependencies
None.
tools/watchdog_daily.pyuses the standard library only. The publish step installsPyYAML==6.0.2only when it is missing, exactly as the Thursday workflow already does.Safety impact
None to safety logic. This is a CI report that reads GitHub API data and edits one issue. It touches no E-stop, brake, contactor, motor-enable or charge-inhibit code, and no firmware or safety-chain watchdog.
maintainers.yamllists**/*watchdog*undersafety_paths, and the file names this task specifies (tools/watchdog_daily.py,tools/watchdog_issue_sync.py,tests/test_watchdog_*.py,.github/workflows/watchdog-daily.yml,rollout/workflows/watchdog-daily-summary.yml,tests/fixtures/watchdog_daily/*) match it.check_pr_evidence.pywill therefore report this PR as a safety-path change in a PR with AI assistance, and fail.I did not narrow the glob, because that would weaken a check. The name collision between the organization Watchdog and safety watchdogs is for the platform lead to resolve, either by approving this PR under the two-approval rule or by scoping the glob in a separate reviewed PR. The PR is opened under the platform lead's account, so the software lead (panthera-momagdii) and the CI owner (wikki26) are requested as the two other human reviewers. The check's "platform lead is not requested" item cannot clear while the platform lead is the author; maintainers.yaml review_policy (platform-lead-authored) applies.
STATE.md
No STATE.md exists in this repository; no change.
Activation
main.watchdog-dailyartifact holdsdaily.jsonanddaily.md;rollout/workflows/watchdog-daily-summary.ymlis not installed, and its activation followsrollout/workflows/SETUP.mdsection 9 only after Activation gate for AI workflows (docs-sync, weekly audit, monthly retro) #43 is closed.Not verified
--applywas not run, so nothing was posted;gh apiartifacts andunzip);GITHUB_TOKENcan read Actions runs, pulls and issues of the other public repositories in the organization is assumed from public-repository API access. It was not shown in this session, where those calls returned 403 from the session proxy..githubwas measured live.rollout/workflows/watchdog-daily-summary.ymlnever ran. The action input names and theexecution_fileoutput are taken from the v1 action interface and were not exercised.check_pr_evidence.pywas run locally on this description only, not in CI.AI disclosure
Claude Code (Claude, Anthropic), acting as CI and release engineer at the request of the platform lead. It wrote every changed file listed above, generated the test fixtures, ran every command in Evidence, ran the collector once against the organization, and wrote this description. The commit is signed off with the git identity configured in the session environment. Human review must check the workflow permissions, the fail-closed behaviour and the safety-path note above.
Contribution terms
Generated by Claude Code