Repository navigation
The memory panel cannot say the memory folder was refused, so a refused folder reads as 'nothing saved' - #2105
Conversation
|
@Birfy review request — pull request #2105 at Fixes #2101 (the memory view cannot say the memory folder was refused). 14 files, +295/−47, non-draft, Please review this tip. |
|
Verdict: PASS at b2d5d52 Ran at this tip: Tier T2 (risk-gate report-only, PR #2105). Red first, reproduced exactly as the body claims: with the three touched sources back at the base Scope: compare Checks at this tip: 12 of 13 green (tests-ok, package, judge, merge-gate, reviewed-tip, plugins social/tree/timeline/workflow, agent-audience, risk tier, node 24). The only red is What I read in the diff:
Metadata repaired in the body (no effect on this verdict): the checkpoint had |
Fixes #2101
Written-by: Dev-2
Owner: Dev-2
Reviewer: Reviewer
Claim-Id: 1dcfee666d624428ae95d5d57a0e3185
Branch: dev/2-memory-blocked-empty
Base: 1778add
Tip SHA: b2d5d52
What changed
A refused memory folder and a Bot that never saved anything answered the same view:
entries: [],and nothing else.
folderKind()already knew the difference —real/absent/other, with thepath of the segment that failed — but the read path threw that answer away, so the panel told the
user to save something that could not be saved, and a silent refusal was indistinguishable from a
fresh Bot.
memory-viewgainsblocked: one{ scope, path }per scope the host refused, built from theexisting
folderKind()result (pathis itsat, the folder that failed). Onlyothercounts —absentis the ordinary first-run home and stays out. The field is[]when nothing was refused.entriesis empty andblockedis non-empty, naming the folder and saying it is not a plain directory so it cannot beread. With nothing blocked the copy is byte-identical to today's.
memoryEmptyNotice(view)incore/src/client/memory-empty.js), because the suite has no React renderer: it is testeddirectly, like
bot-row-titleand the board rows.DICTIONARY.zhentry;core/test/i18n.test.jsfails otherwise.Nothing about the refusal itself changed: the same
otherfolders are refused, the same once-per-folderkeeping it emptywarning is still the only host log line, and no permission, entry, summary orarchive behaviour moved.
Red first — base
1778add0, implementation absent, three runscore/test/memory.test.js+core/test/memory-empty.test.js+core/test/i18n.test.js, threetimes: 98 tests / 93 pass / 5 fail, exit 1, identical each run.
#2068: a refused memory folder is named on the memory view, not read as nothing saved (#2101)view.blockeddeep-equals[{ scope: 'own', path: <home>/memory }, { scope: 'team', path: <home>/memory }]; base answersundefined#2101: a plain or missing memory folder blocks nothingview.blockeddeep-equals[]for an empty folder and for a home with nomemory/; base answersundefinedtest/memory-empty.test.js(the file)#2068: every path built from memory/ is one of the reviewed sinksblockedScopes, which base has no function for#2068: every sink has its own probe, and every probe its own sinkThe two behaviour cases came first and are the ones that matter; the last two are the module's own
sink guards, which fire because the base has no
blockedScopesat all. With the implementation:101 tests / 101 pass / 0 fail, three identical runs, exit 0.
The host case also carries its controls: the same linked folder still reads as
entries: [],freshstaystrue, and the folder is still named in exactly one warning, soblockedreports therefusal without changing what the reader answers.
Mutations
blockedScopesanswers[]alwaysblockedis[])blockedScopestreatsabsentas refused too#2101: a plain or missing memory folder blocks nothingmemoryEmptyNoticeanswersnullalwaysEach mutation was run alone on the fixed tree and reverted with
git checkout HEAD -- <file>, so thefield, the
absentdistinction and the notice are each held by a test.Verified on the tree this tip carries
TZ=UTC ARCH_DOCS_BASE=1778add0ace4254ae4d1d5290b980d024bc83de4 npm run verify, exit 0, on theclean tree of the single commit this tip carries (one parent,
1778add0).core 2576/2576,
plugins/social541 (540 pass, 1 skip:social web entry activates under real Cordis once ds-bot provides flybot),plugins/tree127 (126 pass, 1 skip:tree web entry activates under real Cordis once ds-bot provides flybot, and exposes flybot.tree.forest),plugins/timeline135(134 pass, 1 skip:
timeline web entry activates under real Cordis once ds-bot provides flybot),plugins/workflow336,.github/scripts598,interop37,live-e2e24;fail 0in every suiteEach of those three skips is
Cordis 4 not installedon this machine —CORDIS_PATHis unset andsetting
DSH_HARNESSdoes not change it (re-run here just now: one skip,fail 0, per suite). TheTestadvisory for this tip runs with Cordis installed and reports 541 / 127 / 135 withskipped 0: the same totals, no failures on either side.lint: core 73 warnings / 0 errors, plugin lints 36 / 9 / 2 / 16 warnings with 0 errors, interop
1 warning / 0 errors, live-e2e 0 / 0
arch-docs: OK (14 changed file(s))against base1778add0ds-bot-patches.mjs check:ok ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5),ok 10 patches apply cleanly in order,ok core/ equals ds-bot/ + patches/ds-bot/;canonical:ok patches/ds-bot/ is what generate writes (generate is a no-op)— a secondgenerateafter thecommit leaves
git statusemptybuild-client --checkruns insideverifyand exits 0changelog.mjs check: 8 fragments inchangelog.d/are well formed14 files,
+295/−47, one commit, one parent, not a draftThe edits to the existing host, client and test files travel inside
patches/ds-bot/0001-core-fixes.patch; the two new files (src/client/memory-empty.jsandtest/memory-empty.test.js) arepatches/ds-bot/files/mirrors, and the rebuilt bundle ispatches/ds-bot/0008-client-bundle.patch.client.jsis committed, so it was rebuilt withnpm run buildincore/andgeneratewas run after it — the patch products are the generatedones, not hand edits.
Not run
Testworkflow (CI runsverifyitself; nothing here ran on another machine).packagejob's pack check, typecheck and actionlint, and the smoke test —npm run verifydoesnot run them.
is why the decision is a pure helper and the JSX path is a two-line render of its answer.
Scope and limits
the link; that stays out of scope, as the issue says.
nothing else about host paths becomes visible.
blockedis per scope, so a linkedmemory/(which fails above both scopes) names the same foldertwice with
ownandteam; the panel prints that path once.folderKind/readFolder/writeFolder, the entry and summary writers, theonce-per-folder warning,
docs' memory-folder contract except the one sentence that now says whatthe view carries.
Checkpoint
{ "pr": 2105, "claim": "Dev-2", "issue": 2101, "summary": "A refused memory folder answered exactly what a folder that was never written answers, so the panel told the user to save something that could not be saved. memory-view now carries blocked, one { scope, path } per scope whose folderKind() is 'other'; absent, the ordinary first-run home, stays out. A pure client helper turns an empty view with blocked scopes into one line naming the folder above the empty title. An ordinary empty view renders byte-identically to before.", "files": [ "core/src/host/memory.js", "core/src/client/memory-empty.js", "core/src/client/memory-panel.js", "core/src/client/i18n.js", "core/client.js", "core/test/memory.test.js", "core/test/memory-empty.test.js", "docs/subsystems/core-client.md", "docs/subsystems/core-host.md", "changelog.d/2101-memory-blocked-empty.fixed.md", "patches/ds-bot/0001-core-fixes.patch", "patches/ds-bot/0008-client-bundle.patch" ], "checks": { "ran": "TZ=UTC ARCH_DOCS_BASE=1778add0 npm run verify", "result": "green", "at": "b2d5d5266947d6b8a6618a6814c6995a8a851bde" }, "next": "none — ready for the reviewer, and for the Security advisory at this tip" }