docs: close remote credential and private review access findings

This commit is contained in:
jason.woltje committed 2026-10-22 21:06:29 -05:00
1 parent 6345aae3d8
commit 767bb62c7d
4 files changed
+94 -28

No files matched your search

+2
View File
@@ -5374,3 +5374,5 @@ Gander: after Duckworth-0100 design approval with C1-C5, prepared the two host-s
2026-10-23T01:37:55Z | Gyro 571 push guard | identity gyro/purpose push: exit 0 documented degraded-pass CANNOT_ASSERT credential-unresolvable, scratch audit gyro-q195-ci-queue-audit.jsonl; no credential fallback or CI-green claim.
2026-10-23T01:41:59Z | Gyro sage-3121 A1-A3 PRD alignment | Before: 8d209016b adds a current Connections graph, excludes new Markdown stories in converted books and defaults archiveFolder. After: parent/W4 align with PRD1.17 d6 sha256 886b93c571f87bfbb2f27ee3113b6800a32d8f89196d95ace33566031bee380a: clickable editor links only; graph/tests later pending J-b; new different-path Markdown in a converted book remains canon until import, only recreated converted old paths are unmapped; archive folder is human-set in library mapping with no default, missing folder refuses conversion. Static A1-A3/11-brief checks pass; W4 locator/extractor/access/remote/recovery blocks unchanged. Local commit only, push held for Sage's named gap while Gizmoduck holds 270+271 run5. No product/build/browser/worker/queue/live action. Fenton gets local SHA through shared object store.
2026-10-23T01:49:08Z | Gyro fenton-0012 B1/B2 and N1-N6, mos-1379 | B1: off-host remote must deny the real shared jason.woltje seat-helper credential as well as seat identities until #431; private visibility/dummy-token denial is insufficient; W3b/A16/A26 require that future fixture proof. B2 follows mos-1379: human-only editor.agentReadComments and editor.agentReadTrackedDeletions both default false, comment/original/markup reads/resolves/index/context refuse when off; final access remains D9 and no role allowlist/per-document grant. N1 staging-ref allowlist and retained private refused/published audit refs; N2 URLs literal with fidelity-report loss and confirmation; N3 future paths marked new or predecessor row; N4 rename/sharing wording fixed; N5 historical thread text not refreshed; N6 protected VM1012 backup cited in P5. Static checks pass, locator JSON/package/projection mechanics retained. Local commit only; HTTPS push still held for Sage's named gap. No credentials tested/read/printed, no product/build/browser/worker/queue/live action. Fenton gets exact local SHA/blobs.
+1
View File
@@ -1562,3 +1562,4 @@ are never rewritten or removed; corrections are new entries.
2026-10-23T00:52:58Z | Gyro (Codex gpt-6.1-sol, mos-1366/1367) | Vikunja571 Q235-Q237 O2 parent/W4 format-policy rewrite on gyro/editor-o2 | Canonical queue next gyro: nothing. Prepared P1-P6 and B1-B4 docs, baseline W4 import 1ac76a417; no product/build/browser/worker/private-file/queue/live action. Mos impact map fold precedes review/push handoff.
2026-10-23T01:37:07Z | Gyro (Codex gpt-6.1-sol, mos-1368/1372/1375) | Vikunja571 O2 parent/W4 revision complete for review | P1-P6/B1-B4 and A17-A41/Q1-Q16 folded; same-thread Case 2 lookups/support writes, human-set host-pushed off-host remote, Hermes/restore/counting/order/role gates. Static docs checks pass; old locator/projection mechanics retained, authority/access review reopened. No code, build/browser/worker run, private conversion, queue or live action. Direct Fenton/Mos/Sage handoff after push.
2026-10-23T01:41:59Z | Gyro (Codex gpt-6.1-sol, sage-3121) | 571 PRD d6 A1-A3 alignment | Both designs corrected and statically checked; local commit for Fenton in shared repo object store. HTTPS push held for Sage gap, independent review pending. No product, test-slot, queue or live change.
2026-10-23T01:49:08Z | Gyro (Codex gpt-6.1-sol, fenton-0012/mos-1379) | 571 B1/B2 and N1-N6 docs corrections | Real-helper denial gate and two off-by-default human review settings; static acceptance/brief/immutable-mechanics checks pass. Local candidate for Fenton via shared Git objects; no HTTPS push before Sage gap, no runtime or credential experiment.
+54 -15
View File
@@ -40,7 +40,10 @@ under the existing Q223 scopes. W4/W4b and the approved Case 2 PRD remain prereq
DOCX reads. mos-1372 D9 reopens W4: reads through Case 2 lookups use the same live business,
project, universe and source scope as Markdown, in any authorized thread/room. No O2-only
conversation, per-document grant or per-send share gates those reads. D9 is a marked choice
in PRD 1.17 for Jason, not an already approved tool/policy change. No unsaved-draft reader,
in PRD 1.17 for Jason, not an already approved tool/policy change. mos-1379 adds two human-only
settings, both off by default: editor.agentReadComments for comment stories, and
editor.agentReadTrackedDeletions for original/markup views. Final accepted text remains
under D9's ordinary project/universe access. No role-level allowlist or per-document grant. No unsaved-draft reader,
native WordCraft execute/save route or agent proposal that inserts story prose is introduced.
D4. Pins and saved-context records stay on the bus through a reviewed schema change.
@@ -218,7 +221,11 @@ the canonical book manifest's chapter metadata (bounded validated fields plus pr
extension values), with source bytes retained in the archive. type/name/appears_in/relationships
are indexed from that manifest, not lost or read from stale Markdown. DOCX custom properties
may mirror them but are not a second authority. A reviewed importer must cover headings,
emphasis, footnotes, lists, block quotes, scene breaks, raw HTML, embeds and URLs. Use row154's
emphasis, footnotes, lists, block quotes, scene breaks, raw HTML, embeds and URLs. v1 refuses OOXML hyperlinks: the importer emits Markdown URLs as
literal label plus URL text, without w:hyperlink/r:id, and lists the lost click behavior in
the fidelity report for human confirmation. Bare URLs stay literal. Wiki tokens stay exact
and host-clickable. This is an explicitly handled literal mode, not silent hyperlink loss.
If the URL cannot be retained safely as literal text, refuse before archiving. Use row154's
reviewed markdown-it source for the parser plus a first-party AST-to-WordCraft-DOCX adapter;
never rely on WordCraft's measured lossy Markdown importer. Unsupported raw HTML stays an
explicit refusal, never executed. Fixtures cover every construct and independently compare
@@ -319,7 +326,8 @@ have one authoritative archive-prefix value; the library mapping and editor cann
Archive prefixes cannot overlap playground/supporting prefixes. Conversion preserves bytes
and history rather than deleting data, per Mos's PRD reading. No seat retires Hermes or
starts a conversion under this design assignment. The first real conversion of Melanie's books
also requires Jason's recorded go bound to the selected book scope. No agent/tool or ordinary setting/request flag can substitute for these release/go gates. Initial missing/revoked readiness refuses before any archive, conversion commit or catalogue
also requires Jason's recorded go bound to the selected book scope, including mos-1374's protected
manual VM1012 backup before the first real import (a separate human-owned P5 step). No agent/tool or ordinary setting/request flag can substitute for these release/go gates. Initial missing/revoked readiness refuses before any archive, conversion commit or catalogue
mutation. In-flight readiness loss after archive push follows the pending recovery protocol,
never a false no-mutation refusal. Scratch fixtures remain testable in an
isolated store inaccessible to production routes. Design approval never starts conversion.
@@ -378,10 +386,19 @@ mos-1368 C4 / mos-1372 D7 / mos-1375 resolve the Q176 conflict: `editor.remoteUR
human-only setting, default unset. Only the host process pushes; agents never push. The URL
points off the stack host, for example a private Gitea repo. A same-host bare/filesystem or
loopback repo cannot be the default or qualify. A human provisions/selects the private
remote and host-only auth before production opening; neither is created by this design. Only the stack host has its push credential; no seat grant/account/token
can list, fetch, clone, fork or push it. Do not expose its credential/URL through the frame,
remote and host-only auth before production opening; neither is created by this design. Only the stack host has its push credential; no seat credential can list, fetch, clone, fork or push it. Until #431 fixes the current
seat helper routing through jason.woltje (mos-1106), mere private-repo status is insufficient.
Use an off-host instance/account outside both that helper principal's and seat credentials'
reach; a separate instance is the safe option. An owner/org on the existing Gitea is eligible
only if actual helper-based denial proves that jason.woltje has no access. Never treat a
fresh dummy-token refusal as evidence that the real seat helper cannot reach the remote. Do not expose its credential/URL through the frame,
tool responses or logs. Allow only the configured host-owned remote, verified branch and
fast-forward CAS push; refuse object alternates, unexpected remotes and divergence. Each
fast-forward CAS push; allow only refs/heads/writing-published and host-owned
refs/heads/import-staging/<operation-id>. Refuse object alternates, other push targets,
unexpected remotes and divergence. Before publication a refused candidate's staging ref
stays private and ineligible for readers, marked refused in the journal; after publication
keep it as an audit reference to the canonical commit. No automatic remote ref deletion,
force-push or claim that aborted staging commits became current story history. Each
accepted local save commits/publishes immediately; host push follows without a human action.
Receipts distinguish locally committed from off-host synced and expose retry/readback status,
never call an unpushed commit durable. A human-only remote retry deadline defaults 30 seconds;
@@ -389,7 +406,9 @@ failed push preserves local commits and blocks conversion, with a visible pendin
Before irreversible archive push, the staged DOCX commit must already be acknowledged by
the off-host remote. Source archive push uses the separate existing human library writer.
No force push or seat-token fallback. W3b tests remote acknowledgment, outage/divergence,
restart recovery and absence of seat access; W7 proves remote-ready state before archiving.
restart recovery and denial through the actual seat credential-helper route as well as
individual seat identities, without printing/storing credential values. Use an authorized
empty fixture remote for this future gate, never private writing. Failure holds the remote gate; W7 proves remote-ready state before archiving.
The human-set remote covers the DOCX git store/history/manifest. Ordinary Case 2 messages,
run evidence and supporting notes keep their existing approved storage policy; the old W4
private-only/no-backup transcript model is withdrawn. Stack-copy is not a story backup. Deployment/provisioning is separate.
@@ -441,7 +460,7 @@ never edit the story. Resize at most once per animation frame while dragging, te
prevent iframe pointer interception, and call resized at drag end. Before unmount, ask dirty;
no response after the human-configurable one-second default counts as dirty. Navigation,
refresh, sign-out and tab close preserve or warn about uncommitted work. Credential expiry
revokes sharing and blocks saves, retaining the local draft for copying or reauthentication.
blocks human context attachments and saves, retaining the local draft for copying or reauthentication.
D21. Full-feature acceptance uses an invented DOCX with styled headings, footnote reference
and body, a comment anchored to text, tracked insertion/deletion and a section/page layout
@@ -487,10 +506,14 @@ D24. Native WordCraft MCP is not an agent bridge. After W4/W4b and PRD approval,
reader backs Case 2 find/get/search/manuscript/universe lookups in any authorized thread or
room. Standard library_doc_write/delete still write only supporting Markdown. The host
applies existing live project/universe/source-scope checks before every extraction/index hit
and reply; no per-document grant/share or special conversation is required. No raw store
and reply; no per-document grant/share or special conversation is required. The two mos-1379
human settings separately gate comments and original/markup review text; off means refuse
without text, including citation resolution, search/index and context attachments. No raw store
mount/git credential/native execute channel reaches an agent. October 27 Markdown semantics
stay intact; after conversion old source lookups return the conversion record and current
DOCX, with explicit historical archived reads separated. Store access is host code only.
DOCX, with explicit historical archived reads separated. Store access is host code only. Final-view access remains D9; comments require
editor.agentReadComments and original/markup require editor.agentReadTrackedDeletions,
both human-only/off by default under mos-1379. Off refuses without returning review text.
D25. Proposed DOCX citations bind `{business,project,document,commit,blob,part,paragraph,
start,end,textView,quote,quoteDigest}`. Parts are explicit document body, footnote/endnote
@@ -521,7 +544,7 @@ D27. W5 creates read-only flags and cited findings outside the document: Jump to
Dismiss, not Accept/Replace/Apply. No comment node, tracked change, sentence suggestion patch
or metadata insertion is written into a chapter by an agent. Chat can discuss ideas, consistency
and wording, but its text is never passed to the engine as a replacement. “Ask the agent about
this passage” sends only a resolvable committed locator after the sharing gate, never the draft.
this passage” sends only a resolvable committed locator after committed-reader and review-setting checks, never the draft.
Local dictionary replacement remains an ordinary human action, not an agent proposal.
Free chat replaces the old short-item-only M5 premise under Q223. A human-only require-citation
@@ -730,7 +753,7 @@ Services and no fallback I/O. Human local thesaurus lookup/replacement lives ins
reviewed adapter, not a general parent execute channel. Test wrong origins/sources/tokens,
stale generations, document switches, replay, malformed/oversized payloads, dirty timeout,
F6 escape and chat paste isolation. Refuse all disabled I/O/network routes. Test full-feature
DOCX save/reopen, no comments/revision loss, and exact source/wiki preservation on adoption.
DOCX save/reopen, no comments/revision loss, and exact source/wiki preservation on fixture conversion.
CSP tests compare shell/error/redirect headers byte-for-byte and assert only the approved
frame HTML delta, no PDF iframe, no inline bootstrap and no additional CSP source. Repeat
W3b's save-volume/latency measurements through actual embedded typing before release.
@@ -784,11 +807,17 @@ publication to an agent until W4/W4b. Human-only settings with version checks/de
`editor.commitCadenceMs` 0, `editor.saveGroupPauseMs` 2000 and `editor.saveGroupMaxMs` 15000,
`editor.archiveFolder` unset/no default (library mapping), `editor.conversionHumans` owner-only,
`editor.markdownImportMaxBytes` 1048576 (1..16777216 integer),
`editor.remoteURL` unset/off-host-only, `editor.remoteRetryDeadlineMs` 30000 (1000–300000 integer), sharing visible-chip-per-send and require-citation off. UI/CLI use the same backend validation.
`editor.remoteURL` unset/off-host-only,
`editor.agentReadComments` false, `editor.agentReadTrackedDeletions` false, `editor.remoteRetryDeadlineMs` 30000 (1000–300000 integer), sharing visible-chip-per-send and require-citation off. UI/CLI use the same backend validation.
The archive-folder key uses D11's path/collision checks and one canonical library-mapping
value. Validate allowed human IDs and remote destinations against owned projects/host policy;
no setting grants agent story writes or substitutes for release/go authority.
All new keys have UI/CLI default/change/boundary/unknown-key/agent-refusal tests.
The two review-access keys accept booleans only, default false. Test each UI/CLI default,
change and agent-write refusal; original/markup require the tracked-deletions setting,
comment parts require the comments setting, and a comment in original/markup requires both.
Default final-body reads remain available. Disablement invalidates cached review access and
cursor settings revisions; it does not promise erasure of already delivered chat history.
Both save-group keys use D13's bounds and cross-field validation. Test defaults, valid changes,
fractional/nonfinite/out-of-range values, pause > maximum, stale settings versions and agent
write refusals for each key through both interfaces, with prior values preserved on refusal. Migration/restore, grant revocation, tester separation, concurrent repin,
@@ -872,7 +901,10 @@ agent reads/writes, deployment and a relaxed CSP.
### Gate
Independent writer/security review, writing/bus/WebUI tests and G1. No accepted-save receipt
Independent writer/security review, writing/bus/WebUI tests and G1. The off-host remote gate
must prove denial through the actual seat helper credential path and actual seat identities
against an authorized empty fixture remote; a fresh dummy token is insufficient. Keep auth
tracing off and record only access outcomes, never helper output/credential values. No accepted-save receipt
may precede its commit/ref/index. Measure commits/hour, snapshot serialization latency,
served-save latency and git repository
growth over a scripted long-chapter fixture typing session, including pauses, continuous
@@ -912,7 +944,7 @@ A restricted engine and writer are not yet an all-day writing workspace beside p
D10/D16-D22's navigation and clickable editor links, familiar full WordCraft surface, splitter, settings controls, save/sync
status and local right-click/ribbon thesaurus. Two distinct DOCX chapters keep their separately pinned ordinary chat drafts
and cursors; background unread metadata never wakes a run. No remount on chat polls. Test
keyboard divider/tabs, dirty navigation, credential expiry, stale pins, disabled sharing before
keyboard divider/tabs, dirty navigation, credential expiry, stale pins, disabled DOCX context attachments before
W4b and a writer's multi-document fixture session. Full footnotes/comments/tracked changes/
page layout and local synonyms must all save and reopen. A converted chapter appears once; its labelled archive cannot be edited. Test click-through wikilinks split
across formatted runs and unresolved-target refusal. No first-release deferral of those
@@ -1132,6 +1164,13 @@ The source archive and private DOCX repository cannot publish atomically through
`packages/library/README.md`, `packages/writing/README.md`, `packages/webui/README.md`,
`docs/case2/{SETUP-SHEET.md,SURVEY-RUN.md}`.
Path status at stack pin 062646487: library index-build/query modules and tests are created
by C2-05a (row216); guard by C2-06 (217); supporting by C2-01d (283); write by C2-02 (288).
W7 waits for those file-owner handoffs. `packages/cli/src/library.mjs`,
`packages/webui/src/library-http.mjs` and `packages/business/tests/vocabulary.test.mjs`
are new W7 paths, not existing files at that pin. All packages/writing paths are new except
for the serial W3b/W4b handoffs already named; recheck exact filenames on the accepted base.
### What ships
D11/D12's human import and conversion manifest/journal, exact-source archive with converted
+37 -13
View File
@@ -22,7 +22,8 @@ Markdown precursor, under the same production-opening gate as import.
The October 27 release stays Markdown. Production import/new-story opening waits for W4b,
W7, the post-10-27 release, the approved Case 2 PRD/brief amendment, Hermes retirement
(#423 step 5) and configured off-host durability. The first real use on Melanie's books
also waits for Jason's scoped go. All starts are human-only; `library.convert` has no role
also waits for Jason's scoped go and mos-1374's protected manual VM1012 backup before the
first real import, handled by its authorized human operator, not this design seat. All starts are human-only; `library.convert` has no role
grant or agent request path and stays a hard wait unless an approved PRD changes it.
Nothing in this document authorizes conversion, new private story creation or deployment.
Q234's exact frame CSP, mos-1363 and S0 M1–M14 remain unchanged implementation gates.
@@ -30,7 +31,10 @@ Q234's exact frame CSP, mos-1363 and S0 M1–M14 remain unchanged implementation
mos-1372 D9 replaces the prior W4 O2-only-conversation, per-document-grant and per-send-share
requirements for Case 2 lookups. Agents read converted stories through the normal Case 2
lookups in any thread or room under the same live project/universe/source-scope checks as
Markdown canon/playground. They can then use existing supporting-Markdown write tools under
Markdown canon/playground. Final accepted text follows that access. Under mos-1379,
editor.agentReadComments and editor.agentReadTrackedDeletions are human-only booleans,
both false by default. The former gates comment stories; the latter gates original/markup
views. This is two settings, not a role-level allowlist or per-document grant. They can then use existing supporting-Markdown write tools under
Q223. The agent never writes a story/DOCX/archive file. D9 is marked as a choice for Jason
in PRD 1.17 approval; it is design text, not an already approved role/policy expansion.
No code may rely on that changed requirement before the approved PRD and independent review.
@@ -53,6 +57,8 @@ records, always marked and non-canon; default/current queries never opt into it.
source lookup returns a typed conversion record and routes an authorized DOCX read, never
stale Markdown or fake DOCX lines. Historical line cites still verify at commit/blob and
show converted/historical state; archive access alone is not current story authorization.
Pre-conversion text already in thread history is not rewritten/refreshed; its cites verify
against their original commit/blob and show historical/converted state, not the current DOCX.
A Markdown file recreated at a converted old path is unmapped, neither canon nor playground,
excluded from lookups and flagged to the human. A new Markdown story at a different path in
a converted book stays canon until import, flagged and offered for human import; no automatic
@@ -60,7 +66,11 @@ conversion. Existing playground scope rules remain. Clickable DOCX editor links
DOCX graph exists yet. A Connections graph and its tests wait for Jason's J-b answer.
Every conversion runs the pinned extractor before archiving and refuses unsupported output.
An independently reviewed importer preserves every wiki token and front-matter key; metadata
An independently reviewed importer preserves every wiki token and front-matter key.
The v1 extractor does not accept OOXML hyperlinks: emit Markdown label/URL as literal text
with a fidelity-report entry for lost clickable behavior, never w:hyperlink/r:id. Bare URLs
stay literal; wiki links stay exact and host-clickable. Unsafe/unrepresentable URLs refuse.
This handled literal mode is explicitly confirmed before archive push; metadata
moves to the canonical manifest (type/name/appears_in/relationships feed the index). Links
resolve across Markdown/DOCX through owned aliases, not host paths. A lost link fails the
fidelity report. Plain links/front-matter values resolve or raise R4; unresolved chapter
@@ -236,7 +246,7 @@ extractor supports them; never guess equivalent namespaces.
| body | word/document.xml | main | final by default; existing project/universe access |
| footnote | word/footnotes.xml | w:footnote/@w:id | own story; same project/universe access as its document |
| endnote | word/endnotes.xml | w:endnote/@w:id | own story; same project/universe access as its document |
| comment | word/comments.xml | w:comment/@w:id | explicit part request; same project/universe access |
| comment | word/comments.xml | w:comment/@w:id | explicit part request plus human comments setting; same project/universe access |
| layout | word/headerN.xml, word/footerN.xml (N positive decimal) | none | denied in v1 |
| supporting | separately declared non-story document | separate identity | C2 tools/scopes only; no DOCX scope inheritance |
| opaque | media, styles, numbering, theme, fonts, custom XML, embedded objects | none | no raw bytes through O2 reader |
@@ -307,9 +317,12 @@ kind paragraph-mark-insert or paragraph-mark-delete with its revision ID;
it never becomes a whole-paragraph deletion span. A mark-only insertion's
text stays in original; a mark-only deletion's text stays in final. Inline
run revisions remain independent. No view edits or accepts/rejects changes.
Original/markup and comments are explicit view/part requests under the same project/universe
authorization; no per-document grant is added. A default final-body read never silently
includes deleted revisions or comment stories. Revision author/date metadata
Original/markup require editor.agentReadTrackedDeletions=true; comment stories require
editor.agentReadComments=true. Both are human-only and false by default (mos-1379); a comment
in original/markup needs both. Check them in addition to ordinary project/universe access,
refusing with editor-access-refused and no text when off. No role-level allowlist or
per-document grant is added. A final-body read stays available and never silently includes
deleted revisions/comments. Human editor review/save remains full-featured and unaffected. Revision author/date metadata
is omitted from agent responses in v1.
Closed story/run leaf table (all names in w namespace unless stated):
@@ -520,8 +533,10 @@ free chat plus optional checked line/DOCX citations under requireCitation. No pe
export grant or O2-only session is a hidden prerequisite.
The cursor authority revision is the server's current project grant, universe/mapping/scope
revision and format-publication generation for the bound caller/session. It contains no
sharing human or writing_access_events/writing_shares sequence. Recheck before every page,
revision, the two human review-settings revisions and format-publication generation for
the bound caller/session. It contains no
sharing human or writing_access_events/writing_shares sequence. Check the review settings before every part/view/citation/search/index/context attachment,
not only on first open. No request boolean can enable them. Recheck before every page,
resolution, index hit and message insertion. Scope revocation and format changes invalidate
cached authorization; metadata for missing/foreign IDs uses the same refusal as before.
@@ -540,10 +555,19 @@ remain on the bus through their reviewed schema, with no share-token authority l
`editor.remoteURL` is a human-only setting, default unset. No same-host bare/filesystem/loopback
remote is the default or qualifies as off-host durability. The human selects an off-stack-host
private destination (for example private Gitea) and separately configures host-only auth.
Until #431 corrects the real seat helper's shared jason.woltje credential route, the remote
must be on a host/account that principal and all seat credentials cannot reach; private
visibility alone proves nothing. Prefer a separate off-host instance. An existing-instance
owner/org qualifies only after denial through the actual helper credential path proves no
jason.woltje access. W3b tests that real helper route and seat identities against an authorized
empty fixture remote, without printing/logging credential values; no dummy-token substitute.
Only the host process pushes. No seat token can list/fetch/clone/fork/push the writing repo,
no seat gets its credential, and no raw Gitea grant or store mount is created. Validate the
owned remote, TLS/host policy and off-host storage identity; reject URL userinfo, unexpected
remotes/object alternates and non-fast-forward updates. No silent fallback or force push.
remotes/object alternates and non-fast-forward updates. Allow host pushes only to refs/heads/writing-published and
refs/heads/import-staging/<operation-id>. A refused candidate retains a private non-reader
staging ref and journal status; after publication the staging ref stays as an audit link.
No automatic deletion or force-update of staging refs. No silent fallback or force push.
Every writing-store commit pushes there. Agents read the local publication immediately;
receipts/UI distinguish local commit and remote pending/failed/synced. Missing remote blocks
@@ -599,7 +623,7 @@ These are required future fixture gates, not implementation results.
| A03 | XML ID absent/duplicate and ordinal behavior | missing/mismatched paraId cannot silently choose another node |
| A04 | Emoji, combining characters, tabs, breaks and split runs | UTF-16 offsets, normalization and whitespace collapse fail |
| A05 | Literal split-run wiki forms retained | no path/URL fetch; malformed/cross-paragraph tokens stay text |
| A06 | Final/original/markup independently verified with moves/deletions | default final-body request cannot silently include deletion/comment stories; explicit part/view is separate, no document rewrite |
| A06 | Final/original/markup independently verified with moves/deletions; review settings off by default | final read succeeds; original/markup or comment request/resolve refuses until matching human setting, both needed for original comment; no document rewrite |
| A07 | Body/note/endnote/comment exact ownership | orphan/dangling/cross-document references and duplicate IDs refuse |
| A08 | Package allowlist, aliases, CRC, XML/ZIP limits | external rel, macro, traversal, symlink, entity, ZIP bomb and timeout refuse |
| A09 | Commit snapshot and publication ordering | next latest after Saved gets new commit; no worktree/draft fallback |
@@ -609,7 +633,7 @@ These are required future fixture gates, not implementation results.
| A13 | Selection chip points only at committed text; ordinary lookup authority independent | draft mapping refuses; missing chip does not deny an authorized lookup |
| A14 | Normal project/universe/source-scope checks in every thread/room | pin, guessed ID, foreign universe and revoked holder cannot grant access |
| A15 | Latest after acknowledged save; explicit historical cite stays immutable | chip/per-send snapshot cannot force stale latest results |
| A16 | Host-only store and remote credentials; checked reader routes only | no worker store mount, arbitrary git/engine access or seat remote token |
| A16 | Host-only store and remote credentials; checked reader routes only | no worker store mount, arbitrary git/engine access or seat remote token; actual seat helper credential denied, not just a dummy token |
| A17 | Existing Case 2 message/transcript policy | no O2-only/raw-session backdoor that skips existing thread/project checks; no false erasure promise |
| A18 | Reader/resolve/flag plus existing Case 2 lookups/supporting writer after gates | native MCP, execute, save, replacement and story comment writes refuse |
| A19 | Unconverted/support Markdown unchanged; converted path returns record and DOCX | no stale archive as chapter or DOCX-as-lines; historical line cite verifies by old commit/blob |
@@ -619,7 +643,7 @@ These are required future fixture gates, not implementation results.
| A23 | Sibling chapter save | currentCommit/stale/cursor for untouched document remain unchanged |
| A24 | Full page and oversized paragraph | end before overflow; first oversized row refuses without text; no unreachable subrange claim |
| A25 | Every read/write/tool surface uses existing Case 2 isolation | same document ID across business/universe or replayed cursor refuses |
| A26 | Host-only off-host remote and per-save push | unset/local-only/unexpected remote refuses opening; push outage visible, local next lookup still fresh |
| A26 | Host-only off-host remote and per-save push | unset/local-only/helper-readable/unexpected remote refuses opening; real helper denial tested; push outage visible, local next lookup still fresh |
| A27 | Conversion restore accounting and durable journal reconciliation | pre-conversion --restore loses counted row but cannot revive Markdown; no lost-event concealment |
| A28 | Reopened M1 supports same-thread DOCX-read then supporting-note write | any room/project-authorized caller works; no per-document/share token; story/archive write refuses |
| A29 | Readiness is reviewed runtime/extractor plus approved PRD, not caller fields | no request/go/setting can assert release or Hermes retirement |