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
[finding] board-snapshot is red on every run: the archive holds 59 open (113 total) issues GitHub no longer shows. Restore them or record them in gone.json #22999
Every scheduled board-snapshot.yml run is red at its last step, "Fail the run if the snapshot did not read the board, or the archive is behind it". The cause is board-snapshot exited 2, which means a failed count check. Latest run: https://github.com/objectstack-ai/objectstack/actions/runs/38225529983 (2026-10-12 08:45 UTC). board/manifest.json on board-archive reads:
The snapshot step has exited 2 on every run I sampled (the six scheduled runs from 2026-10-10 20:22 to 2026-10-12 02:46 UTC). The red gate never got to fire, because from 2026-09-19 onward every scheduled run was cancelled inside "Upload the archive to R2": it hit timeout-minutes: 15 while re-uploading all ~41k objects. A cancelled run shows grey, not red. #22930, merged 2026-10-12, makes the R2 step upload only changed objects (274 objects and about 1 minute on the 08:45 run, plus the first daily tarball since 09-19). Now the step after it runs, and the count check is visible for the first time.
What the surplus most likely is: records GitHub no longer shows
Comparing archive counts with GitHub search counts, both on 2026-10-12:
archive (manifest.json)
GitHub search
difference
open issues
169
110
59
closed issues
9,828
9,774
54
total issues
9,997
9,884
113
If the surplus were only stale state (closed on GitHub, still marked open in the archive), the totals would match. They are 113 apart. So about 113 issues the archive holds are no longer visible on GitHub, 59 of them archived while open. That fits the case this workflow was built for: content destroyed along with a suspended fleet account (see the header of board-snapshot.yml and #17390). One caveat: search counts exclude hidden content, so measure the list before deciding anything.
To decide (maintainer)
List the numbers. Compare the archive's issue records (board/issues/N.json on board-archive) against the live API: a 404 or 410 means gone, closed means only stale state. Record the list here.
For each gone number, choose one:
restore: node scripts/pm/board-snapshot.mjs --restore=N prints a recreate payload for a seat to post.
accept as gone: add it to gone.json, which is the only way the count check goes quiet.
Until one of these is done, every run (4 a day) stays red. The archive branch and the R2 copy are still written on each run, so nothing is being lost meanwhile.
Triage: first grade, tooling · priority:p2 · domain:skills · area:devpath, into pm:queue for step 1, the list. Steps 2 and 3 follow from it
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-12T09:22Z. ⛔ Not a claim, ⛔ not a dispatch.
Why it enters the queue: this is tooling (scripts/pm/board-snapshot.mjs, PM tooling, domain:skills). The maintainer filed it and directed the work, which exempts it from the queue-entry lines.
The seat measures and records the list on this card. For every number the archive holds as open, plus the closed surplus, it reads the live API: 404 or 410 means gone, and a state difference means stale. It is read-only. ⛔ No restore and no gone.json entry in this step.
Then the card moves to the decision box with a 「维护者速读」 and one question: restore the gone numbers (--restore=N), or record them as gone. The seat recommends one letter, with the count and a sample of titles.
Those 59 (destroyed plus transferred), and only those, are recorded in board/gone.json on board-archive (commit 9efc902), one row per number with its reason. The count check subtracts the ledger's size, so listing anything beyond the real surplus would hide the next disappearance.
Activity
objectstack-fleet commentedon Oct 12, 2026
Triage: first grade,
tooling·priority:p2·domain:skills·area:devpath, intopm:queuefor step 1, the list. Steps 2 and 3 follow from itTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-12T09:22Z. ⛔ Not a claim, ⛔ not a dispatch.tooling(scripts/pm/board-snapshot.mjs, PM tooling,domain:skills). The maintainer filed it and directed the work, which exempts it from the queue-entry lines.gone.jsonentry in this step.--restore=N), or record them as gone. The seat recommends one letter, with the count and a sample of titles.scripts/pm/board-snapshot.mjsandboard-archive(domain:skills); rationale: PM tooling, maintainer-directed.hotlong commentedon Oct 12, 2026
Maintainer decision: accept as gone (do not restore).
I checked each of the 65 archived-open issues the live board no longer lists against the API on 2026-10-12:
sys_user.manager_idnow carries two independent organization screens, in two packages, with no shared code #11286,manifest.integritydeclares per-file artifact digests the spec says the runtime re-verifies at unpack — nothing computes them and nothing checks them #11331,manifest.permissionsis live on its LEGACYstring[]arm only — the structuredPluginPermissionsSchema(services / hooks / network / fs) has zero readers, and new code is told to prefer it #11333, INotificationOutbox has no cancellation, andack()on an unclaimedpendingrow silently succeeds in both implementations #11453, The Clone dialog for a permission set now offers five raw JSON blobs as editable inputs —defaultFromRowhas no non-editable carry-over #11753, Amulti: truehook that writes the SAME key with per-row VALUES still applies one row's value to every matched row — the residue #14099's key-set refusal deliberately leaves open #14744,action-governance-scope-divergence.test.ts's prose describes the C4 boundary as still open after #15252 closes it — a reader trusting it could revert the fix #16613, [finding] Ruling A on #16231 narrowsIScopedObjectRepository, butctx.api.object(name)resolves through the CLASSObjectRepository— the hook-facing door keepsPromise<any>, andupdateByIdkeeps it too #16786, [finding]check-adr-0087-registration'stype-surface-onlycategory is unclaimable by the class it was built for: TWO predicates refuse it whenever the narrowed declaration lives inpackages/spec/src/contracts/**#16787,retiredFromLoadPath: truedoes not keep a conversion off any load path — three runtime seams replay every retired entry withincludeRetired: true, andapply.tssays onlymigrate metadoes #16864, [finding]FieldSchemarefusesnotNull/not_nullby prescribingrequired— the one key ADR-0113 says is NOT a column constraint — while the correct sentence is reachable only fromstorageNotNull, a spelling nobody writes #16867, [finding] packages/cloud-connection/vitest.config.ts carries #16189's defect verbatim — "Notestblock" and "this file's only effect the alias above" are both false there too #16917, analytics:POST /analytics/dataset/querynever Zod-parses itsselectionat the door, so a malformed member reachesdataset-executorunrefused — the sibling routes lift the same failure to a 400 #17058, Phase 1b of #11333: make the registered granted-permission set actually REFUSE — the ADR-0025 materialize seam that gives each plugin its own SecurePluginContext #17147, Reading needed from the cloud side: canArtifactKernelFactoryserve an artifact that declaresgrantedPermissionsbut carries NOpackagesarray? #17148, driver-memory: the stored-ARRAY value axis is still unrepaired outside the equality arm — $in/$nin, the text family and the ordering family answer one filter two ways, and the two exclusion arms answer it in the WIDENING direction #17286, driver-memory answers a text operator over a DECLARED temporal column by matching its canonical ISO text — the opposite of #15683's declared-type answer, and the existing pin passes for the wrong reason (a millisecond mismatch) #17348, [finding] post-stamped stamp contract is one-way on long-lived bodies: a bare stamp inside a quoted span can neither stay nor be declared, so the artefact can never take a now-token write again #19238, sys_user: declare a set_user_manager row action posting the admin set-user-manager endpoint (moved from objectui#9361; objectstack#16678 Phase 2, ruled) #19249, [finding] the hand-over rule 「Served-tier:takes a bareN/M」 is WRONG and would be refused — the checker requires the constant's NAME, withN/Monly as an optional prefix #19309, [finding] the REST proxy appends its footer to EVERY PR-body PATCH, so a body that already carries one comes back with two — the remedy is to PATCH the body with the footer STRIPPED #19336, feat(spec):ISecurityServicegains the effective-object-permission reader — thepackages/spechalf of objectstack-ai/objectstack#18783, split out under 强制条款② #19354, [reading request from domain:spec] Re-measure thePluginCapabilityManifestSchemacensus on objectstack-ai/cloud — #18623's ruled retirement is STOPPED on it, and no seat with cloud access has taken it #19361, [finding] three sibling list doors carry the same declared-but-never-readlimit/cursorshape that #17667 is retiring on/packages— export jobs, AI conversations and automation runs #19365, spec: declare what an ABSENTscalemeans per numeric field type —percent ⇒ 0— the@objectstack/spechalf of objectstack-ai/objectui#9843 (ruled A′) #19368, [Decision]app/position声明allowRuntimeCreate: true而作者期规则零命中 —— 退役这个声明,还是把规则造出来? #19370, [finding] a{ $field }reference as a$betweenendpoint is refused by the schema door and accepted by the runtime door — the #19071 shape, one endpoint spelling over, already ruled on the schema side #19377, [finding]check-widening-tellsT2 fires on ANY lone quoted string on a contract-source line — no closed-set opener required, so the row asserts "a new member of a closed set" it never measured (7 false tells blocking PR #19314) #19384, [finding]datasourceis a 14thallowRuntimeCreate: truetype with zero liveruntimeTypesdeclarations — invisible to #19275's census because its registry entry is the only MULTI-LINE one #19389, [finding]connector.connectionTimeoutMsis authorable, bounded and defaulted, and nothing reads it — every one of its five non-spec mentions WRITES a hardcoded 30000; and a WHATWG fetch cannot observe the connect phase, so it is not implementable as declared #19410, Document the/meta/typeserased-authoring-input mark on the hand-written metadata API page — the documentation half of #19295 #19415, [finding]check-issue-citationsnever probes a self-qualified citation:buildBoarddrops every qualified row from the probe set whileclassifyCitationresolvesobjectstack#Nagainst that same board — so a valid same-repo number always reports allocated-but-absent #19420, [finding] zod 4.4.3'streeifyErroranderror.format()throw on any issue path containing__proto__— so the formatter crashes on exactly the refusal PR #19147 landed to make that key safe #19421, [finding]check-dts-closure.mjssharescheck-dts-emitted’s manifest criterion, so the post-build sweep is chunk-blind the same way #19443, [finding]check-dts-references.mjsis wired intopackages/speconly — 67 of the 68 builds that run the sibling guard do not run it #19444, [finding]check:skill-examplesspells a PREREQUISITE refusal asexit 1, so--ranreconciliation reads it as a RED #19450, spec(lint): wire the inert runtime-create rules foraction/hook/report/skill/email_template/mapping— six types, one edit (ruling #203/4 group A+C) #19474, reading(spec): which write door governs a runtimetranslationcreate —TranslationItemSchemaandTranslationBundleSchemadisagree (ruling #203/4 group B) #19476, reading(spec): thetoolsuniverse rule can only REMOVE findings — what would a runtimetoolcreate actually be judged by? (ruling #203/4 group B) #19477, [finding] the permission-set publish door derives its zero-row failure reason by ELIMINATION, so an unreadable row and an engine-rejected write are both reported as 'publish carried no owning package' #19481, feat(spec):ISecurityServicegains the effective-object-permission reader — thepackages/spechalf of #18783 (RECONSTRUCTED after the os-sam suspension) #19539, Charter(grading contract): the triage criterion missed ten times across ruling #202 B — each with the card it was measured on (REBUILD of the lost #19494) #19546os lintonce the CLI's flow/screen i18n bucket lands — translate them or record the debt hotcrm#1975, #13469 → RelatedList renders user columns as raw IDs while ordinary lists resolve user names objectui#10112, #14026 → Re-raise of #4375 with the downstream confirmation it asked for: the console import wizard never sendsmappingNameand hardcodeswriteMode:"insert", so a named mapping'supsertcan never reach a user objectui#10102, #14482 → hotcrm: carry the wall-clock unit of the case SLA matrix in identifiers and one test, collapse the four prose warnings to one (app half of objectstack#13801, mechanism B) hotcrm#1974, #14831 → [seam → repo:objectui] RetireDEFAULT_UPGRADE_URL = '/settings/billing'— the app-shell's tolerant default for the entitlement upgrade CTA points at a path no router serves (objectui half of cloud#1869) objectui#10437, #14887 → [repo:objectui] Puredatefields shift one day for viewers west of UTC — '2026-08-01' renders 7月31日 in PDT; the display formatter parses the date-only string vianew Date('YYYY-MM-DD')(UTC midnight) then reads local getters objectui#10110, #14912 → [repo:objectui] Edit affordance is derived from the object-level writeScope only — a user holding a record-leveleditshare (sys_record_share) sees no Edit button while PATCH on the same record succeeds objectui#10107, #15138 → finding(objectui chatbot): detectBuiltAppPackage reads any drafted[] carrying a type:'app' entry as a whole-app build — now also true of an incremental apply_edit that stages the app artifact; the envelope's kind:'edit' is the disambiguator objectui#10109, #15417 → objectstack-ai/cloud#2526, #16127 → [repo:objectui] Master-detail form's batch save sends owner_id on every parent and child operation, so a permitted line edit 403s with "'owner_id' is system-managed" — the list view's inline grid sends only the dirty cell and succeeds objectui#10108, #16519 → hotcrm #1586 step-3 table: annotate thesecurity-owd-aliasrow with its intake scope — the rule is alive but unreachable on adefineStack-authored app (measured in #16109) hotcrm#1973, #17163 → objectstack-ai/cloud#2521, #18377 → [seam -> repo:objectui] the confirm card should send back the IDENTITY of the blueprint it rendered — the runtime's receiving side is already built and is the last gap in the consent gate (cloud#2006) objectui#10438, #18387 → [seam -> repo:objectui] the 80% / 100% storage banner has no renderer — cloud serves the numbers and the verdict, nothing shows them objectui#10439, #18397 → [seam -> repo:objectui] Re-seed / Purge throw the error CODE away —readApiError(payload, res).messagerenders the withheld 5xx constant whileENVIRONMENT_KERNEL_UNAVAILABLEarrives unread objectui#10432, #20787 → [repo:hotcrm] switch hotcrm's vendored half-state patrol to objectstack's composite action pinned to a sha, and delete the vendored copies — hotcrm's half of #18471 (ruling 只做②) hotcrm#1972, #21767 → [finding] spec(ui): anaction:group/action:menumember with an objectparamson a non-apitype passes the component-props gate, and the container drops it at run time objectui#11638records-forms.picklist-org-appendand the "customers append values per organization" promise — the per-organization picklist append is ruled out #22869, finding: a stack'sfunctionsarray accepts two entries authoring onename, andobjectstack buildexits 0 shipping the second under a suffixed name (onmain, not callable after load), wherecomposeStacksalready refuses a duplicate function name #22902, check:platform-checklist is red on main #22924, plugin-audit: a user's own sys_user_preference writes (ui.recent) come back to them as "Updated User Preference 'ui.recent'" inbox notifications — the console bell shows six of them and nothing else #22961, hourly full run: red on main (CI) #22968, write-pace self-test: the lease battery's "children's own starts are that far apart too" case compares two processes' spawn latencies and went red on a loaded runner (149 ms against a 150 ms floor) #22986Those 59 (destroyed plus transferred), and only those, are recorded in
board/gone.jsononboard-archive(commit 9efc902), one row per number with its reason. The count check subtracts the ledger's size, so listing anything beyond the real surplus would hide the next disappearance.Verification run: https://github.com/objectstack-ai/objectstack/actions/runs/38231206449 is green.
board-snapshot exited 0; count checkok: 171 archived open − 112 on the board − 59 in the ledger = 0. R2 synced 101 objects; the 2026-10-12 daily tarball was already present.