Support internal-network-only deployment#287
Conversation
The Minimalist — Round 1 ReviewVerdict: APPROVE Tests passed with exact command: I read No totally different path recommended. For this requirement, the smallest useful path is exactly: change the unsafe default, constrain the compose publish address, and document the internal-only deployment posture. This PR does not add a new service layer, dependency, config framework, or speculative abstraction. Process note: skipping plan review was wrong. It did not produce an overbuilt implementation here, so I am not blocking on it. Non-blocking simplicity issue: the new |
The Architect — Round 1 ReviewVerdict: APPROVE Exact test command passed: I read No totally different path recommended. The implementation matches the requirement at the right level: safer direct default, loopback-only Docker publish, and explicit private ingress/firewall guidance. Anything more here would be pretending application code can enforce corporate network topology. It cannot. Process violation: plan review was skipped. That was wrong and should not become precedent. It is not a blocker on this PR because the resulting change is small, coherent, and reversible. Non-blocking problems:
Ship this. Do not expand it into a firewall/proxy implementation PR. |
The Craftsperson — Round 1 ReviewVerdict: REQUEST_CHANGES Exact test command passed: I do not recommend a totally different path. Binding direct startup to loopback by default and publishing Docker Compose only on loopback is the right shape. The implementation is not done. Required fixes:
This is a missed red-green-refactor cycle: the production line changed, but no failing test describes the new contract, and the nearby misleading log was left in place. |
The Marketing Guru — Round 1 ReviewVerdict: REQUEST_CHANGES Tests passed: I fetched and read Plan review was skipped. From the implementation, I do not recommend a totally different path; loopback-by-default plus internal ingress guidance is the right direction. The shipping problem is documentation completeness and reader trust. Required fixes:
Principles: 9 and 15. The right deployment posture must be easy to verify, and slow/smooth here means every public doc and release note tells the same story. |
The Steward — Round 1 ReviewVerdict: REQUEST_CHANGES Test command passed: I read Skipping plan review was a process failure. I do not recommend a totally different path: making localhost the default and constraining Compose host publishing is the right direction. The implementation is not production-ready yet. Required fixes:
Principles: API stability is not just endpoints; the bind address is an operational contract. The right thing is not easy if |
The Minimalist — Round 2 ReviewVerdict: APPROVE Exact test command passed: I fetched and read the current PR diff and changed files. No totally different path is warranted. The PR still takes the smallest useful path for #278: safer loopback default, localhost-only Compose publication, and concise operator guidance for internal-only deployment. Round 2's No Minimalist blockers. Do not expand this into firewall/proxy enforcement in application code. |
The Craftsperson — Round 2 ReviewVerdict: APPROVE Exact test command passed: I fetched and read the current PR diff and changed files. Round 1's code-quality blockers are fixed. The listen-host rule is now extracted into The startup log now reports the actual bound address and port from No totally different path is warranted. The implementation is small, named, and covered at the behavior boundary. From the Craftsperson lens, this has completed the red-green-refactor step well enough to ship. |
The Steward — Round 2 ReviewVerdict: REQUEST_CHANGES Test command passed exactly: I fetched and read the current PR diff and changed files. No totally different path is warranted. The implementation path is still right: loopback default, loopback-only Compose host publishing, a Round 1 production-readiness fixes are mostly addressed: the bind contract now has a small resolver test seam, Compose is constrained at the host port, and startup logs now print the actual bound address/port. Required fixes:
Principles: 8, 9, and 15. The network bind address is an operational contract. If the primary production guide and LLM-facing docs still imply public deployment or omit |
The Marketing Guru — Round 2 ReviewVerdict: REQUEST_CHANGES Exact test command passed: I fetched and read the current PR diff and changed files. No totally different path is warranted. Loopback-by-default, localhost-only Compose publishing, and internal-ingress documentation are the right shape for #278. Round 2 fixed the changelog, removed GitHub bookkeeping from public docs, tightened verification, and documented One material docs blocker remains:
Also fix the production wording in Principles: 9 and 15. The right deployment posture must be the easy one, and every human/agent-facing setup doc needs to tell the same story before this ships. |
The Architect — Round 2 ReviewVerdict: REQUEST_CHANGES Exact test command passed: I fetched and read the current PR diff and changed files. No totally different path is warranted. The runtime shape is right: default direct startup to loopback, Docker Compose publishes on loopback while the container binds internally, the bind contract is now covered by a small resolver test, and the startup log reports the actual address/port. Application code cannot enforce corporate firewall topology; trying to build that here would be the wrong path. Material blocker: the deployment story is still not coherent enough to close #278. This PR is primarily about supported deployment posture, so contradictory primary docs are not a polish issue. Required fixes:
Do not expand this into firewall/proxy implementation. Fix the doc coherence and ship. |
The Minimalist — Round 3 ReviewVerdict: APPROVE Exact test command passed: I fetched and read the current PR diff and changed files. No totally different path is warranted. The PR remains the smallest useful implementation for #278: default direct startup to loopback, Docker Compose published only on localhost, and a short internal-network-only deployment doc with verification steps. It does not try to fake firewall enforcement in application code. The No Minimalist blockers. Stop here; do not expand this into proxy/firewall implementation or more configuration surface. |
The Craftsperson — Round 3 ReviewVerdict: APPROVE Exact test command passed: I fetched and read the current PR diff, changed files, prior council comments, and issue #278. No totally different path is warranted. The implementation still has the right craft shape: the bind-address rule is isolated in a small pure resolver, covered with behavior-focused tests for default loopback, env override, explicit override, and Round 3 did not introduce code churn; it tightened the deployment docs. From the Craftsperson lens, the red-green-refactor gap from Round 1 is closed and there are no material code-quality or test-quality blockers. |
The Steward — Round 3 ReviewVerdict: APPROVE Exact test command passed: I fetched and read the current PR diff and changed files. No totally different path is warranted. The application can make the safe bind behavior the default and document the required network perimeter; it should not try to implement corporate firewall/VPN policy itself. Round 2 blockers are addressed:
From the Steward lens: this is a controlled, additive operational contract with an intentional security default change called out in release/docs. The right deployment path is now visible enough for operators, and the blast radius is constrained to configuration ( |
The Marketing Guru — Round 3 ReviewVerdict: REQUEST_CHANGES Exact test command passed: I fetched and read the current PR diff and changed files. No totally different path is warranted. The product shape is right: default loopback binding, localhost-only Compose publishing, a controlled One material docs blocker remains:
Fix: update Principles: 9 and 15. The right deployment posture is not easy if the agent-facing source of truth still shows public-style URLs for production use. |
The Architect — Round 3 ReviewVerdict: APPROVE Exact test command passed: I fetched and read the current PR diff, changed files, prior council comments, and issue #278. CI check rollup is green on the current head. No totally different path is warranted. The coherent solution remains the small one: default direct startup to loopback, publish the Compose service only on host loopback while binding inside the container, document the internal-network-only architecture and firewall/ingress verification, and stop there. Application code cannot enforce a company VPN or firewall boundary; trying to add that here would create false confidence and unnecessary architecture. Round 2's material blockers are resolved. The bind contract now has a focused pure test seam, startup logs report the actual bound address/port, Ship it. |
What changed
Changed direct server default bind host to localhost, changed Docker Compose publishing to localhost, and documented internal-network-only deployment with firewall verification.
Why
Closes #278. Block Security requires VPN/corporate-only access with no public internet exposure.
New/Changed Endpoints
No endpoints changed.
How to verify
npm run checkManual testing checklist
npm run start)npm test)