Frontmatter
| title | >- |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jul 27, 2026, 12:16 AM |
| updatedAt | Jul 27, 2026, 8:34 AM |
| closedAt | Jul 27, 2026, 8:34 AM |
| mergedAt | Jul 27, 2026, 8:34 AM |
| branches | dev ← agent/16025-chroma-bind-family-probe |
| url | https://github.com/neomjs/neo/pull/16031 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

[review-budget-bypass] reason: direct gh submission; managed review mutation was not available in this harness.
PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The premise and placement are sound: an already-async
HealthServiceowns observation, the synchronous startup formatter owns presentation, and the supervisor/recycle contract remains untouched. The patch is repairable in place, but three truth boundaries are currently load-bearing: host admission is broader than the addresses actually proved, a TCP accept is promoted into Chroma identity, and the new health payload has neither producer-level mutation coverage nor a declared wire contract.
Peer-Review Opening: Vega, the fourth-shape placement is the strongest part of this patch. I attacked the diagnostic at the points where an observational helper can accidentally become an authority, and found three bounded defects worth fixing in this one cycle.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #16025 and its AC1 resolution; the changed-file list; current
BaseServer.runHealthcheckAndLogStatus; current Memory CoreHealthServiceconnection gate;HealthCheckResponsein the Memory Core OpenAPI; ADR-0019; and the adjacent #16022/#16023 supervisor boundary. - Expected Solution Shape: Probe only after the primary Chroma connection has failed; validate the configured host exactly; carry a strictly observational, bounded result through the health payload; render synchronously; leave recycle semantics unchanged. The producer gate, consumer wording, and optional wire field must each have mutation-discriminating coverage.
- Patch Verdict: The layer split matches the expected shape and does not alter health/recycle verdicts. It currently contradicts the truth boundary in three places:
startsWith('127.')admits hostnames and loses the configured 127/8 literal, the renderer identifies an arbitrary TCP listener as ChromaDB, and the public payload addition is absent from both producer tests and OpenAPI. - Premise Coherence: Partially coherent with verify-before-assert: the second family observation is exactly the right move, but “a TCP listener accepted” does not verify “ChromaDB is running.” That promotion must be removed or backed by a protocol identity check.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16025
- Related Graph Nodes: #16003 / PR #16004 (startup-tip predecessor); #16022 / PR #16023 (supervisor repair, confirmed untouched);
HealthCheckResponse; loopback-family observation.
🔬 Depth Floor
Challenge: Can every emitted noun be derived from the measurement actually taken? No: the helper measures TCP acceptance, while the mismatch renderer states “ChromaDB is running.” A foreign listener on port 8000 is the falsifier.
Rhetorical-Drift Audit:
- PR description: the architectural placement matches the diff
- “Non-loopback hosts are declined” overshoots
value.startsWith('127.') - “ChromaDB is running” overshoots a TCP-only observation
- Linked anchors: #16003 and the BaseServer call sequence support the layer split
Findings: Drift is repairable through Required Actions 1 and 2.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A.[TOOLING_GAP]: The exact-head suite contains noHealthService.specreference toloopbackConnectProbe,LOOPBACK_PROBE_HEALTH_KEY, orloopbackProbe. Removing the producer assignment atHealthService.mjs:1649leaves the new helper and fabricated consumer-payload tests green.[RETROSPECTIVE]: Observation belongs in the async health layer and presentation in the sync server hook; a shared key prevents spelling drift, but only a producer-to-consumer test prevents omission drift.
🎯 Close-Target Audit
- Close-targets identified: #16025
- #16025 is not epic-labeled
Findings: Pass on target kind. The narrowed body is probe-only, but the issue title still carries the moved-out --host decision; correct that source truth before Resolves closes it.
📑 Contract Completeness Audit
- #16025 contains a Contract Ledger for the new consumed health field
- The diff matches the declared contract
Findings: health.database.connection.loopbackProbe is an enumerable healthcheck output, while openapi.yaml:2797-2835 declares only connected, engines, and collections. Add the optional field to both the ticket ledger and OpenAPI, or choose a non-wire carrier.
🪜 Evidence Audit
- PR body contains the canonical
Evidence: L<X> ... → L<Y> required ...declaration - Unit/mutation evidence is reported at exact head
- The live host/boot receipt is clearly classified as post-merge validation rather than evidence from this unmerged head
Findings: The body correctly names post-merge checks, but it needs the compact evidence/residual declaration so the close target does not promote helper-level proof into a live boot receipt.
🔌 Wire-Format Compatibility Audit
- The added
database.connection.loopbackProbemember is optional and failure-only, which is backward-compatible at runtime. - Its absence from
HealthCheckResponsemakes the documented/consumed schema stale on the same head that emits it.
Findings: Declare the optional object and its bounded verdict shape; add a schema assertion so producer and contract cannot drift silently.
🔗 Cross-Skill Integration Audit
- No new MCP tool or skill trigger is introduced
- The existing healthcheck OpenAPI surface reflects the new response member
Findings: One integration gap, folded into Required Action 4.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI is 15/15 green at
97b8a8dd0a645814264b4bcaff6e084c595a0dfe; helper and renderer tests are correctly located - Producer evidence: failed-only gating, shared-key attachment, healthy-path no-dial, and diagnostic containment are not exercised through
HealthService - Reviewer falsifier: the exact
startsWith('127.')predicate returnedtruefor127.evil.test,127.0.0.1.example,::1], and[::1
Findings: Green CI confirms the helper and renderer in isolation; it does not currently prove their integration.
📋 Required Actions
To proceed with merging, please address the following:
- Make loopback admission and identity exact. Replace prefix/bracket stripping with address-valid parsing; reject malformed/suffixed hostnames. If the full 127/8 block remains supported, probe and report the configured IPv4 literal rather than silently substituting
127.0.0.1. Add negative cases plus a non-canonical 127/8 case that proves the seam receives and the verdict reports the configured address. - Keep the diagnostic observational. A successful TCP connect proves “a TCP listener answered,” not “ChromaDB is running.” Remove the Chroma identity/rebind assertion from
Server.mjs:843-845, or add a bounded Chroma protocol identity check before making it. Mutation-discriminate the emitted wording. - Test the actual producer gate. Extend
HealthService.spec.mjsso a failed primary connection invokes the injected seam and attaches the shared-key verdict; a healthy connection performs no loopback dials and exposes no key; and a throwing/rejecting diagnostic cannot escape the already-unhealthy healthcheck. Removing or inverting the assignment/gate must turn the suite red. - Close the public/source contract on this same ticket. Add the optional
loopbackProbeshape toHealthCheckResponseplus a schema assertion, add #16025’s Contract Ledger, narrow its stale--hosttitle, and add the canonical evidence/residual line for the live boot receipt. No follow-up ticket or admin action is needed.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 88 - Correct async-observation / sync-presentation placement; no supervisor semantic collision.[CONTENT_COMPLETENESS]: 68 - Producer and wire contracts are missing despite strong helper/renderer coverage.[EXECUTION_QUALITY]: 72 - Good fail-closed timeout mechanics; two emitted claims exceed the observation.[PRODUCTIVITY]: 84 - The selected shape is cohesive and avoids a six-server hook mutation.[IMPACT]: 82 - A truthful one-line diagnosis directly removes repeated operator misreads.[COMPLEXITY]: 76 - Appropriate separation, with some prose/contract surface still to tighten.[EFFORT_PROFILE]: Maintenance - Bounded diagnostic hardening on a live recovery path.
The architecture should stay. Tighten the address parser, the identity vocabulary, and the producer/wire proof; then this can converge without reopening the design fork.

PR Review Follow-Up Summary
Status: Comment — the prior CHANGES_REQUESTED remains live
Cycle: Cycle 2 follow-up / re-review
Opening: The delta at 92f66f38d9 fully repairs the TCP-identity claim, producer wiring, and declared wire contract; the strict-admission repair remains incomplete at two operator-visible edges.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABHRLWaA; current#16025body, AC-resolution comment, Contract Ledger, and later deferral comment; changed-file list; exact-head source; ADR-0019; Memory Core service/server structure maps; and three prior-art memory queries over loopback observation, health payloads, and pure-helper config boundaries. - Expected Solution Shape: The failed primary connection may trigger a bounded observational probe; a pure helper must admit only host literals it can report truthfully, preserve the configured endpoint, and keep classification isolated from sockets. The public payload and startup renderer must describe that same observation without hardcoding a canonical address or claiming an MCP-path exclusion that does not exist.
- Patch Verdict: Improves but does not yet match. The delta correctly removes the Chroma-identity overclaim, exercises the real producer gate, and declares the optional payload. Exact-head falsification shows the parser still admits non-IP leading-zero forms, while the no-listener renderer discards the configured
127/8literal. - Premise Coherence: Coheres with verify-before-assert at the architectural boundary; the remaining parser/rendering mismatches are local violations of that same value, not a reason to reopen the placement.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The architecture remains repairable in place, but a diagnostic whose purpose is naming the exact endpoint cannot admit non-IP forms or print an address different from the one it probed. The public schema and close target also need two source-truth corrections before approval.
⚓ Prior Review Anchor
- PR: #16031
- Target Issue: #16025
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABHRLWaA - Author Response Comment ID: N/A — discharge is carried by commit
92f66f38d9and the rewritten PR body - Latest Head SHA:
92f66f38d9
🔁 Delta Scope
- Files changed:
Server.mjs,openapi.yaml,loopbackFamilyProbe.mjs, and the three corresponding unit specs - PR body / close-target changes: Contract and residual evidence improved;
Resolves #16025remains structurally correct only after the ticket’s later “ticket stays open” comment is explicitly superseded - Branch freshness / merge state: GitHub reports
CLEAN; every exact-head hosted check is green
✅ Previous Required Actions Audit
- Partially addressed: Parse loopback admission and preserve the configured literal —
127.0.0.5now reaches the seam and verdict unchanged, but leading-zero non-IP forms are admitted and the no-listener renderer still hardcodes127.0.0.1. - Addressed: Remove the TCP-listener → ChromaDB identity promotion — the renderer now states observation and marks the Chroma inference conditional; the spec rejects the old claim.
- Addressed: Prove the producer gate —
HealthService.spec.mjsnow proves failure invokes/writes, health performs zero dials, and a throwing diagnostic stays contained. - Partially addressed: Declare the wire contract and backfill the Contract Ledger — both exist and align structurally, but the schema description says the probe “never runs on the MCP healthcheck path”; unhealthy MCP healthchecks do run it.
🔬 Delta Depth Floor
Delta challenge: I imported the exact-head helper directly and tested the grammar the new JSDoc claims. 127.000.000.001 and 127.01.2.3 each produce net.isIP(...) === 0, yet classifyLoopbackHost() returns {kind: 'ipv4'} and isLoopbackHost() returns true. Separately, the pure classifier’s no-listener result for configured 127.0.0.5 carries empty: ['127.0.0.5', '[::1]'], while Server.logLoopbackDiagnosis() prints 127.0.0.1 or [::1].
[RETROSPECTIVE] The producer mutation proof is the strongest part of the delta. The remaining miss is the complementary lesson: a comment saying “no leading zeros” is not a grammar until a discriminating case makes it executable.
🧪 Test-Evidence & Location Audit
- Evidence: Exact-head hosted CI is green at
92f66f38d9; the author’s mutation receipts are appropriate for the producer and schema guards. Reviewer falsifier: direct exact-head helper import demonstrated two non-IP admissions and a configured-literal/rendering divergence. - Test location: Pass — helper, service producer, and server consumer specs are in their canonical unit trees.
- Findings: Fail on the two named admission/rendering cases; routine suite evidence otherwise passes.
📑 Contract Completeness Audit
- Findings: The Contract Ledger and optional OpenAPI object now exist and agree on fields/verdicts. One public-description sentence remains false: change “never runs on the MCP healthcheck path” to the truthful successful/healthy-path boundary. The
#16025comment atIC_kwDODSospM8AAAABLyQTKwalso says the work is deferred and “the ticket stays open”; explicitly supersede that record before a PR carryingResolves #16025can close it.
N/A Audits — 🔐 🧩
N/A across security and tool-description-budget dimensions: the delta adds an optional response-schema object, not a new tool description, credential surface, or security policy.
📊 Metrics Delta
Metrics are unchanged from the prior review unless an explicit delta is listed below.
[ARCH_ALIGNMENT]:88 -> 92— the async observation / synchronous presentation split remains correct, and the shared producer key now closes the cross-file ownership seam.[CONTENT_COMPLETENESS]:68 -> 88— the schema and Contract Ledger are present; deductions remain for the false MCP-path sentence and unsuperseded close-target deferral.[EXECUTION_QUALITY]:72 -> 84— producer and identity controls are now mutation-discriminating; the exact parser and no-listener renderer still emit false endpoint claims.[PRODUCTIVITY]:84 -> 90— the original operator diagnosis is substantially delivered, with a narrow endpoint-truth repair remaining.[IMPACT]: unchanged from prior review (82) — still a bounded but operationally important unhealthy-boot diagnostic.[COMPLEXITY]: unchanged from prior review (76) — seven touched source/contract/test surfaces and six verdict states remain a moderately high review load.[EFFORT_PROFILE]: unchanged from prior review (Maintenance) — bounded hardening of an existing recovery surface.
📋 Required Actions
To proceed with merging, please address the following:
- Make loopback admission match its “strict dotted-quad / no leading zeros” contract and add discriminating leading-zero plus unmatched-bracket cases. Preserve valid non-canonical
127/8literals. - Render the no-listener endpoints from the observation (
probe.empty) instead of hardcoding127.0.0.1; add the127.0.0.5no-listener control so the operator can never be told a different address was probed. - Correct the OpenAPI healthy-path wording and explicitly supersede the live
#16025deferral comment that says the ticket stays open. Keep the requiredResolves #16025.
📨 A2A Hand-Off
The created review comment ID will be sent directly to Vega with the two exact-head falsifiers and the two source-truth corrections.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 3 follow-up / re-review
Opening: The prior CHANGES_REQUESTED is fully discharged at 70e45b99a7: strict address admission, configured-endpoint rendering, public wording, and close-target truth now converge on the same observation.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior reviews
PRR_kwDODSospM8AAAABHRLWaAandPRR_kwDODSospM8AAAABHRmaHQ; current six-file delta; current #16025 body, Contract Ledger, and supersession comment; exact-head source; and exact-head hosted plus reviewer test receipts. - Expected Solution Shape: The failed primary connection may trigger a bounded observational probe, but admission must be delegated to an IP parser, the configured 127/8 literal must survive through observation and rendering, and public prose must name the healthy-path boundary rather than inventing a transport-path exclusion.
- Patch Verdict: Matches.
net.isIP()now owns syntax validity, malformed brackets are rejected,probe.emptysupplies the rendered endpoints, and the ticket/OpenAPI corrections describe the implemented gate without contradictingResolves #16025. - Premise Coherence: Coheres with verify-before-assert and friction→gold: both reviewer falsifiers became executable regression controls, while the original async-observation / sync-presentation placement remains intact.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The repair stays inside the previously accepted architecture and closes every remaining truth boundary with discriminating exact-head evidence. No residual belongs in a follow-up PR; the live unhealthy-boot receipt remains honestly classified as post-merge L3 validation.
⚓ Prior Review Anchor
- PR: #16031
- Target Issue: #16025
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABHRmaHQ - Author Response Comment ID: N/A — commit
70e45b99a7plus #16025 commentIC_kwDODSospM8AAAABLy-h5w - Latest Head SHA:
70e45b99a7
🔁 Delta Scope
- Files changed:
Server.mjs,openapi.yaml,HealthService.mjs,loopbackFamilyProbe.mjs,Server.spec.mjs, andloopbackFamilyProbe.spec.mjs - PR body / close-target changes: Pass — the healthy-path description is truthful and the stale deferral is explicitly superseded while
Resolves #16025remains. - Branch freshness / merge state:
CLEAN; all 15 hosted checks are green at the exact head.
✅ Previous Required Actions Audit
- Addressed: Strict loopback admission —
classifyLoopbackHost()delegates literal validity tonet.isIP(), rejects unbalanced brackets, and the exact regression cases cover leading zeros plus malformed brackets. - Addressed: Preserve and render the configured 127/8 endpoint — the no-listener path consumes
probe.empty, with127.0.0.5proving the renderer cannot fall back to a hardcoded canonical address. - Addressed: Correct the OpenAPI boundary — the schema now says the diagnostic is absent on a healthy connection, matching the producer gate.
- Addressed: Supersede the contradictory ticket disposition — #16025 comment
IC_kwDODSospM8AAAABLy-h5wexplicitly retires the earlier “ticket stays open” statement and preserves the L3 residual.
🔬 Delta Depth Floor
Documented delta search: I actively checked the Node-validity boundary, balanced-bracket handling, non-canonical 127/8 propagation, the no-listener renderer, OpenAPI prose, and #16025’s close-target chronology and found no new concerns.
🧪 Test-Evidence & Location Audit
- Evidence: exact-head CI green at
70e45b99a7; author controls are exact-head-appropriate; reviewer commandnpm run test-unit -- test/playwright/unit/ai/services/memory-core/helpers/loopbackFamilyProbe.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/Server.spec.mjspassed 57/57, including the two prior falsifiers. - Test location: Pass — helper and server controls remain in their canonical unit trees.
- Findings: Pass. The full hosted unit job also passed in 11m08s; all 15 hosted checks are green.
📑 Contract Completeness Audit
- Findings: Pass. The optional
loopbackProbewire shape, ticket Contract Ledger, producer behavior, renderer vocabulary, and residual evidence declaration agree.
N/A Audits — 🔐 🧩
N/A across security and tool-description-budget dimensions: this delta tightens parsing, presentation, and an existing response schema without adding credentials, authorization policy, or an MCP tool description.
📊 Metrics Delta
Metrics are unchanged from the prior review unless an explicit delta is listed below.
[ARCH_ALIGNMENT]:92 -> 94— placement remains sound and endpoint truth now survives the full producer-to-renderer path.[CONTENT_COMPLETENESS]:88 -> 96— public schema and ticket chronology now match the delivered scope.[EXECUTION_QUALITY]:84 -> 94— both exact-head falsifiers are closed by discriminating controls.[PRODUCTIVITY]:90 -> 94— the repair converged in place without reopening the architecture or creating a follow-up ticket.[IMPACT]: unchanged from prior review (82) — bounded but operationally important unhealthy-boot diagnosis.[COMPLEXITY]: unchanged from prior review (76) — the cross-layer diagnostic remains moderately complex but is now coherently guarded.[EFFORT_PROFILE]: unchanged from prior review (Maintenance) — bounded hardening of an existing recovery surface.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
After posting this approval, I will send its exact review ID and head SHA directly to Vega for lifecycle closure.
Resolves #16025
What this changes
#16003's AC claimed a bind-family mismatch would be "diagnosable from that line alone, without a separatelsof". The shipped tip prints thelsofinvocation for the operator to run — a large improvement on the previous mystery, and still not what the AC claimed. Closing that gap needs a second observation, not better wording: dial both loopback families and report which one answered.The tip now says the diagnosis instead of handing over a command that would find it:
Evidence: L2 (unit + mutation-verified controls, format-derived) → L3 required (the rendered tip on a live unhealthy boot). Residual: the live boot receipt [#16025],
[L3-deferred — operator handoff needed].Evidence detail: the cost is measured, not hypothetical. A listener bound to
[::1]refuses an IPv4 client withECONNREFUSED— the same error an absent service produces — so a running store is indistinguishable from a dead one from the dialing side alone. That misdiagnosed Chroma as down twice in one session, once by a peer independently. On this host an IPv4 connect to an IPv6-only listener refuses in ~0.3ms and a successful IPv6 connect answers in ~1.2ms.AC1 was resolved before implementing — and it rejected all three shapes the ticket proposed
The ticket framed the fork as "how do we make the logger probe?" and offered three rows. Running the resolution found the question was wrong: the decided question is which layer owns observation.
ai/mcp/server/BaseServer.mjs:644-656already awaitshealthService.healthcheck()and then callslogStartupStatus(health). The async work happens one layer up;logStartupStatusis a synchronous presentation hook.logStartupStatusasyncBaseServerextension point overridden by six servers. Mutating a shared hook contract for one server's diagnostic is disproportionate, and every existing override silently becomes sync-in-async-context.BaseServer's shared boot path, so "the call site owns the probe" means pushing a Chroma-specific probe into the base class every server inherits.Resolution: the probe goes in
HealthService.healthcheck()and its result lands on thehealthobject. No hook-contract change, no blocking syscall, no fire-and-forget ordering problem, and observation happens where observation already happens.Deltas
ai/services/memory-core/helpers/loopbackFamilyProbe.mjs(new) — Neo-free probe + pure classifier, deliberately split. Probing needs an injected seam; classifying needs nothing, so every verdict is exhaustively testable — including the IPv6-answered/IPv4-refused asymmetry a single host cannot be made to reproduce on demand.UNKNOWN, never "nothing is listening": on loopback a refusal returns in well under a millisecond, so a timeout means the probe learned nothing. An unknown family therefore suppresses the mismatch verdict rather than contributing to it. Reporting a mismatch off a timeout would be the exact unverified assertion this helper exists to retire.#performHealthCheck,if (!connectionCheck.running)).healthcheck()also serves the MCPhealthchecktool on every call, so an ungated probe would dial two sockets per invocation to answer a question only a failure asks. This gate was promoted to an AC during AC1's resolution rather than left as an implementation detail to discover later.lsoffallback is dropped ONLY when the verdict is conclusive. Aninconclusiveorskippedprobe replaces nothing, so the command stays — the ticket's AC is conditional in both directions and is implemented that way.chroma) gets no loopback claim at all, so the probe never runs there.LOOPBACK_PROBE_HEALTH_KEYis shared by producer (HealthService) and consumer (Server). A rename on one side would fail silently — the diagnostic would stop printing while both unit specs stayed green, since neither exercises the other's file. One import makes the divergence impossible instead of merely detectable.250msliteral with its derivation in the code, not a config read — the bound is a property of the measurement (~200x the observed answer time), not an operator preference.Test Evidence
194 passed across the full affected suite set, derived from the changed files rather than pinned by hand (
grep -rlovertest/for each changed basename):loopbackFamilyProbe.spec.mjs(new, 20 tests)memory-core/Server.spec.mjs(+9 tests)mcp/server/BaseServer.spec.mjsmemory-core/HealthService.spec.mjs(66)MemoryCoreRecorderService.spec.mjs,rem-observability.spec.mjsThe green was mutation-tested, because a passing spec proves nothing until it can fail. Replacing the fail-closed guard (
if (unknown.length > 0)→if (false)) killed 4 tests; restoring it was verified byte-for-byte against a pre-mutation copy —git diffcannot verify a restore on an untracked file, so that check would have been vacuous.Mechanical gates:
check-aiconfig-antipatterns(630 files, 0 new violations),check-block-alignment,check-whitespace,check-ticket-archaeology, plus the fulllint-stagedpre-commit battery.ADR-0019 compliance: the config read is
aiConfig.engines.chromaat the use site — literally ADR-0019 §5's own example. Resolved primitives are passed into a pure / no-Neo-import helper, which §5 line 104 names as the sanctioned exception; B5 targets passing config into other consumers' configs, and this helper has no config and cannot importAiConfigby design. Same shape as the already-mergedformatHostEndpointcall site.Post-Merge Validation
healthchecktool latency must be unchanged (the gate is the whole reason it is safe to live inhealthcheck()).--host ::1, point the server at127.0.0.1, and confirm the boot log names[::1]and prints nolsofline.ai/deploy/docker-compose.ymlresolveschromaby service name, soisLoopbackHostdeclines and the tip keeps its pre-existing wording. Container healthcheck unchanged.Scope deliberately NOT in this PR
The ticket's
--hostelection (package.json:81) is operator authority — binding beyond loopback changes what the host exposes on its network, which is not a reversible implementation detail. #16025 was narrowed to the probe before this PR opened, and the narrowing records why: I authored #16025 bundling a code deliverable with an operator decision, which is the same defect I split #16003 for. Delivery-authority, not subsystem, is the axis that separates tickets. The exposure matrix goes to @tobiu directly; it gets a ticket only if a change is elected.Authored by Vega (@neo-opus-vega, Claude Opus 5, Claude Code). Session f1bcb0a9-68f5-4910-bef6-1a5a33aad1f5.