You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
The weekly OSV scan has no outlet, so a new advisory is discovered by whichever PR author next touches a package.json — six occurrences in a month #14645
Split out of #14639 by triage. That card is the current instance — four fixable OSV advisories red in the lockfile — and is queued as a take-the-fix repair. This card is the question it records but deliberately does not answer: why this class keeps being discovered by accident.
The measured lineage (from #14639, which assembled it)
Six in a month. Every one was fixable at the time it was found. Every one was found by whichever seat happened to trip over it, never by anything watching.
The mechanism
.github/workflows/validate-deps.yml runs on two triggers that do different jobs and are not synchronised:
schedule: cron '0 3 * * 1' — weekly, Mondays. This is the discovery trigger.
**/package.json, pnpm-lock.yaml, .changeset/config.json, pnpm-workspace.yaml, osv-scanner.toml — per-PR. This is the blocking trigger.
Between Monday scans, a new advisory lands in the OSV database and nothing in the repo changes. The first PR that touches any manifest then runs the scan and eats a red that has nothing to do with its diff. So the blocking trigger is doing the discovery, six days late, on a random author.
Options
A — tighten the scan cadence (daily rather than weekly). Discovery moves ahead of blocking without adding anything new. Does not change who acts on it.
B — give the scheduled scan an outlet: a red scheduled run opens a card. The job already holds issues: write, so the capability is present and unused.
C — status quo. Keep discovering by collision. Six data points say what that costs.
A and B are not exclusive.
What this card does NOT cover
⛔ The four current advisories. Those are #14639's, and that card is pm:queue — do not fold the repair in here, and do not wait for this ruling to take the fix.
Maintainer ruling recorded — A: the OSV scan runs daily; no automatic card producer yet
Director seat, summon #11, session session_01ShyhexkB2d1AeRZ85tgAAe, 2026-09-03.
Provenance (who / verbatim / where): maintainer, live PM chat with the director seat, 2026-09-03, replying to decision batch #20 in which this card was item 5 with the recommendation A (fallback B). Verbatim reply: 「其他同意」 — adopts A.
Ruled: A. The osv-scanner.yml schedule moves from weekly to daily (one cron line), so the discovery window for a new advisory shrinks from up to six days to one and a seat is far more likely to see the scheduled red before an unrelated PR collides with it. Option B (a scheduled red opens a card automatically) is not built now: it is a new automatic producer whose dedupe and close rules would have to be ruled with it, and the measured pull (six collisions in a month) is answered by the cadence first. Recorded fallback: if a daily red is measured going unseen until a PR collides with it, B returns as its own card with the dedupe / close rules in the same proposal.
Claim: PM loop round 1
Session: session_012zGPuVVX3deAx9LdjK8jCk
Branch: claude/issue-14645-osv-daily-cadence
Worktree: objectstack-issue-14645
Domain: domain:devx
File surface: .github/workflows/validate-deps.yml (stop on breach; explain in the report)
Container & model: S mechanical, mode:subagent, model: sonnet (dispatch-gates --tier at 11:02Z: no path-derived mandate; floor sonnet applies — one cron field, correctness judged by the gate farm)
Clause-②: no
Serial constraints cleared: none — no in-flight devx card touches .github/workflows/**; verified against the four live PRs #14853/#14872/#14896/#14856, whose ten pairwise file intersections are all 0
Note: the ruling names .github/workflows/osv-scanner.yml, which does not exist on origin/main at my base commit 450e73b. The card body correctly names .github/workflows/validate-deps.yml (schedule cron on line 22, issues: write present). Applying the ruling's substance — weekly → daily, one cron line — to that file, per the card's own correction note.
{
"issue": 14645,
"status": "done",
"branch": "claude/issue-14645-osv-daily-cadence",
"pr": "https://github.com/objectstack-ai/objectstack/pull/14934",
"premise_still_valid": true,
"summary": "Moved the OSV/dependency-scan schedule trigger in .github/workflows/validate-deps.yml from weekly ('0 3 * * 1', Mondays) to daily ('0 3 * * *'), same 03:00 UTC hour — Option A per the maintainer ruling (issue comment 5523306978). The ruling names .github/workflows/osv-scanner.yml, which does not exist on origin/main; applied the ruling's substance to validate-deps.yml, the file the card's own body correctly names and which actually carries the schedule trigger and issues: write. Did not build Option B (no issue-opening step added) and did not fold in #14639's four advisories, per scope fence.",
"tests": "HEAD 663dc667 (matches pushed branch tip). All 29 commands dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived from this changeset ran via scripts/pm/os-verify-lock.sh, foreground, exit code captured before any pipe (redirect-then-$?-then-read pattern), each read from its own printed verdict line, all exit 0: check-aggregator-roster, check-changeset-fixed, check-closing-keyword-parity, check-comment-mask-corpus (5790 files, 0 disagree), check-osv-exemptions (--self-test + real run), check-position-name-fold-loaders, check-required-contexts, check-self-test-wired, check-self-test-workflow-commands, check-shard-attestation, check-step-collectors, check-whole-set-label-write, docs-audit/check-drift-comment, pm/ci-failure --self-test, check:agent-test-spelling, check:declared-population-live, check:node-version, check:nul-bytes, check:override-consistency (9 override(s) resolve to targets), check:pm-dispatch-gates (dispatch-gates self-test: 1288 cases pass), check:pnpm-acquisition, check:pnpm-filter-targets, check:refd-timer-probe, check:required-contexts, check:shard-attestation, check:stall-guard-budget, check:stall-guard-headroom, check:watch-hint-literal, check:workflow-status-functions (30 workflow files, 53 jobs). Re-derived the family list post-commit at HEAD 663dc667 (dispatch-gates.mjs --commands again): identical list, no new gates introduced by the final commit. YAML validated with python3 yaml.safe_load. On-CI (informational, not waited on beyond what completed during this turn): PR #14934 checks — 'Validate Package Dependencies' (validate-deps.yml itself, pull_request trigger) succeeded; 27 of 30 check runs completed successful/skipped; 'Lint & Repo Gates' was still in_progress when this report was written (in_progress, CI convergence is PM's to track per dispatch instructions, not re-polled here).",
"mcp_calls": 10,
"open_questions": [],
"out_of_scope_findings": []
}
ACCEPT — PR #14934, reviewed 2026-09-03T11:24Z by session_012zGPuVVX3deAx9LdjK8jCk
Checked against the diff and origin/main, not the report.
item
reading
PR form
draft, base main, first line Fixes #14645, skip-changeset + size/xs
governed surface
clean — .github/workflows/** is explicitly NOT governed (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md is the whole list) ⇒ normal ready→queue path
scope
1 file, +5/−2 — .github/workflows/validate-deps.yml only
the change
- cron: '0 3 * * 1' → + cron: '0 3 * * *' — one field, same 03:00 UTC hour
ruling fidelity
Option A exactly; ⛔ no Option B issue-opening step; ⛔ #14639's four advisories not folded in
The judgement call in it that was right
The dispatch asked for "one cron line". The dev also rewrote the adjacent comment — which reads as scope creep for about two seconds, and is in fact the correct minimum: the old comment said "Run weekly on Monday at 03:00 UTC". Changing only the cron would have left a comment asserting weekly directly above a daily schedule — a fresh declared ≠ enforced contradiction, in the same three lines, introduced by a card whose whole subject is discovery lag. The four added lines say what changed and why, and cite the card. ⇒ Correct, not creep.
The ruling's filename slip, handled the way I asked
The ruling names .github/workflows/osv-scanner.yml. That file does not exist — I measured this at 11:01Z before dispatching, and the dev re-measured it independently. The ruling's substance (weekly → daily) was applied to validate-deps.yml, the file the card's own body names and the one that actually carries both the schedule: trigger and issues: write. ⛔ Nothing was re-adjudicated; the slip is clerical and is recorded in the PR body.
Gates
29 dispatched families derived by the dev from its own tree post-commit and re-derived at the final HEAD (identical list — so no gate was introduced by the last commit and then left unrun), all exit 0, captured before any pipe by the redirect-then-$?-then-read pattern. YAML re-validated with yaml.safe_load, which is the one check that matters for a workflow edit and is not implied by any of the 29.
Landing — not yet armed, deliberately
CI on 663dc6670f at 11:23Z: 17 success / 12 skipped / Lint & Repo Gates still in_progress. Enqueue eligibility is every check green, not the required subset, so this waits. Flip + arm on convergence; a red there is this PR's to explain, not to re-run.
⚠️ Process note recorded against this dispatch: the dev's first turn ended with the gate suite handed to a background watcher, which is a stall, not a completion — nothing would have restarted it. It was reset to foreground execution immediately rather than after any silence threshold, and the second turn ran all 29 gates in-turn. The delivery above is that second turn's.
$ git show origin/main:.github/workflows/validate-deps.yml | sed -n '20,24p'
schedule:
# Run daily at 03:00 UTC — narrows the discovery window for a new OSV
# advisory from up to six days (weekly) to one, ...
Merge commit 3210b3d5d confirmed an ancestor of origin/main (git merge-base --is-ancestor, exit 0). Option A as ruled; ⛔ no Option B producer built; ⛔ #14639's advisories untouched.
⚠️A reading worth recording, because it nearly became a false regression report. My first probe after the merge notification still showed cron: '0 3 * * 1' — weekly. The change had not reverted: my local origin/main ref was fetched before the 12:01:13Z merge. origin/main is a local ref that only a fetch moves, and a merge notification does not move it. Re-fetch before every post-merge probe; without that step this close-out would have reported a landed change as missing.
Activity
os-project-manager commentedon Sep 3, 2026
Maintainer ruling recorded — A: the OSV scan runs daily; no automatic card producer yet
Director seat, summon #11, session
session_01ShyhexkB2d1AeRZ85tgAAe, 2026-09-03.Provenance (who / verbatim / where): maintainer, live PM chat with the director seat, 2026-09-03, replying to decision batch #20 in which this card was item 5 with the recommendation A (fallback B). Verbatim reply: 「其他同意」 — adopts A.
Ruled: A. The
osv-scanner.ymlschedule moves from weekly to daily (one cron line), so the discovery window for a new advisory shrinks from up to six days to one and a seat is far more likely to see the scheduled red before an unrelated PR collides with it. Option B (a scheduled red opens a card automatically) is not built now: it is a new automatic producer whose dedupe and close rules would have to be ruled with it, and the measured pull (six collisions in a month) is answered by the cadence first. Recorded fallback: if a daily red is measured going unseen until a PR collides with it, B returns as its own card with the dedupe / close rules in the same proposal.Execution:
domain:devxlane, S,.github/workflows/osv-scanner.yml;skip-changeset;Clause-②: no.State transition, same stroke:
needs-user-decision→pm:queue. Ledger: director seat post #12708, summon #11.Generated by Claude Code
claude commentedon Sep 3, 2026
Claim: PM loop round 1
Session:
session_012zGPuVVX3deAx9LdjK8jCkBranch:
claude/issue-14645-osv-daily-cadenceWorktree:
objectstack-issue-14645Domain:
domain:devxFile surface:
.github/workflows/validate-deps.yml(stop on breach; explain in the report)Container & model: S mechanical,
mode:subagent,model: sonnet(dispatch-gates--tierat 11:02Z: no path-derived mandate; floor sonnet applies — one cron field, correctness judged by the gate farm)Clause-②: no
Serial constraints cleared:
none— no in-flight devx card touches.github/workflows/**; verified against the four live PRs #14853/#14872/#14896/#14856, whose ten pairwise file intersections are all 0Generated by Claude Code
baozhoutao commentedon Sep 3, 2026
Claim (dev agent): starting implementation.
Session:
session_012zGPuVVX3deAx9LdjK8jCkBranch:
claude/issue-14645-osv-daily-cadenceWorktree:
../objectstack-issue-14645Note: the ruling names
.github/workflows/osv-scanner.yml, which does not exist onorigin/mainat my base commit450e73b. The card body correctly names.github/workflows/validate-deps.yml(schedule cron on line 22,issues: writepresent). Applying the ruling's substance — weekly → daily, one cron line — to that file, per the card's own correction note.Generated by Claude Code
Generated by Claude Code
ci(deps): tighten OSV/dependency scan schedule from weekly to daily
baozhoutao commentedon Sep 3, 2026
os-dev-report
{ "issue": 14645, "status": "done", "branch": "claude/issue-14645-osv-daily-cadence", "pr": "https://github.com/objectstack-ai/objectstack/pull/14934", "premise_still_valid": true, "summary": "Moved the OSV/dependency-scan schedule trigger in .github/workflows/validate-deps.yml from weekly ('0 3 * * 1', Mondays) to daily ('0 3 * * *'), same 03:00 UTC hour — Option A per the maintainer ruling (issue comment 5523306978). The ruling names .github/workflows/osv-scanner.yml, which does not exist on origin/main; applied the ruling's substance to validate-deps.yml, the file the card's own body correctly names and which actually carries the schedule trigger and issues: write. Did not build Option B (no issue-opening step added) and did not fold in #14639's four advisories, per scope fence.", "tests": "HEAD 663dc667 (matches pushed branch tip). All 29 commands dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived from this changeset ran via scripts/pm/os-verify-lock.sh, foreground, exit code captured before any pipe (redirect-then-$?-then-read pattern), each read from its own printed verdict line, all exit 0: check-aggregator-roster, check-changeset-fixed, check-closing-keyword-parity, check-comment-mask-corpus (5790 files, 0 disagree), check-osv-exemptions (--self-test + real run), check-position-name-fold-loaders, check-required-contexts, check-self-test-wired, check-self-test-workflow-commands, check-shard-attestation, check-step-collectors, check-whole-set-label-write, docs-audit/check-drift-comment, pm/ci-failure --self-test, check:agent-test-spelling, check:declared-population-live, check:node-version, check:nul-bytes, check:override-consistency (9 override(s) resolve to targets), check:pm-dispatch-gates (dispatch-gates self-test: 1288 cases pass), check:pnpm-acquisition, check:pnpm-filter-targets, check:refd-timer-probe, check:required-contexts, check:shard-attestation, check:stall-guard-budget, check:stall-guard-headroom, check:watch-hint-literal, check:workflow-status-functions (30 workflow files, 53 jobs). Re-derived the family list post-commit at HEAD 663dc667 (dispatch-gates.mjs --commands again): identical list, no new gates introduced by the final commit. YAML validated with python3 yaml.safe_load. On-CI (informational, not waited on beyond what completed during this turn): PR #14934 checks — 'Validate Package Dependencies' (validate-deps.yml itself, pull_request trigger) succeeded; 27 of 30 check runs completed successful/skipped; 'Lint & Repo Gates' was still in_progress when this report was written (in_progress, CI convergence is PM's to track per dispatch instructions, not re-polled here).", "mcp_calls": 10, "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
claude commentedon Sep 3, 2026
ACCEPT — PR #14934, reviewed 2026-09-03T11:24Z by
session_012zGPuVVX3deAx9LdjK8jCkChecked against the diff and
origin/main, not the report.main, first lineFixes #14645,skip-changeset+size/xs.github/workflows/**is explicitly NOT governed (docs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.mdis the whole list) ⇒ normal ready→queue path.github/workflows/validate-deps.ymlonly- cron: '0 3 * * 1'→+ cron: '0 3 * * *'— one field, same 03:00 UTC hourThe judgement call in it that was right
The dispatch asked for "one cron line". The dev also rewrote the adjacent comment — which reads as scope creep for about two seconds, and is in fact the correct minimum: the old comment said "Run weekly on Monday at 03:00 UTC". Changing only the cron would have left a comment asserting weekly directly above a daily schedule — a fresh declared ≠ enforced contradiction, in the same three lines, introduced by a card whose whole subject is discovery lag. The four added lines say what changed and why, and cite the card. ⇒ Correct, not creep.
The ruling's filename slip, handled the way I asked
The ruling names
.github/workflows/osv-scanner.yml. That file does not exist — I measured this at 11:01Z before dispatching, and the dev re-measured it independently. The ruling's substance (weekly → daily) was applied tovalidate-deps.yml, the file the card's own body names and the one that actually carries both theschedule:trigger andissues: write. ⛔ Nothing was re-adjudicated; the slip is clerical and is recorded in the PR body.Gates
29 dispatched families derived by the dev from its own tree post-commit and re-derived at the final HEAD (identical list — so no gate was introduced by the last commit and then left unrun), all exit 0, captured before any pipe by the redirect-then-
$?-then-read pattern. YAML re-validated withyaml.safe_load, which is the one check that matters for a workflow edit and is not implied by any of the 29.Landing — not yet armed, deliberately
CI on
663dc6670fat 11:23Z: 17 success / 12 skipped /Lint & Repo Gatesstillin_progress. Enqueue eligibility is every check green, not the required subset, so this waits. Flip + arm on convergence; a red there is this PR's to explain, not to re-run.Generated by Claude Code
claude commentedon Sep 3, 2026
LANDED — PR #14934 MERGED 12:01:13Z; probe on
origin/maindomain:devxseat, sessionsession_012zGPuVVX3deAx9LdjK8jCk, R1.Merge commit
3210b3d5dconfirmed an ancestor oforigin/main(git merge-base --is-ancestor, exit 0). Option A as ruled; ⛔ no Option B producer built; ⛔ #14639's advisories untouched.cron: '0 3 * * 1'— weekly. The change had not reverted: my localorigin/mainref was fetched before the 12:01:13Z merge.origin/mainis a local ref that only afetchmoves, and a merge notification does not move it. Re-fetch before every post-merge probe; without that step this close-out would have reported a landed change as missing.ACCEPT:
5524960911.pm:dispatchedstripped, assignee cleared.Generated by Claude Code
ci(deps): tighten OSV/dependency scan schedule from weekly to daily (o…