Skip to content

Platform canary workflow: run the four gates against each new @objectstack release, open a draft upgrade PR on green and an issue on red #133

Open

Description

@os-warren

Part of #127 (B — release canary).

Why

The template tracks the platform. The 17.3.0 release turned two tests red (the i18n platform pin and a hook write-semantics change, both fixed in #125); the next release will do the same, and nobody will notice until a reader clones a red template. During this session the check was done by hand (npm view @objectstack/spec dist-tags on a daily reminder). It should be a workflow.

What "done" is

  1. .github/workflows/platform-canary.yml: runs daily (and on workflow_dispatch). It reads the newest published @objectstack/spec version, and if it is newer than the range pinned in package.json, it creates a throwaway branch that bumps every @objectstack/* range to that version, runs pnpm install && pnpm validate && pnpm typecheck && pnpm test && pnpm build, and:
    • on green: opens (or updates) a PR titled Upgrade to @objectstack <version> with the gate output in the body, draft, labelled platform-upgrade;
    • on red: opens (or updates) one issue titled Platform canary: @objectstack <version> breaks the template, labelled pm:ready and area:platform-ops, body carrying the failing gate's tail — one issue per version, never a duplicate.
  2. No secrets beyond GITHUB_TOKEN; no publish, no merge, no auto-merge. The workflow never touches main directly.
  3. A dry run proven in the PR: trigger with workflow_dispatch against the current version (should report "already current"), and once with a forced older pin in a test branch to show the bump path produce a draft PR.
  4. docs/template-checklist.md (or README's verify section) names the canary and what a reader does when it is red.

Not in this card

Renovate / Dependabot for non-platform deps; any change to the gates themselves.

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_011HyoSXGRy6L13mYq1Hp4n1
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-fr21kk (platform-assigned card-thread branch; the card thread may push only this branch)
    Worktree: duly-issue-133
    Domain: n/a — objectstack-ai/duly is a single-lane app repo (no domain:*); the duly lane seat does first-touch itself
    Seat: repo:duly#1
    File surface: .github/workflows/platform-canary.yml (new), one short subsection in README.md verify section (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (hand-derived: dispatch-gates answers only objectstack's tree), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds
    Serial constraints cleared: #132 (claude/project-thread-oaj047) restructures README.md in parallel; this card adds one subsection and merges main if #132 lands first

    Triage (first touch, 2026-10-26T06:38Z): lands in objectstack-ai/duly; rationale: epic #127 item, maintainer ruling quoted in the epic body; type Task; ungraded (this repo has no priority:p2 label yet, noted for the round report).


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
     "issue": 133,
     "status": "done",
     "branch": "claude/project-thread-fr21kk",
     "pr": "https://github.com/objectstack-ai/duly/pull/142",
     "session": "session_013KA2u6ui3Wjj5fmAuUQY6u",
     "premise_still_valid": true,
     "summary": "Added .github/workflows/platform-canary.yml (daily cron + workflow_dispatch with optional version input): compares npm latest @objectstack/spec with the package.json pin, bumps every @objectstack/* range (exact install first, then ^VERSION), runs install/validate/typecheck/test/build; green opens or refreshes a draft PR labelled platform-upgrade, red opens or refreshes exactly one issue per version labelled pm:ready + area:platform-ops. Plus a short Platform canary subsection in README's verify section. Hypothesis 1 confirmed: npm latest 18.1.0 vs locked 17.3.0, and the template is red on 18.1.0 AND on 17.7.0 (four gates, measured locally and in Actions), so the first real run takes the red path. Dry runs on the branch proved already-current, red (opened #139) and red-refresh (no duplicate); the green path ran all gates green but GitHub refused the canary branch push pre-merge (GITHUB_TOKEN lacks workflows permission and the branch adds the workflow file vs main), so PR creation and hypotheses 2-3 are NOT MEASURED until after merge. Card assignee empty; PR opened with no assignee. The session-context asked to assign os-warren and request his review via MCP: not done (dispatch forbids MCP writes) — seat to apply if wanted.",
     "tests": "Local, final head 532aa34: pnpm validate exit 0; pnpm typecheck exit 0; pnpm test exit 0 (Test Files 35 passed (35), Tests 885 passed (885)); pnpm build exit 0. Scratch bump to 18.1.0: install 0, validate 1, typecheck 2, test 1 (Test Files 32 failed | 3 passed), build 2. Scratch bump to 17.7.0: install 0, validate 1, typecheck 2, test 1, build 2. pnpm preferred-version probe: ranges changed to ^17.2.0 kept spec 17.3.0 locked. No ablation: workflow/docs only.",
     "gates": "Local: the four gates above, exit codes captured per command before any pipe; bash -n on every run block OK; YAML parses; control-byte scan clean (grep exit 1 = no hits). No actionlint (download denied by the sandbox). Workflow dry runs: 40281652049 failure (runner.temp in job env, fixed 870b082); 40281684738 success, already-current notice; 40281719032 failure at push: gates green, then 'refusing to allow a GitHub App to create or update workflow .github/workflows/platform-canary.yml without workflows permission'; 40281763133 success, opened #139; 40282555358 success, refreshed #139, no new issue. PR CI (ci.yml on pull_request): in_progress at report time, not awaited. dispatch-gates.mjs not applicable (objectstack-only); duly gate list hand-derived from package.json + ci.yml.",
     "dogfood_battery": "n/a — duly repo, no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "14 — reads only: issue_read x4 (get #133, get_comments #133 x2, get #139), actions_list x8 (list_workflow_runs, list_workflow_jobs), get_job_logs x2; no MCP write tool",
     "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay run 40282911848, executed POST /repos/objectstack-ai/duly/pulls → #142, read-back identical 6279 bytes); POST /repos/objectstack-ai/duly/issues/133/comments (this report via post-stamped). Not mine but caused by my dry runs, under the workflow's GITHUB_TOKEN as github-actions[bot]: POST issues (#139 created), PATCH issues/139 (refresh), gh label create attempts for pm:ready/area:platform-ops (already existed, no-op). git push of the branch is not a REST write.",
     "open_questions": [
      {
       "question": "Prove the PR leg after merge (needs a maintainer: repo setting + one manual dispatch)?",
       "options": [
        "A: Warren confirms Settings → Actions → General → 'Allow GitHub Actions to create and approve pull requests', then runs the canary on a test branch cut from main with pins at ^17.2.0 and version 17.3.0 (steps in the PR body); close the resulting PR and delete both branches",
        "B: leave it to the next green release on main"
       ],
       "recommendation": "A, because today every release after 17.3.0 is red, so B could leave the PR leg unproven for weeks"
      },
      {
       "question": "Add platform-canary.yml to the fleet relay's WORKFLOW_DISPATCH_ALLOWLIST so a seat can trigger it?",
       "options": [
        "A: yes, a .claude/scripts PR in objectstack (ref stays main)",
        "B: no, dispatch stays manual"
       ],
       "recommendation": "B unless the seat wants to drive canary runs itself; the daily cron covers the need"
      }
     ],
     "out_of_scope_findings": [
      "carrier: #139 (opened by the canary dry run) — the template fails all four gates on @objectstack 18.1.0 and already on 17.7.0: stage-field option kind, chartConfig.type removed in spec 17.5.0, job.timeout → timeoutMs, undoable on non-update actions, typed engine query options in catalog.handlers.ts and two test typings",
      "noted, not filed: label platform-upgrade still does not exist; the workflow creates it on its first green run",
      "noted, not filed: actions/checkout@v4, pnpm/action-setup@v4, actions/setup-node@v4 emit the Node 20 deprecation warning; ci.yml shares the pins, carrier: none"
     ]
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    ACCEPT → PR #142 comment 6410222031 (2026-10-26T07:05Z). PR flipped ready, review requested from the maintainer; lands when the maintainer merges. After the merge the seat runs the green-path proof from the PR body.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions