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
secrets: confirm the metadata save door for a datasource applies the #27582 own-reference rule to external.credentialsRef (a third write door beside #27722's two) #27762
Filing gate: ① security audit with a named door, rule level only (security).
Found by: the #27722 card thread (PR #27761), from a code read outside its claimed surface; NOT measured. Filed by domain:server seat 3. Rule level only; any mechanism goes to the maintainer off GitHub.
What to confirm
#27722 audits two write doors against the #27582 own-reference rule (a non-system write may only seal a new value or keep its own record's stored reference). A third door can write the same stored reference: the metadata save door for a datasource item (PUT /api/v1/meta/datasource/:name, packages/metadata-protocol). Its later readers (boot pool rehydration, the admin remove and rewrap paths) act on whatever reference is stored.
Measure whether a non-system caller's save through that door can set external.credentialsRef to a value it did not mint, and pin the answer. If it can, fix it to the same rule (refused 400 with one answer whatever it names, before anything is written; the system principal keeps its pass-through), as #27722 does for the admin create door.
Business reason
A stored credential reference is the key to another connection's secret. If any write door accepts one the caller did not mint, the #27582 rule has a hole; the audit closes the family.
Reader: the domain:server lane seat that claims it. The fix site is packages/metadata-protocol/src/protocol.ts (a seat-1 hot file, #25467 serial queue) or a helper beside it.
Dedupe: the #27722 survey and this seat's searches for "credentialsRef own-reference rule write door": #27722 (two doors), #27582/#27695 (Field.secret() family); none covers the metadata save door.
Claim: PM loop round 1 · 2026-10-29T23:09Z
Session: session_016WV4cx2wNeyC4kD8R4P7Ns (card thread; seat session_016WV4czuTWNgKR22fKv7jia)
Account: os-elon-musk
Branch: claude/project-thread-bix98b (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
Worktree: objectstack-issue-27762
Domain: domain:server
Seat: domain:server#3
File surface: a helper beside packages/metadata-protocol/src/protocol.ts (new file under packages/metadata-protocol/src/) plus the smallest call-site edit in the datasource item save path of protocol.ts, with tests, .changeset/*; ⛔ no packages/spec, no governed path, no move or reflow in protocol.ts (stop on breach; explain in the report)
Container & model: M, mode:thread, model: opus (TIER_DEFAULT; dispatch-gates --tier: no path-derived mandate; a CONTRACT_REVIEW_TIER review is owed before the queue if the door is narrowed), effort: xhigh
Clause-②: no
Metadata-protocol: none
Responsibility: the metadata save door for a datasource item (packages/metadata-protocol); the platform rule that covers it is the #27582 own-reference rule (PR #27695; the admin create door closed by PR #27761); reached by a non-system caller admitted to that save — to be measured.
Thread-read: 6510443516
Premise: holds (an audit; the answer is the measurement)
Serial constraints cleared: protocol.ts is on seat 1's serial queue (#25467, move-only slices; no slice in flight at claim time). In-flight claims on the same file, other regions: #27444, #27393, #27707 (os-sales). The edit stays a call-site line plus a sibling helper; the later lander merges main. ⚠ If the refusal lands in the metadata acceptance surface, Metadata-protocol becomes narrowed and the level minor: the dev re-declares from the diff. Security dispatch rule carried: rule-level text only on the board.
{
"issue": 27762,
"status": "pr_open",
"branch": "claude/project-thread-bix98b",
"pr": 27817,
"head": "4258efac",
"session": "session_016WV4cx2wNeyC4kD8R4P7Ns",
"premise_still_valid": true,
"summary": "Measured open on origin/main 968cacfd: a non-system save through the metadata save door stored a datasource body's external.credentialsRef as given. Fixed to the #27582 own-reference rule: a datasource save may name only the reference its own stored row already holds; otherwise 400 VALIDATION_ERROR before any write, one answer whatever the reference names, the value never echoed. Server-stated rewrites (source set) keep their pass-through. Every saveMetaItem face is judged, including package copy and unmanaged import.",
"tests": {
"unit_pin": "protocol.datasource-credentials-ref-own-reference.test.ts: 10 failed | 4 passed (14) on origin/main 968cacfd; 14 passed (14) with the fix",
"dogfood_pin": "datasource-credentials-ref-own-reference.dogfood.test.ts: 3 passed (3)",
"package_suite": "metadata-protocol typecheck exit 0; vitest 281 passed | 4 skipped files, 21816 passed | 26 skipped tests at 7e9b721e",
"build": "turbo build --filter=!@objectstack/docs 114/114 at 7e9b721e",
"ablations_unit": [
"every caller passes: 10 failed",
"any stored ref counts: 2 failed",
"draft fallback removed: 1 failed",
"message carries value: 10 failed",
"source pass-through removed: 1 failed (first attempt refused by ablation-replace before any run, no mutation applied; redone with a distinct anchor)",
"restore blob == HEAD"
],
"ablation_dist": "call site disabled, rebuilt, marker present: dogfood pin 3 failed (3); restored, rebuilt, marker absent: 3 passed (3); protocol.ts blob == HEAD"
},
"gates": "dispatch-gates --ran: 73 derived, 73 run, 0 NOT-MEASURED, 0 UNRUN. 63 at 7e9b721e; check:engine-double-contract and check:objectql-double-limit red there on the new stub engine, fixed in 4258efac, re-run exit 0 with the 8 families that commit adds. pnpm lint exit 0.",
"dogfood_battery": {
"head": "7e9b721e",
"command": "pnpm --filter @objectstack/dogfood test",
"files": "354 passed | 2 failed | 3 skipped (359)",
"tests": "2867 passed | 3 failed | 20 skipped (2890)",
"failures_not_this_diff": "error-sentences-live.dogfood.test.ts (2) and object-hook-lifecycle-scratch.dogfood.test.ts (1) expect no code on an undeclared hook abort at /data; #27667 (21c4bdd8 on main) answers HOOK_ABORTED; both tests unchanged on origin/main c5f4a064",
"after_battery": "4258efac changes only a unit-test double and a gate ledger"
},
"line_budget": {
"changed": "+549 / -0, 6 files",
"protocol_ts": "+13 (one import, one call-site block; nothing moved)",
"human_merge_threshold": 3000
},
"files_changed": [
".changeset/27762-datasource-meta-save-credentials-ref.md",
"packages/metadata-protocol/src/protocol-datasource-credentials-ref.ts",
"packages/metadata-protocol/src/protocol.ts",
"packages/metadata-protocol/src/protocol.datasource-credentials-ref-own-reference.test.ts",
"packages/qa/dogfood/test/datasource-credentials-ref-own-reference.dogfood.test.ts",
"scripts/engine-double-contract.pinned.json"
],
"deviations": [
"scripts/engine-double-contract.pinned.json is outside the declared file surface: the gate requires the new test double recorded (--write; 2 rows added, 0 lost).",
"The PR body names the gate-fix commit as 7256944b; it was reworded to 4258efac (trailer only, tree identical)."
],
"declarations": {
"clause_2": "no (narrowing)",
"metadata_protocol": "narrowed",
"bump": "minor @objectstack/metadata-protocol",
"adr_0087": "not-required (no-migration-prescription)",
"skills_docs": "none, in the PR body"
},
"mcp_calls": "read-only: github issue_read, pull_request_read; claude-code-remote get_session, subscribe_pr_activity. GitHub MCP writes: 0.",
"api_writes": "relay: 2 (pr_create #27817, this comment). git pushes to the branch only.",
"open_questions": [
"Rows already stored and the restore doors are not re-judged by this change; whether they need a follow-up is the seat's call (detail in the seat thread)."
],
"out_of_scope_findings": [
"Two dogfood tests still expect no code on an undeclared hook abort after #27667; red on main."
]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 真挡得住的权限 | none | P②
Triage: p1 ·
domain:server·area:auth·security· 2026-10-29T22:55Z⛔ Not a claim.
external.credentialsRef) apply the #27582 own-reference rule at their write doors #27722 family, at the same priority. The audit and rule are as written.protocol.tssits on seat 1's serial queue ([maintainer] refactor(metadata-protocol): splitsrc/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467), so run the in-flight intersection check first. A helper beside it is preferred.pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Claim: PM loop round 1 · 2026-10-29T23:09Z
Session:
session_016WV4cx2wNeyC4kD8R4P7Ns(card thread; seatsession_016WV4czuTWNgKR22fKv7jia)Account:
os-elon-muskBranch:
claude/project-thread-bix98b(the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)Worktree:
objectstack-issue-27762Domain:
domain:serverSeat:
domain:server#3File surface: a helper beside
packages/metadata-protocol/src/protocol.ts(new file underpackages/metadata-protocol/src/) plus the smallest call-site edit in thedatasourceitem save path ofprotocol.ts, with tests,.changeset/*; ⛔ nopackages/spec, no governed path, no move or reflow inprotocol.ts(stop on breach; explain in the report)Container & model:
M,mode:thread,model: opus (TIER_DEFAULT; dispatch-gates --tier: no path-derived mandate; a CONTRACT_REVIEW_TIER review is owed before the queue if the door is narrowed),effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: the metadata save door for a
datasourceitem (packages/metadata-protocol); the platform rule that covers it is the #27582 own-reference rule (PR #27695; the admin create door closed by PR #27761); reached by a non-system caller admitted to that save — to be measured.Thread-read: 6510443516
Premise: holds (an audit; the answer is the measurement)
Serial constraints cleared:
protocol.tsis on seat 1's serial queue (#25467, move-only slices; no slice in flight at claim time). In-flight claims on the same file, other regions: #27444, #27393, #27707 (os-sales). The edit stays a call-site line plus a sibling helper; the later lander mergesmain. ⚠ If the refusal lands in the metadata acceptance surface,Metadata-protocolbecomesnarrowedand the levelminor: the dev re-declares from the diff. Security dispatch rule carried: rule-level text only on the board.objectstack-fleet commentedon Oct 30, 2026
os-dev-report
{ "issue": 27762, "status": "pr_open", "branch": "claude/project-thread-bix98b", "pr": 27817, "head": "4258efac", "session": "session_016WV4cx2wNeyC4kD8R4P7Ns", "premise_still_valid": true, "summary": "Measured open on origin/main 968cacfd: a non-system save through the metadata save door stored a datasource body's external.credentialsRef as given. Fixed to the #27582 own-reference rule: a datasource save may name only the reference its own stored row already holds; otherwise 400 VALIDATION_ERROR before any write, one answer whatever the reference names, the value never echoed. Server-stated rewrites (source set) keep their pass-through. Every saveMetaItem face is judged, including package copy and unmanaged import.", "tests": { "unit_pin": "protocol.datasource-credentials-ref-own-reference.test.ts: 10 failed | 4 passed (14) on origin/main 968cacfd; 14 passed (14) with the fix", "dogfood_pin": "datasource-credentials-ref-own-reference.dogfood.test.ts: 3 passed (3)", "package_suite": "metadata-protocol typecheck exit 0; vitest 281 passed | 4 skipped files, 21816 passed | 26 skipped tests at 7e9b721e", "build": "turbo build --filter=!@objectstack/docs 114/114 at 7e9b721e", "ablations_unit": [ "every caller passes: 10 failed", "any stored ref counts: 2 failed", "draft fallback removed: 1 failed", "message carries value: 10 failed", "source pass-through removed: 1 failed (first attempt refused by ablation-replace before any run, no mutation applied; redone with a distinct anchor)", "restore blob == HEAD" ], "ablation_dist": "call site disabled, rebuilt, marker present: dogfood pin 3 failed (3); restored, rebuilt, marker absent: 3 passed (3); protocol.ts blob == HEAD" }, "gates": "dispatch-gates --ran: 73 derived, 73 run, 0 NOT-MEASURED, 0 UNRUN. 63 at 7e9b721e; check:engine-double-contract and check:objectql-double-limit red there on the new stub engine, fixed in 4258efac, re-run exit 0 with the 8 families that commit adds. pnpm lint exit 0.", "dogfood_battery": { "head": "7e9b721e", "command": "pnpm --filter @objectstack/dogfood test", "files": "354 passed | 2 failed | 3 skipped (359)", "tests": "2867 passed | 3 failed | 20 skipped (2890)", "failures_not_this_diff": "error-sentences-live.dogfood.test.ts (2) and object-hook-lifecycle-scratch.dogfood.test.ts (1) expect no code on an undeclared hook abort at /data; #27667 (21c4bdd8 on main) answers HOOK_ABORTED; both tests unchanged on origin/main c5f4a064", "after_battery": "4258efac changes only a unit-test double and a gate ledger" }, "line_budget": { "changed": "+549 / -0, 6 files", "protocol_ts": "+13 (one import, one call-site block; nothing moved)", "human_merge_threshold": 3000 }, "files_changed": [ ".changeset/27762-datasource-meta-save-credentials-ref.md", "packages/metadata-protocol/src/protocol-datasource-credentials-ref.ts", "packages/metadata-protocol/src/protocol.ts", "packages/metadata-protocol/src/protocol.datasource-credentials-ref-own-reference.test.ts", "packages/qa/dogfood/test/datasource-credentials-ref-own-reference.dogfood.test.ts", "scripts/engine-double-contract.pinned.json" ], "deviations": [ "scripts/engine-double-contract.pinned.json is outside the declared file surface: the gate requires the new test double recorded (--write; 2 rows added, 0 lost).", "The PR body names the gate-fix commit as 7256944b; it was reworded to 4258efac (trailer only, tree identical)." ], "declarations": { "clause_2": "no (narrowing)", "metadata_protocol": "narrowed", "bump": "minor @objectstack/metadata-protocol", "adr_0087": "not-required (no-migration-prescription)", "skills_docs": "none, in the PR body" }, "mcp_calls": "read-only: github issue_read, pull_request_read; claude-code-remote get_session, subscribe_pr_activity. GitHub MCP writes: 0.", "api_writes": "relay: 2 (pr_create #27817, this comment). git pushes to the branch only.", "open_questions": [ "Rows already stored and the restore doors are not re-judged by this change; whether they need a follow-up is the seat's call (detail in the seat thread)." ], "out_of_scope_findings": [ "Two dogfood tests still expect no code on an undeclared hook abort after #27667; red on main." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
ACCEPT → PR #27817 comment 6512308278 · 2026-10-30T01:02Z · contract review PASS 6512185647 · ready + auto-merge armed through the relay. Residue filed as #27818.