Skip to content

skills-sweep ⑥: objectstack-automation (1,163 lines, 4 files) — behavioral-claim verification, content-class execution-first #13793

Closed

Description

@huangyiirene

Member card of program #13658 (published-skills factual sweep). Flight ⑥ target: skills/objectstack-automation/** — 4 files, 1,163 lines, enumerated at origin/main this hour:

  • SKILL.md (995) · evals/approvals/test-revise-loop.md (81) · references/_index.md (44) · evals/README.md (43)

Scope: verify every behavioral claim against the implementation per the program method as BOUND by #13658 comments 5474435934 / 5474464789 / 5475032239 + calibrations 5476328676 / 5476875577 / 5477729758 (content-class first; both error directions; cross-file contradiction scan first; md-vs-generated oracle; "silently / ignored / dropped" as a candidate seed — three flights have measured retired-claim prose outliving the protocol-17 strict-unknown-keys cutover; eval rubrics at FULL weight — the approvals revise-loop eval is a claim carrier).

Constraints: published governed surface — draft PR, human merge, .md content to maintainer review; token-ratchet ceilings unchanged; net line budget at most 0; NOT MEASURABLE recorded in the report. Clause ② CONTENT limb (批 #12): the PR creator attaches needs:contract-review to the PR AND this card in the same stroke the PR exists (both carriers). references/_index.md is generator-owned — verify sync, never hand-edit.

Part of #13658; this card closes with the flight's PR (Fixes).

Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    priority:p1High: required for production / M2
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 31, 2026
  2. huangyiirene commented on Aug 31, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: PM loop round 1
    Session: session_01EnE7G31tqbxN1rqpQmzurT
    Branch: claude/issue-13793-skills-sweep-automation
    Worktree: objectstack-issue-13793
    Domain: domain:skills
    File surface: skills/objectstack-automation/** (stop on breach; explain in the report)
    Container & model: M (claim verification with executed probes — judgment tier), mode:subagent, model: opus — no path-derived mandate on skills/** per this morning's dispatch-gates.mjs --tier posture; tier is the PM's judgment call.
    Clause-②: yes — 批 #12 CONTENT-limb criterion; needs:contract-review attaches to the PR AND this card in the same stroke the PR exists (both carriers); this seat runs the review chain at CONTRACT_REVIEW_TIER at ACCEPT.
    Serial constraints cleared: none — zero open PRs touch skills/objectstack-automation/** (closed/open listings read this hour; flight ⑤'s PR #13777 merged 11:56Z, all other lane faces disjoint). Dispatch-cadence note: sweep drafts are being consumed by the maintainer within ~an hour today (③ 09:46 · ④ 10:43 · ⑤ 11:56), so this dispatch proceeds despite 7 non-sweep drafts pending — recorded as a reasoned reading of the merge-cadence gate, not a breach of it.


    Generated by Claude Code

  3. added
    needs:contract-reviewMarker only — PR awaits its at-tier Contract review PASS; no check reads it, the record decides
    on Aug 31, 2026
  4. huangyiirene commented on Aug 31, 2026

    @huangyiirene
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 13793,
      "status": "done",
      "branch": "claude/issue-13793-skills-sweep-automation",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/13808",
      "premise_still_valid": true,
      "summary": "Flight 6 of the published-skills factual sweep. The card's face premise held exactly: 4 files / 1,163 lines at origin/main (SKILL.md 995, evals/approvals/test-revise-loop.md 81, references/_index.md 44, evals/README.md 43). Swept about 205 behavioural claims against the implementing code and corrected 11 distinct false facts across 12 landing sites (about 5.4% / 5.9% density, top of the 1.5-6% working range). The cross-file contradiction scan paid first, as the method predicted: evals/README.md still advertised the eval as covering 'the signal wait node' while ADR-0044 D3's wait prescription was reversed by its 2026-07-28 amendment and both SKILL.md and the eval file itself already said approval_revise. The 'silently/ignored/dropped' seed found two protocol-17 survivors (a top-level schedule key and a bare next: on a node, both described as silently stripped where FlowSchema/FlowNodeSchema now reject by name). Deader-than-real was again the majority direction: a 3-tier org_membership_level vocabulary that is really 4 (delegated_admin routes), a 6-row trigger-type table missing the record-before-write / record-after-write union, an incomplete decisionOutputs enumeration missing the one runtime-enforced key, and a 'no validator implements it' that three shipped lint rules contradict. The most dangerous single fix is minApprovals: the skill taught 'Default 1' while the quorum runtime defaults to ALL resolvable approvers. One phantom identifier died (503 queue_unavailable, whose only occurrence in the whole repo was that skill line). Draft PR, human merge; needs:contract-review attached to the PR and this card in the same stroke, both read back. Net -24 tokens / -4 lines; no ceiling touched.",
      "tests": "All readings at final head e197523c1 (byte-identical tree to the 1382e479 run that preceded the commit-message amend). Gate families derived from the REAL diff, not recalled: `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` in the fresh worktree -> 14 families, no STALE warning, 'no path-derived mandate' for this surface. Union re-run at e197523c1, exit codes captured before any pipe: check-ci-filter-parity 0 | check-cross-package-test-inputs 0 | check-shard-attestation 0 | check-skills-token-ratchet 0 | check-test-completeness 3 (NOT MEASURED - the gate's own PREREQUISITE-NOT-MET code; it grades a saved turbo test log and this family names it with no argument) | check:doc-formula-expressions 0 | check:agent-test-spelling 0 | check:corpus-claim-drift 0 | check:cross-package-test-inputs 0 | check:doc-authoring 0 | check:pm-governed-merges 0 | check:role-word 0 | check:skill-compatibility 0 | check:skill-frame-sync 0. Card-named extras, same head: check:skill-refs 0 ('9 generated files in sync with packages/spec'), check:skill-examples 0 ('260 prose examples type-check across 3 surface(s)'), check-nul-bytes 0. Two gates were red on first run for a BUILD PREREQUISITE and not a finding, both green after the prerequisite was met: check:doc-formula-expressions needed @objectstack/lint built, check:skill-examples needed @objectstack/client-react built. check:role-word was a genuine red on my first draft - my org_membership_level fix had introduced a new occurrence of the reserved word via a sys_member.role reference; the reference was removed and the gate is green, which is the ratchet working as designed. Every heavy build ran through `bash scripts/pm/os-verify-lock.sh -c ...` with OS_VERIFY_LOCK_SLOT=issue-13793; four locked runs, VERDICT command-exit 0 each, 132-148s held, 0s waited. NON-VACUITY CONTROL (claims proven true by execution, against freshly built dists): normalizeSchedule('0 9 * * *') returns { type: 'cron', expression: '0 9 * * *' } while the cron tagged template's envelope { dialect: 'cron', source: '0 9 * * *' } returns null - both halves of SKILL.md L191-193 confirmed in one run, in both directions; FlowNodeAction.options.length === 20, matching L64 and the four node tables; TimeRelativeTriggerSchema refuses offsetDays+withinDays together AND neither, message 'Provide exactly one of ...' (L771, both error directions); CEL previous.status != 'escalated' && record.status == 'escalated' evaluates true (L717); the os:check-marked defineFlow example (L534-579) parses clean under FlowSchema; approval config defaults observed post-parse as first_response / lockRecord true / admin_rescue / maxRevisions 3 (L604-611). PARSE-THE-SURFACE PROBES that produced the two protocol-17 corrections: FlowSchema.parse with a top-level schedule returns 'Unrecognized key(s) on this flow: `schedule`' plus the guidance prescription, and FlowNodeSchema rejects a bare next: the same way - both were documented as silent strips. CEL probe for the OLD/NEW correction: OLD.status == null, OLD == null and NEW == null each abort with 'Unknown variable: OLD' / ': NEW', never null. Probe files lived in a scratch dir inside the worktree and were deleted BEFORE the gate derivation; the diff contains no probe artefact.",
      "mcp_calls": "9 - issue_read get_comments (#13658, the payload channel serves only the first 15 of its 33 timeline items) | list_pull_requests (mid-flight serial check) | create_pull_request | issue_read get_labels on the PR number (failed with 'Could not resolve to an Issue' - the known PR-side blindness, rerouted to the page read) | issue_write labels on this card | issue_write labels on the PR | search_issues (dedupe for the out-of-scope finding; total_count 6, non-zero, so the session's search is demonstrably alive and the empty-result trap does not apply) | issue_write create (#13809) | add_issue_comment (this report). REST was 403 for this seat on a repo-scoped probe ('GitHub access is not enabled for this session'), so all card and program reads went through the zero-quota public-issue payload channel, and label writes took the read/union/write/read-back fallback instead of the additive endpoint.",
      "files_changed": [
        "skills/objectstack-automation/SKILL.md",
        "skills/objectstack-automation/evals/README.md"
      ],
      "claim_counts": {
        "carriers_counted_mechanically": {
          "table_rows": 78,
          "bullets": 42,
          "numbered_rules": 49,
          "code_fences": 14
        },
        "behavioural_claims_inventoried_estimate": 205,
        "false_distinct_facts": 11,
        "false_landing_sites": 12,
        "density_distinct_pct": 5.4,
        "density_landing_sites_pct": 5.9,
        "not_measurable": {
          "total_estimate": 46,
          "cross_package_runtime_needing_a_booted_kernel": 28,
          "cli_end_to_end_verdicts": 9,
          "studio_designer_rendering": 6,
          "cross_repo_showcase_pointers": 3
        },
        "by_direction": {
          "deader_than_real_capability_hidden": 5,
          "retired_claim_outliving_protocol_17_strict_unknown_keys": 2,
          "phantom_identifier_zero_repo_hits": 1,
          "wrong_default_or_wrong_semantics": 2,
          "cross_file_contradiction_settled_against_the_implementation": 1
        },
        "files_with_findings": {
          "SKILL.md": 11,
          "evals/README.md": 1,
          "evals/approvals/test-revise-loop.md": 0,
          "references/_index.md": 0
        }
      },
      "line_and_token_budget": {
        "package_lines_before": 1163,
        "package_lines_after": 1159,
        "package_lines_delta": -4,
        "package_authored_tokens_before": 13062,
        "package_authored_tokens_after": 13038,
        "package_authored_tokens_delta": -24,
        "SKILL_md_tokens": "12642 -> 12618, ceiling 12643 (headroom 1 -> 25)",
        "evals_README_tokens": "414 -> 414, ceiling 414 (headroom 0, still exactly at it)",
        "ceilings_touched": 0,
        "note": "Additions are paid for by one genuine in-file deletion, listed in the PR body as an in-list budget-offset row: the 7-line restatement of the send-back model in 'Branching, side-effects and rejection' becomes a 3-line pointer at the full section 200 lines above. No fact is lost at package level, and it removes the second copy of exactly the fact whose third copy was the eval index row corrected as item 12."
      },
      "gates": {
        "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, run in the worktree at the final commit; 14 families, no STALE warning",
        "head_the_union_was_run_at": "e197523c1",
        "green": 16,
        "not_measured": 1,
        "red": 0,
        "not_measured_detail": "check-test-completeness exit 3 - PREREQUISITE NOT MET by the gate's own definition, recorded as NOT MEASURED per its own instruction, not as a red",
        "sync_and_population": "check:skill-refs green (references/_index.md generator-owned, never hand-edited, no regeneration needed). check:skill-examples green; population for THIS package is exactly 1 os:check-marked fence (the defineFlow dynamic-approval example in SKILL.md) and zero in the other three files - the diff touches no marked fence, verified with git diff -U0 | grep os:check returning nothing, so the package's contribution to the 260-block population is unchanged.",
        "changeset": "none, skip-changeset applied at PR creation and confirmed on read-back. Convention verified rather than assumed: pure skills/** diff publishing nothing from any package; the changeset-check job in .github/workflows/pr-automation.yml exempts on the label; and the merged predecessor sweeps carry no changeset (597020aa, PR #13777, shipped skills/objectstack-ui/SKILL.md alone)."
      },
      "labels_written": {
        "card_13793": "documentation, domain:skills, pm:dispatched, priority:p1, needs:contract-review - read back complete, nothing stripped",
        "pr_13808": "documentation, size/s, needs:contract-review, skip-changeset - read back complete, nothing stripped",
        "method": "REST additive endpoint is 403 for this seat, so both writes took the MCP read/union/write/compare-read-back fallback. The pre-write read was taken TWICE on the PR and that mattered: the first read saw only size/s, the second (about two minutes later) saw documentation as well, added by the path labeler after creation - a single read would have stripped it."
      },
      "deviations": [
        "No separate claim comment on this card. The PM's claim (comment 5478620644) already carries this seat's session id session_01EnE7G31tqbxN1rqpQmzurT and this exact branch, so a second comment adds no anti-duplication signal - reported here instead of posted, as flight 5 did.",
        "The card arrived with assignees null (the PM-side half-state the contract anticipates). Recorded and worked as normal; this seat never writes assignee.",
        "Two heavy builds beyond the package's own dependency closure were run - @objectstack/lint and @objectstack/client-react - purely to clear PREREQUISITE-NOT-MET on two derived gates so their readings would be real rather than absent. Both through the shared lock.",
        "One claim examined and deliberately NOT rewritten: SKILL.md L96, 'http_request survives only as a deprecation-window alias'. The executor alias really was removed, but the ADR-0087 conversion flow-node-http-callout-rename (toMajor 11) still rewrites the token inside canonicalizeStoredFlow, which registerFlow calls, so an authored http_request does still reach the http node. Alias versus conversion is a mechanism nuance, not a behavioural falsehood, and settling what an author meets end to end needs the boot harness this flight does not have. Recorded as NOT MEASURABLE rather than rewritten on a guess.",
        "Serial constraint re-checked mid-flight rather than trusted from dispatch: 13 open PRs at push time, none touching skills/objectstack-automation/**. The branch fix/automation-skill-engine-contract exists on the remote but carries no open PR."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #13809: packages/spec ApprovalNodeConfigSchema.minApprovals .describe() says 'Default 1' while the quorum runtime defaults to ALL resolvable approvers (config.minApprovals ?? n); only per_group is ?? 1. The describe() text lands in the generated reference docs and in the JSON schema the Studio property form and registerFlow() config validation are built from, so the wrong default is published, not merely commented. Filed unassigned, no label, with both readings laid out (fix the text - recommended, matches the runtime's deliberate ?? n and its own doc comment; or give the key a real .default(1), which is a semantic migration needing a maintainer ruling). Deduped first with one targeted search_issues that returned 6 related-but-distinct results, so the empty-result trap does not apply. This is the SPEC-side source of the same false default corrected on the skill side in this PR."
      ]
    }

    Generated by Claude Code

  5. added
    pm:awaiting-maintainerAwaiting a manual maintainer action — ruling already given; no dispatch, no machine exit
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    needs:contract-reviewMarker only — PR awaits its at-tier Contract review PASS; no check reads it, the record decides
    on Aug 31, 2026
  6. huangyiirene commented on Aug 31, 2026

    @huangyiirene
    CollaboratorAuthor

    ACCEPT — PR #13808; governed md ⇒ parked draft, both approvers requested; contract-review PASS on the PR

    Reviewed against GitHub, not the report: draft ✓ · Fixes #13793 + Part of #13658 ✓ · 2 files changed, both inside the claimed face (SKILL.md, evals/README.md; the generator-owned index untouched with its sync gate green) ✓ · labels on both carriers attached same-stroke, double-read-back, cleared at PASS (trace: PR comment 5479162991) ✓ · budget net −4 lines / −24 tokens, no ceiling touched, the budget-offset deletion declared in-list ✓.

    Spot readings beyond the anchors: the quorum-default correction is the flagship — verified at the runtime (?? n / ?? total), and its spec-side twin (#13809, filed by the dev with a true premise I re-measured at approval.zod.ts:718) hands central triage the upstream source of the same falsehood. The http_request alias-vs-conversion nuance recorded as NOT MEASURABLE instead of rewritten on a guess is the right instrument discipline; the mid-flight check:role-word red on the dev's own first draft, caught and fixed, is the farm working. The "assignees null" observation in the report was a stale zero-quota payload read — the card's assignee was set at claim time and reads back intact; no half-state existed. The skipped second claim comment (PM's claim carries the shared session ID + branch) — accepted, same reasoning as flight ⑤.

    Card → pm:awaiting-maintainer; closes via Fixes when the maintainer merges #13808.


    Generated by Claude Code

  7. removed
    pm:awaiting-maintainerAwaiting a manual maintainer action — ruling already given; no dispatch, no machine exit
    on Aug 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions