Skip to content

Commit 8faa2fe

Browse files
committed
docs(citations): qualify ADR-0057 D10 as the framework's numbering at seven sites (#5202)
`server enforces, client is courtesy` was cited at seven live source sites as a bare `ADR-0057 D10`. The substantive claim is correct and survives unchanged; what was missing is the FRAMEWORK QUALIFIER. In this repository the bare string resolves to docs/adr/0057-console-ai-chat-one-conversation-docked.md — a document about console AI chat docking, which contains no D10 at all and is the one a reader greps first. The intended anchor is the framework's ADR-0057, whose D10 decides "Setup-nav surfacing follows the capability (ADR-0029 K2); the object stays open" and is scoped to nav / app-metadata visibility. Each site now carries the disambiguation the two authorities in this repository already ship — docs/adr/0036-field-conditional-rules.md:91 and packages/core/src/evaluator/fieldRules.ts:38 — rather than a third phrasing. Three sites are left byte-untouched, all three already correct: packages/data-objectstack/src/appAccessProbe.test.ts:25 (a verbatim quotation of the objectstack#8013 ruling, and about the capability/nav gate that D10 really does decide), plus the two authorities above. docs/adr/** is a governed surface and is not touched. Comment text only — `git diff -U0` carries zero non-comment added or removed lines. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012u2pRjcqAYtoEjgr3wwhnK
1 parent 6c6cee7 commit 8faa2fe

8 files changed

Lines changed: 53 additions & 15 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
---
3+
4+
Traceability only — this publishes nothing, declared explicitly with an empty frontmatter
5+
rather than left undeclared. The change is comment text at seven live source sites; no
6+
executable line moves, and `git diff -U0` carries zero non-comment added or removed lines.
7+
8+
`server enforces, client is courtesy` was cited at those seven sites as a bare
9+
**`ADR-0057 D10`**. The substantive claim is correct and is unchanged here; what was missing
10+
is the **framework qualifier**. In this repository the bare string resolves to
11+
`docs/adr/0057-console-ai-chat-one-conversation-docked.md` — a document about console AI chat
12+
docking, which contains no `D10` at all and is the one a reader greps first. The intended
13+
anchor is the *framework's* ADR-0057, whose D10 decides *"Setup-nav surfacing follows the
14+
capability (ADR-0029 K2); the object stays open"*.
15+
16+
Each site now carries the disambiguation already shipped by the two authorities in this
17+
repository — `docs/adr/0036-field-conditional-rules.md:91` and
18+
`packages/core/src/evaluator/fieldRules.ts:38` — rather than a third phrasing:
19+
`the framework's ADR-0057 D10 — framework numbering; this repo's own ADR-0057 is an
20+
unrelated document`.
21+
22+
Three sites are deliberately left byte-untouched, all three already correct:
23+
`packages/data-objectstack/src/appAccessProbe.test.ts:25` (a verbatim quotation of the
24+
objectstack#8013 ruling, and about the capability/nav gate — the one family D10 really does
25+
decide), plus the two authorities above.

‎packages/app-shell/src/views/RecordDetailView.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,9 @@ export function RecordDetailView({ dataSource, objects, onEdit, objectNameOverri
10561056
// a record the user may only read: the form opened, the user retyped a
10571057
// field, and the server rejected the save with a 403. Ask the explain
10581058
// engine for the row-level verdict (fail-open; the server stays the
1059-
// authority per ADR-0057 D10) and fold it into the same affordance gates.
1059+
// authority per the framework's ADR-0057 D10 — framework numbering; this
1060+
// repo's own ADR-0057 is an unrelated document) and fold it into the same
1061+
// affordance gates.
10601062
const recordWriteAllowed = useRecordEditable(
10611063
objectDef?.name,
10621064
pureRecordId,

‎packages/app-shell/src/views/studio-design/PackageOwdOverviewPanel.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,11 @@ export interface PackageOwdOverviewPanelProps {
8585
publishNonce?: number;
8686
/** Notify the surface so its pending-changes counter refreshes after a save. */
8787
onDraftSaved?: () => void;
88-
/** Courtesy gate: read-only packages render badges only (ADR-0057 D10). */
88+
/**
89+
* Courtesy gate: read-only packages render badges only (the framework's
90+
* ADR-0057 D10 — framework numbering; this repo's own ADR-0057 is an
91+
* unrelated document).
92+
*/
8993
readOnly?: boolean;
9094
locale: SupportedLocale;
9195
/** Object to scroll to / highlight (deep-link from the permission matrix badge). */

‎packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,11 +423,12 @@ export function StudioDesignSurface({ aiSlot }: StudioDesignSurfaceProps): React
423423
const tab = params.tab ?? 'interfaces';
424424
const locale = useMetadataLocale();
425425

426-
// Courtesy gate (ADR-0057 D10): a read-only code/installed package refuses
427-
// authoring server-side (ADR-0070), so don't let the user build up doomed
428-
// local edits first — disable the authoring affordances up front. Unknown
429-
// writability (fetch failed / still loading) stays ungated; the server gate
430-
// remains the authority either way.
426+
// Courtesy gate (the framework's ADR-0057 D10 — framework numbering; this
427+
// repo's own ADR-0057 is an unrelated document): a read-only code/installed
428+
// package refuses authoring server-side (ADR-0070), so don't let the user
429+
// build up doomed local edits first — disable the authoring affordances up
430+
// front. Unknown writability (fetch failed / still loading) stays ungated;
431+
// the server gate remains the authority either way.
431432
const [pkgWritable, setPkgWritable] = React.useState<boolean | null>(null);
432433
React.useEffect(() => {
433434
let cancelled = false;

‎packages/plugin-detail/src/useRecordEditable.test.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
* the row-level verdict instead.
1717
*
1818
* Every uncertainty must fail OPEN — a courtesy hint may never be the reason a
19-
* permitted user cannot act. The server is the authority (ADR-0057 D10).
19+
* permitted user cannot act. The server is the authority (the framework's
20+
* ADR-0057 D10 — framework numbering; this repo's own ADR-0057 is an
21+
* unrelated document).
2022
*/
2123
import * as React from 'react';
2224
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';

‎packages/plugin-detail/src/useRecordEditable.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
* sharing rule sits inside an object the user may otherwise create and edit
1414
* freely — so the header offered a primary "Edit" CTA that opened the form, let
1515
* the user retype a field, and only then bounced with a 403. The server is the
16-
* authority (ADR-0057 D10) and stays so; this is the courtesy check that stops
17-
* the UI from inviting a write it knows will fail.
16+
* authority (the framework's ADR-0057 D10 — framework numbering; this repo's
17+
* own ADR-0057 is an unrelated document) and stays so; this is the courtesy
18+
* check that stops the UI from inviting a write it knows will fail.
1819
*
1920
* The answer comes from the explain engine's record-grained verdict
2021
* (`POST /api/v1/security/explain` with a `recordId`, ADR-0090 D6 / ADR-0095

‎packages/plugin-grid/src/hooks/useRecordCrudVerdicts.ts‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@
4141
* SPA origin where the cookie doesn't reach the API: the row's verdict is
4242
* `undefined` and the caller keeps the OBJECT-level answer, i.e. exactly what
4343
* this list rendered before this hook existed. The server is the authority
44-
* (ADR-0057 D10) and stays so; hiding a capability on missing data would be a
45-
* worse defect than the wasted click this fixes, and it is the same posture
46-
* `useRecordEditable` takes for the detail header.
44+
* (the framework's ADR-0057 D10 — framework numbering; this repo's own
45+
* ADR-0057 is an unrelated document) and stays so; hiding a capability on
46+
* missing data would be a worse defect than the wasted click this fixes, and
47+
* it is the same posture `useRecordEditable` takes for the detail header.
4748
*
4849
* The probe rides the host's AUTHENTICATED fetch (`SchemaRendererProvider`'s
4950
* `apiFetch`) rather than the bare global one: a bearer-token session carries

‎packages/react/src/hooks/useCapabilityGate.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
*
2525
* **Fail-OPEN when unknown.** No runner, no user, no `systemPermissions` array:
2626
* the action shows. Unknown is not denied, the server is the authority
27-
* (ADR-0057 D10), and hiding a permitted user's button on missing client data
28-
* is the worse failure. An EMPTY array is not unknown — it means "holds
27+
* (the framework's ADR-0057 D10 — framework numbering; this repo's own
28+
* ADR-0057 is an unrelated document), and hiding a permitted user's button on
29+
* missing client data is the worse failure. An EMPTY array is not unknown —
30+
* it means "holds
2931
* nothing" and gates normally.
3032
*/
3133

0 commit comments

Comments
 (0)