knowledge: plugin MCP server registration + retiring a replaced auth gate (2 ingested, 1 merged into pane-delivery-confirmation, 1 corrected) - #80
Open
choiyounggi wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Knowledge flush — 4 insight(s)
Queue drained:
~/.dev-loop/queue/held 4 pending rows across 3 session files.Result: 2 new pages, 1 merge into an existing page, 1 candidate corrected and
folded (its asserted directive did not survive verification).
Verified best-practice
1. A plugin-bundled MCP server missing from
/mcpis a registration fault firstClaim. When a Claude Code plugin's MCP server does not appear in
/mcp, run/reload-pluginsbefore editing any configuration; MCP servers are connected atthe point the plugin layer loads, so a session that predates the install/edit
does not know the server.
Sources checked.
skill's
SKILL.mdtake effect immediately in the current session. Changes tothe plugin's other components, such as
hooks/,.mcp.json,agents/, andoutput-styles/, do not. Run/reload-pluginsor restart Claude Code to pickthose up." Also: "When a plugin updates mid-session, hook commands, monitors,
MCP servers, and LSP servers keep using the previous version's path."
the servers for enabled plugins automatically"; "If you enable or disable a
plugin during a session, run
/reload-pluginsto connect or disconnect its MCPservers."
How verified. Both quotes read from the live official docs this session. The
session's own reproduction matches:
lnpl-mcp0.3.0 was installed, registered inenabledPlugins, and answeredinitializecorrectly when run by hand, yet wasabsent from
/mcpuntil/reload-plugins, which exposed its tools immediately.Confidence: verified.
Sub-claim — both
.mcp.jsonshapes load (a bare map of server names, and thedocumented
{"mcpServers": {...}}wrapper), so the shape is a poor firstsuspect. The docs show only the wrapper; the bare map was verified by direct
observation rather than documentation: in this machine's plugin cache,
context7andplaywrightship a bare map whileclaude-mem,figma, andatlassianship the wrapper, and servers of both shapes are live in thissession (their tools are callable as
mcp__plugin_context7_context7__*/mcp__plugin_figma_figma__*).Confidence: verified (reproducible check, not doc-stated).
2.
.mcp.jsonenv— the queued directive did NOT verify; corrected before ingestQueued claim. "Do not relay a variable the user already exports through
env; a stdio server is a child process, so it inherits the parent environment —use
envonly to inject values the plugin alone knows."What the sources say.
reference stdio client's
getDefaultEnvironment()returns onlyDEFAULT_INHERITED_ENV_VARS(HOME,LOGNAME,PATH,SHELL,TERM,USERon POSIX) whenenvis absent, and a suppliedenvreplaces ratherthan extends that set. An arbitrary exported variable such as
LNPL_IMPLisnot inherited by default in that implementation.
"access to the same environment variables as manually configured servers"; it
does not document full parent-environment inheritance.
Why the session's evidence does not carry it. The cited measurement
(
cwd=/+export LNPL_IMPL→ correctserverInfo) was a manual shell runof the server. That demonstrates shell-to-child inheritance, not what the harness
passes when it spawns the server. The claim is therefore not substantiated
and was not ingested as a directive.
What was ingested instead — verified. From
https://code.claude.com/docs/en/mcp: "If a referenced environment variable isn't
set and has no default value, the config still loads: Claude Code reports a
missing-variable warning for that server in
claude mcp listoutput and uses theunexpanded
${VAR}text as-is." So the real hazard is the opposite of thequeued one: an unset
${VAR}is delivered to the server as the literal string${VAR}rather than failing loudly. The page's directive is to keep theenventry with a
:-default (or assert the value inside the server at startup).Confidence: verified.
3. A send wrapper's success word is not proof the prompt was submitted
Claim. Treat a tmux send helper's exit 0 / "delivered" as "the keys reached
the pane"; confirm submission by reading the pane (empty input line + the
target's working indicator), and press Enter as its own key event when a
[Pasted text #N]placeholder is still in the buffer.Sources checked.
https://man7.org/linux/man-pages/man1/tmux.1.html — already cited by the target
page for the underlying mechanism (the tty echoes independently of the
program's
read();send-keys/capture-panereport nothing aboutconsumption).
platforms-processes-non-interactive-cli-invocationfor why a pasted block'sembedded newline is not a submit.
How verified. Reproduced this session across 3 tmux worker sessions:
send-prompt.shreturned 0/"delivered" for two workers whose panes both sat at❯ [Pasted text #3]/#4unsubmitted, while the run that returned "queued" andwhose follow-up
waitreported pick-up had genuinely submitted.Entersent asa separate key event started both stuck workers immediately.
Confidence: verified (mechanism doc-backed; the harness-specific exit-code
semantics field-reproduced this session).
4. After an auth cutover, a session key with readers and zero writers is the missed route
Claim. Having replaced an authentication mechanism, grep the retired session
key across the codebase and compare read sites to write sites. A key that is
still read but no longer written marks the route the migration missed; the old
gate's "empty config → allow" fallback makes it pass in development and refuse
everyone in production.
Sources checked.
V4.1.5: "Verify that access controls fail securely including when an exception
occurs."
product contains dead code, which can never be executed … The surrounding code
makes it impossible for a section of code to ever be executed." A gate reading
a key no writer sets can only take its own default branch.
Resource with an Insecure Default": "the default is not secure."
— session claims are trustworthy only where the application still writes them.
How verified. All four source texts fetched and quoted this session. The
field incident is reproducible in its own repo: in
chungyak-alimi,/notice/{no}gated onsession["authed"]with no code setting it; withWEB_USERunset the suite was green, and the reproduction test failed(303 ≠ 200) only when parameterized with
WEB_USER=admin.Confidence: verified (principle doc-backed by ASVS/CWE; the read/write census
technique field-tested, with the failing-then-passing test as evidence).
Existing-layer check
Routed via
INDEX.md→ the domain indexes forplatforms,infrastructure, andsecurity, then opened every page whose "load when" overlapped.Pages read: platforms-processes-non-interactive-cli-invocation, infrastructure-agent-orchestration-pane-delivery-confirmation, security-authn-session-vs-token, platforms-tools-version-keyed-artifact-cache
/mcpplatforms-tools-version-keyed-artifact-cacheis the nearest neighbour (a plugin update that keeps running old code) but its trigger is a stale version-keyed cache directory, not a server that never registered. Grep formcpacrosswiki/hit onlybackend/common/llm/context-window-budgetandinfrastructure/ci-cd/secrets-handling, neither about server config.mcp.jsonenvinfrastructure-agent-orchestration-pane-delivery-confirmationowns the case (tty echo ≠ consumption; the evidence-strength table; "send the body and the submit key as separate calls"), andplatforms-processes-non-interactive-cli-invocationalready carries the[Pasted text #1]bracketed-paste edge case and its sourceslast_verifiedbumped to 2026-08-12security-authn-session-vs-tokenis a mechanism-choice page (session vs JWT, revocation cost) and says nothing about a cutover's leftovers;security-authz-resource-level-checkscovers per-resource authorization, not gate retirementsession-vs-tokengiven the reverse link)Conflicts flagged: none — nothing in the merged layer contradicts these
directives. The only correction is internal to this flush (candidate 2's queued
directive, handled above and recorded in
log.md).Related-links added:
platforms-tools-plugin-mcp-server-registration↔platforms-tools-version-keyed-artifact-cache(both directions);security-authn-retiring-a-replaced-auth-gate↔security-authn-session-vs-token(both directions); one-way to
platforms-tools-harness-mediated-tool-results,infrastructure-config-environment-config, andsecurity-authz-resource-level-checks.Open-PR check
Listed with
gh pr list --repo choiyounggi/dev-loop --state open --search "head:knowledge/"—21 open
knowledge/*heads: #79, #78, #76, #74, #73, #72, #69, #68, #66, #64,#62, #61, #58, #57, #56, #55, #52, #51, #50, #49, #47.
Enumerated every
wiki/path each of the 21 heads touches and filtered for thethree candidate areas (MCP/plugin, security/authn, tmux pane +
processes/).Overlapping paths, and what each in-flight change actually does:
pane-delivery-confirmation.mdlast_verifiedline conflictpane-delivery-confirmation.mdrelated:line onlynon-interactive-cli-invocation.mdrelated:line onlyplatforms/processes/pageswiki/security/index.md,security/data/commit-identity-in-public-repos.mdsecurity/authn/No open head touches plugin/MCP configuration or
security/authn/at all.Per-candidate verdict:
/mcp.mcp.jsonenvsecurity/authn/No sibling duplicate PR opened; nothing folded onto another branch; nothing
dropped as a pending duplicate.
Routing decision
envexpansion)platforms/tools/ new pageplugin-mcp-server-registration.md(platforms-tools-plugin-mcp-server-registration)platformsowns "commands inspected before execution / toolchain and harness behaviour", and itstoolscategory already holds the sibling harness cases (version-keyed-artifact-cache,harness-mediated-tool-results). Notinfrastructure/config— the case is a harness's plugin-loading lifecycle, not per-environment application configinfrastructure/agent-orchestration/ merged intopane-delivery-confirmation.mdsecurity/authn/ new pageretiring-a-replaced-auth-gate.md(security-authn-retiring-a-replaced-auth-gate)security/authnalready owns mechanism choice and password storage; gate retirement is the same category's cutover case. Notsecurity/authz— the missed check is authentication state, not per-resource permissionThe harvested
domain:hints were followed for all four (platforms,platforms,infrastructure,security).Plumbing updated:
wiki/platforms/index.mdandwiki/security/index.mdeach getthe new page with a "load when" line enumerating its distinct uses;
log.mdhasthe dated
ingestentry, including the candidate-2 correction. Both new pagesare within the 120-line body limit (61 and 67 lines); every
related:idresolves to an existing page.