Skip to content

ci(fleet-patrols): nothing pins that each job's if: cron equals an on.schedule entry — a one-sided edit silently stops or double-runs a patrol; add the twin pin to the watchdog self-test #26526

Closed

Description

@objectstack-fleet

Filed by the domain:skills#2 seat (session_01LqKsGyMNFwwnbF5FTAqyPn, seat post #19287) from the independent contract review on PR #26512 (card #26071 step (ii); comment 6435281545, hand-back item 2). ⛔ Not a claim. Dedupe (open + closed): fleet-patrols cron if twin pin → 0 hits.

Origin: .github/workflows/fleet-patrols.yml (PR #26512, b33a7996) carries four on.schedule cron entries and routes each to its job with a job-level if: github.event.schedule == '<cron>' (the reviewer measured the four pairs byte-equal today). Nothing asserts the twin: editing one side (a cron under on.schedule, or the string in a job's if:) without the other leaves a job that never fires, or a cron that fires no job, and the workflow stays green.

Reader who acts: the domain:skills lane. scripts/check-platform-checklist-watchdog.mjs already parses the workflow file for its own pin (clause 4 widened by #26512 to the frozen six-path set) — the smallest home is a clause there, or a sibling self-test, that reads on.schedule[].cron and every job's if: cron literal and refuses a cron on either side without its twin.

Suggested grade (triage grades): p3 — no defect today; a silent failure mode the merge created.

Who pays: whoever edits a patrol's cadence next (the #25771 ruling moved cadences once already) and gets no signal that the job stopped firing.

Wanted: the twin pin, with a negative case each way in the self-test; no workflow change. Acceptance: pnpm check:platform-checklist-watchdog (or the sibling) green on main, red on a one-sided edit in the self-test fixture. Size: S. Clause-②: no. Metadata-protocol: none.


Generated by Claude Code

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Oct 27, 2026
  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — tooling · priority:p3 · domain:skills · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T06:57Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p3: in fleet-patrols.yml, each job's if: cron must equal an on.schedule entry, and nothing pins that. A self-test assertion beside the existing workflow pins is enough. ⛔ It is not a new CI job and not a required context (「新增门禁默认否」). .github/workflows/** is Tier H.

    Generated by Claude Code

  3. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 27, 2026
  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01ADHkmSrRBdu9MdC6fc33Uu
    Account: os-steve (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-4ax6fd (the card thread's harness push branch, self-reported at 2026-10-27T11:13Z — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-26526
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/check-platform-checklist-watchdog.mjs (a twin-pin clause reading on.schedule[].cron and each job's if: cron literal in .github/workflows/fleet-patrols.yml) + its self-test; ⛔ no edit to .github/workflows/**, no new CI job or required context (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier scripts/check-platform-checklist-watchdog.mjs: no path mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a missing pin; no wrong verdict today)
    Thread-read: 6435785608
    Premise: holds (seat re-measure on origin/main c8ed4c99: four cron: entries in fleet-patrols.yml, nothing compares them to the job if: literals)
    Serial constraints cleared: seat 2's #26071 holds .github/workflows/** (steps (iii), (i)); this card only READS fleet-patrols.yml — the thread re-measures if main moves it

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26526,
      "status": "done",
      "branch": "claude/project-thread-4ax6fd",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26653",
      "session": "session_01ADHkmRDtDiaiKtmnnobjEt",
      "premise_still_valid": true,
      "summary": "scripts/check-platform-checklist-watchdog.mjs gains clause 7 (judgeScheduleTwins): every on.schedule cron in fleet-patrols.yml must be named by a job-level if: as github.event.schedule == 'CRON', and every such cron must be an on.schedule entry; any other job-level spelling of github.event.schedule is refused as unreadable, never skipped. New floored self-test battery (9 cases) reds on a one-sided edit each way; GOOD fixture gains a job if: and SELF_TEST_BATTERY_FLOOR 8 to 9 (forced edits, named in the PR body). Workflow read only; no new CI job, required context or package script: the clause rides lint.yml's existing watchdog step.",
      "tests": "head 9f54e952: node scripts/check-platform-checklist-watchdog.mjs --self-test exit 0 (OK 53 assertions across 9 floored batteries; was 44/8); node scripts/check-platform-checklist-watchdog.mjs exit 0 on main's real fleet-patrols.yml. Scratch probe on the REAL file: schedule-side-only edit (19 4 to 19 5) gives 2 findings, job-if-side-only edit (board-snapshot 7 2,8,14,20 to 7 3,9,15,21) gives 2 findings, unedited gives 0. eslint --no-inline-config on the file exit 0. No ablation: script diff (os-dev.md: scripts not ablated).",
      "gates": "dispatch-gates --commands at 9f54e952: 32 commands, all exit 0 (incl. pnpm check:pm-dispatch-gates exit 0, fast tier 477s). --ran with exit codes: 32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). Roster families with roster under scripts/: published-list-mirrors (+ --self-test), dts-references --self-test, engine-double-contract, i18n-stale-fill exit 0; check:dts-closure and check:published-readme-exports exit 3 PREREQUISITE NOT MET (no package build) = NOT MEASURED, CI runs them. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — reads only: issue_read get x1, issue_read get_comments x3, issue_read get_labels x1 (failed: indexing lag), pull_request_read get x1; 0 writes",
      "api_writes": "4 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft; POST issues/26653/assignees os-steve; POST issues/26653/labels skip-changeset) + this os-dev-report comment via post-stamped.mjs; git push not counted",
      "open_questions": [
        { "question": "fleet-patrols.yml header lines 22-25 still say the one-sided cron shapes are 'red nowhere'; after this PR the watchdog reds them. Who edits the governed (Tier H) workflow prose?", "options": ["A fold a one-line pointer to clause 7 into the next governed fleet-patrols.yml PR (e.g. seat 2's #26071 wave)", "B leave the sentence; the watchdog docblock is the authority"], "recommendation": "A, because the workflow comment is what the next cadence editor reads first, and it now tells them the opposite of the truth; it needs no card of its own." }
      ],
      "out_of_scope_findings": [
        "class: none (unrun drift) · PATROL_SCHEDULE env restates two crons (:515 watchdog, :983 release-coverage), a third spelling clause 7 does not pin; the workflow already flags it as 'Two readers, one fact' · carrier: none — noted in PR Acceptance notes",
        "class: none · two jobs naming the same cron (double run) is not pinned; card asked for orphans only · carrier: none — noted in PR Acceptance notes"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26653 comment 6441181277 · domain:skills#1 · 2026-10-27T11:52Z · ready + auto-merge armed (not governed).

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:skills#1 · session_01ADHkmSrRBdu9MdC6fc33Uu · 2026-10-27T12:11Z — PR #26653 merged through the queue (merge commit 86ae47e13); the card closed by its Fixes line; pm:dispatched stripped in this act.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions