Repository navigation
Conversation
|
@claude Please review current head 96aec67 against dev, focusing on authenticated IPC transport, credential lifecycle, process/terminal ownership, host/runtime compatibility and cross-platform CI. Inspect companion runtime PR #21 read-only as needed; do not mutate it. This is the first review request for this head. |
|
Claude finished @kshivang's task in 10m 26s —— View job Review: authenticated IPC at
|
| Surface | What the user sees |
|---|---|
IpcCompatibility.isInstallable / StoreHomeCatalogProvider:140 |
store badge says installable |
PluginStoreSetup.ipcIncompatibilityReason (:1462, :2147) |
adopt/install gate passes |
PluginUpdateManager:306 |
no incompatibility notice |
StoreRepairArtifact:42 |
repair promotes the artifact |
So a user on this host can browse, download and adopt a pre-contract runtime with no signal at all, and meets the failure at first spawn as logger.error("Failed to spawn out-of-process plugin: manifest={}") plus a Result.failure whose message is now just the marker text — the old code's message carried the host IPC version and the runtime path, which is what makes it actionable.
Bumping CURRENT to 2.0.0 lights all four up with the existing "Update the runtime JAR." wording and rejects before download, leaving the marker as belt and braces for a runtime that lies about its version. The KDoc's bump policy is phrased around src/main/proto/ changes, which this PR doesn't touch — but the transport is a wire-level breaking change by any other reading, and BossIpcServer, BossIpcClient and ChildProcessBootstrap.connectToService are source- and binary-breaking changes to a jar AGENTS.md says the runtime repo consumes as a published upstream (modules/boss-ipc/build.gradle.kts:37 still says version = "1.0.0" too). If the deliberate decision is not to bump, that reasoning belongs in IpcVersion's KDoc, because it currently reads as a rule this PR broke. Fix this →
3. The new workflow's GraalVM step is misconfigured, and its path filter excludes the host half of this PR.
.github/workflows/authenticated-ipc.yml:44-48:
- uses: graalvm/setup-graalvm@v1
with:
version: '25.0'
distribution: graalvmversion is the legacy input for GraalVM releases up to 22.3 (and dev/mandrel); with distribution: graalvm the action expects java-version: '25'. As written this step is likely to fail resolution on all three runners, which means the "Build and exercise native authenticated IPC" job — the one that actually runs the smoke binary — never proves anything. (I couldn't execute it to confirm; please run workflow_dispatch once before merge.)
Separately, pull_request.paths covers only the four modules/** directories. KernelBootstrap.kt, OutOfProcessPluginSpawnerImpl.kt and PluginUIServiceBridgeTest.kt are changed by this PR and are the host side of the contract, so the workflow will not run on a future PR that touches only them. And push: branches: ['fix/security-authenticated-ipc'] is branch-specific scaffolding that should come out before merge.
Also note toolchainDetection.set(false) in modules/boss-ipc/build.gradle.kts:11 is unlike the nine sibling modules that use graalvmNative — it makes nativeCompile take native-image from whatever JAVA_HOME is, which is the whole reason the GraalVM step's correctness matters. The Java 17 toolchain at :39-43 does keep compilation on 17, so that part is fine. (I can't edit .github/workflows/ — GitHub App permissions exclude it — so this one needs a human commit.)
4. Ten unused imports will fail ktlintCheck.
no-unused-imports is not among the rules .editorconfig disables:
IpcRoundTripTest.kt:6,7,16—ManagedChannelBuilder,ServerBuilder,ServerSocketStateServiceTest.kt:6,7,15— same threeEventBusServiceTest.kt:6,7,18— same threeLateServiceRegistrationTest.kt:10—ManagedChannelBuilder
All four files dropped their hand-rolled server/channel setup for IpcTestServer and kept the imports. LateServiceRegistrationTest is the unambiguous case (no wildcard import in the file). The PR body says ktlint passed, so either the run predates the IpcTestServer migration or something is masking the rule — worth re-running :boss-ipc:ktlintCheck. ./gradlew ktlintFormat fixes it.
Medium
5. The runtime contract marker is an exact byte match, and a single string. IpcTransport.kt:24 compares readNBytes(64) against "pinned-tls-v1;subprocess-env-v1\n" verbatim. A runtime jar whose resource picked up CRLF, lost the trailing newline, or gained a comment line fails with "uses an unsupported IPC transport" — indistinguishable from a genuinely old runtime, and the diagnosis is invisible because the value is never logged. More structurally: because it's one exact string, no single runtime build can satisfy two host generations, so every future contract bump is a flag day across both repos. value.trim() against a Set of accepted tokens costs nothing now and buys the overlap window later.
6. watchState tears down a stream because someone else wrote the key. StateServiceImpl.kt (watchState) authorizes the initial read only if the key already exists. A watcher that subscribes to a key not yet in the store passes, then authorizeRead inside .collect throws PERMISSION_DENIED the first time a different instance writes it — killing the RPC rather than filtering the event. IpcAuthorizationTest covers the already-exists case (refused(PERMISSION_DENIED) { beta.watchState(key).toList() }), not this one. The emission-time check should filter, not require, and keep a require only for the initial snapshot.
7. getState is a key-existence oracle. A missing key returns an empty StateValue with version = 0; an existing foreign key returns PERMISSION_DENIED. Any authenticated process can therefore enumerate which keys exist across instances. listStateKeys filters correctly, so this is the one hole. Returning the empty default for an unreadable key would close it (at the cost of a less honest error).
8. principalFor takes a global monitor on every streamed message. ProcessTokenRegistry.principalFor is @Synchronized, and ProcessIdentityInterceptor's sendMessage override calls it per response message. Terminal output streaming is the highest-frequency path in the tree and it now serialises through one lock shared with every other stream and with issue/revoke. Keep the lock for mutation and make the read path a ConcurrentHashMap; IssuedCredential already carries its own AtomicBoolean, so the map value is safe to read unlocked.
9. Cross-thread ServerCall.close() races the handler. The onRevoked listener calls guardedCall.close(...) from the revoking thread. finished (AtomicBoolean) correctly serialises close-against-close, but not sendMessage against close: a handler thread can pass !finished.get(), the revoking thread can then CAS and super.close(), and the handler's super.sendMessage() lands on a closed ServerCallImpl and throws IllegalStateException. Practically that surfaces as a failed coroutine on a call that is already closed, so it's survivable — but it deserves a comment saying so, because the next reader will assume finished made it safe.
10. Two load-bearing comments were deleted, both the kind AGENTS.md exists to keep.
ProcessTokenRegistry's threat-model paragraph is gone: "This authenticates possession of a child credential, not an OS sandbox boundary. The environment can be inherited by descendants or inspected by same-user processes." It was deleted in the same change that put a TLS private key (SERVER_PRIVATE_KEY) and a HOST-authority token (HOST_TOKEN) into that same environment. The limitation got strictly more consequential and its only written record disappeared. It belongs onIpcEnvironment, next toremoveCredentials, which is now the mitigation.ProcessSpawner's@JvmOverloadsrationale is gone ("load-bearing, not style … exactly the failureKernelReflectionContractTestexists to catch"). The annotation survives at:25and the new 5-arg shape still generates the 3-arg constructor, so nothing is broken today — but the next person to touch that parameter list has lost the reason not to.
11. Server-auth-only TLS, no mTLS, and Windows has no filesystem equivalent of secureSocketFile. Authorization is the bearer token in boss-process-token; the certificate pin proves which endpoint you reached, not who you are. On UDS that composes with IpcAddressResolver.secureSocketFile; on Windows the transport is TCP loopback, where the token is the only control. That is a defensible design, and the pinning plus per-incarnation revocation is a real improvement — it just needs stating now that (10) removed the paragraph that used to state the analogous limit.
Low / nits
-
SpawnIpcSecurity.createmints the host token viaProcessTokenRegistry().issue("host", HOST)on a throwaway registry used purely as a CSPRNG, then discards the object. AnewToken()helper would say what's happening. Relatedly, theonFailure { security?.revoke() }path is leak-free only becauseregistry.issuehappens to be the last statement increatethat can throw — worth a comment or an explicittry, since reordering it silently leaks a live credential for a process that never started. -
ChildProcessBootstrap.connectToServiceisif (serviceName !in serviceAddresses) return nullfollowed by an unconditionalerror(...), so a function declaredBossIpcClient?can never return non-null. Make it throw unconditionally, or delete it and the now-deadserviceAddressesplumbing onChildProcessConnection. -
ProcessTokenRegistry.issueconstructs a freshSecureRandom()per call; the previous code held one instance. -
KernelServiceImpl.registerProcessmoved theregisteredProcesses/lastHeartbeatswrites to afteronProcessRegistered, so the callback now observes a kernel that doesn't yet list the process registering. The trailing secondrequireOwnProcessexplains itself; the reorder doesn't. -
UnknownRuntimeand a manifest read failure are now both fatal where they used to warn-and-continue, anderror(compatibility.reason)drops thehost IPC=…, runtime=…suffix the old message carried. The strictness is right; the message regression is not. -
modules/boss-process-manager/build.gradle.kts:39createsFiles.createTempDirectory("bs")per test run and never deletes it. -
TerminalOwnershipProcess.mainignoresargs, sorequest("wait"),request("echo")andrequest("sentinel")are identical. More importantly, when its credential assertion fires the sentinel is never written, so the test fails as a 15-secondwithTimeoutrather than naming the security property it was proving — asserting on the child's exit code or streamed stderr would make that failure legible. -
IpcAddressResolveracceptsuri.port in 0..65535. Port 0 is correct for a server bind (IpcTestServerrelies on it) and meaningless for a client dial; the two paths could be split. -
IpcTlsIdentitycertificates are valid 366 days andcheckValidity()runs only at context construction. Fine for any realistic host lifetime, but a re-dial after a year fails with a TLS error rather than anything that names expiry. -
OrchestratorAuthorizationTestdepends onProcessAuthority.entriesdeclaration order (HOST last) forassertEquals(0, restarts.get())to hold. Reordering the enum fails loudly rather than silently, so this is cosmetic — but iterating non-HOST authorities explicitly would say what it means.
On the companion runtime, unverified
I couldn't read PR #21, so these are the three things I'd check on that side before either merges:
- The marker resource must be byte-identical,
pinned-tls-v1;subprocess-env-v1plus exactly one\n, atMETA-INF/boss-runtime/security-contract, and must survive whatever shading the runtime jar goes through. See (5). EventBusService.publish/publishBatchnow overwriteEventEnvelope.sourceProcesswith the credentialed process id, andStateService.setStateignoresStateUpdate.sourceProcessentirely (writingcaller.processIdinstead). In-repo this is safe —IpcEventBridgeImplusespublishLocal, which preserves the field — but any runtime-side or analytics-side publisher that set a logical source now getspluginProcessId(windowId, pluginId).connectToServiceno longer connects. Any runtime peer-to-peer path must already be routed through the host, and the failure mode is a thrownIllegalStateExceptionfrom a nullable-returning function. See (13).
Nothing in this PR was mutated, and PR #21 was not touched.
· branch fix/security-authenticated-ipc
|
@Raghav-Bansal-15 Your per-endpoint TLS pinning, per-incarnation credentials, process/terminal ownership and real spawned-JVM environment checks address important IPC gaps. I reviewed all three authored commits and the completed Claude review. This needs an author handoff before it is suitable for dev. Substantive blocker verified in source: Bounded reviewer repair: corrected the authenticated-IPC workflow to Compatibility/rollout remains coordinated work: the marker is checked at runtime spawn while the existing protobuf/minIpcVersion surfaces still describe a different contract. Document and validate how old runtime artifacts are refused or excluded before adoption/distribution and how a matching host/runtime pair is delivered. I did not blindly bump every IPC major to 2: the code explicitly separates transport from protobuf compatibility, and a blanket bump affects all existing plugin declarations. Companion runtime PR #21 is read-only/outside this assignment, not permission to publish it. Its main/source channel wiring and PR metadata were inspected here, but its packaged behavior and remote checks remain unverified. Additional valid review follow-ups to resolve or explicitly justify with tests: unreadable state keys reveal existence via differing responses; subscribing before a foreign key appears terminates the stream (choose/document the intended refusal semantics); restore the bearer-token/same-user threat-model documentation. I did not apply speculative lock-free registry changes, relax the exact contract marker, or remove peer-discovery APIs merely for style: those change security/concurrency/compatibility policy and require their own evidence. The companion PR includes newline controls, so CRLF rejection is not itself proof of a shipped defect. Validation blockers are separate: both original-head workflows are Per the user's bounded-review policy I am converting this open PR to draft after this handoff. No merge, admin bypass, live app operation or runtime release. The useful security work is preserved; the outstanding recovery defect and validation/rollout requirements are explicit rather than being treated as a green review. |
|
Validation update after the handoff: reviewer head 45edecf passed the shared-lock run. JUnit reports contain 200 tests total (IPC 60, process-manager 38, terminal 3, orchestrator 77, host UI bridge 22), zero failures/errors/skips. nativeSmokeJvm and root ktlintCheck/detekt also passed. The handoff remains in force: these tests do not cover the verified dead-orchestrator channel acquisition failure, and native/packaged-runtime CI and rollout validation remain outstanding. This updates the earlier queued-local-validation observation, not the draft disposition or original contributor score. |
cd88490 to
5a2e818
Compare
|
@Raghav-Bansal-15 I verified the contributor follow-up against the prior handoff: newer ProjectData/SplitView/RunConfig test fixtures use pinned TLS and preserve anonymous/revoked refusal and provider-not-called assertions. Guarded repair-client acquisition and cancellation behavior remain present. Companion runtime #21 now records paired host/API 1.0.93 validation; coordinated distribution/minimum-host decisions remain explicit release gates, not permission to publish anything. Merged rebased dev Cross-group context: unassigned draft #669 contains unique generation/collision/rollback safeguards in KernelServiceImpl. It is not a complete duplicate of this TLS/authority/ownership change; its implementation remains untouched and must be reconciled by its owner. #581 depends on this transport and also stays separately owned. @claude Please review this current head once against dev, focusing on prior recovery and fixture-integration findings, revocation, and compatibility boundaries. Do not edit code. Exact-head upstream CI and substantive review disposition remain merge gates. No runtime release or app launch performed. |
|
Claude finished @kshivang's task in 9m 37s —— View job Review: authenticated IPC at
|
| Finding | Disposition |
|---|---|
| Dead orchestrator kills the failure collector | Fixed. orchestratorStub() moved inside repairAdviceOrNull (KernelBootstrap.kt:608-611), which rethrows CancellationException before any other catch, so caller cancellation survives. |
| Ten unused imports | Fixed. All four migrated IPC tests are clean. |
| Workflow GraalVM step | Fixed to java-version: '25'; paths now covers kernel/**, OutOfProcessPluginSpawnerImpl.kt and desktopTest/.../kernel/**. |
| Deleted threat-model paragraph | Restored, on IpcEnvironment next to removeCredentials - the right home, since that is now the mitigation. |
| Dev fixture integration | Done. ProjectData / SplitView / RunConfig build NettyServerBuilder.sslContext(tls.serverContext()) with overrideAuthority(IpcTlsIdentity.AUTHORITY). Importantly the assertion split is correct, not a blanket sed: anonymous and revoked callers assert UNAUTHENTICATED, while RunConfigServiceBridgeTest keeps assertFailsWithPermissionDenied for the authenticated-but-unauthorized execute cases (:230, :251, :254), and the provider-not-called and revoked-stream assertions are intact. |
| State key-existence semantics | Documented explicitly in docs/authenticated-ipc-rollout.md:23-27, including the watch-an-absent-key termination. That is the "choose and document" disposition that was asked for. |
Remaining: one compatibility boundary that is mechanically checkable
1. :boss-ipc still declares version = "1.0.0", and that string names the released artifact.
This is a sharper version of the earlier IpcVersion.CURRENT finding, and it does not depend on the protobuf-versus-transport argument at all.
gradle/upstream-artifacts.gradle.kts:32registersverifyIpcVersionConsistency, which fails the build unlessIpcVersion.CURRENT == :boss-ipc.version.assembleUpstreamJarscopiesboss-ipc-<that version>.jarintobuild/upstream-artifacts/, andrelease.yml:1591attaches it to every BossConsole release with the comment "File names are<module>-<ipcVersion>.jar… so consumers can pin by IPC version."
This PR breaks that jar's public API three ways: BossIpcServer's constructor gains two required parameters, BossIpcClient's gains a required IpcClientCredentials, and ChildProcessConnection.connectToService changes from "returns null" to "throws IllegalStateException". So the next release publishes a different, source-incompatible boss-ipc-1.0.0.jar under a filename the runtime repo is told to pin by. A consumer holding an earlier download of that exact name and a consumer fetching the new one get different APIs with no way to tell them apart.
The earlier objection to bumping was that it "affects all existing plugin declarations". That objection applies to a major bump and not to a minor one. Read IpcVersion.isCompatible: within one major, a runtime is rejected only when rtMM > hostMM. Moving the host to 1.1.0 therefore
- rejects nothing that
1.0.0accepted (every existingminIpcVersion: 1.0.xdeclaration still passes), - makes an old host refuse a runtime that declares
1.1.0, which is exactly the coordinated distribution gatedocs/authenticated-ipc-rollout.md:11-14currently describes as a manual maintainer duty, and - gives the new jar a distinct filename.
That is a bump that buys the gate without the blast radius. If it is still deliberately declined, the reason belongs in IpcVersion's KDoc, which today reads "Bump this BEFORE merging any change to boss-ipc/src/main/proto/" and says nothing about a jar whose API broke without the proto moving. Fix this →
Medium
2. The recovery guard is an exception allowlist, and the regression test does not cover the call site.
repairAdviceOrNull catches six named types. The collector at KernelBootstrap.kt:497 is still a plain launch { handleFailure(...) } inside failures.collect, so anything outside that list still cancels the collector permanently - the original defect, by a different exception type. One reachable-in-principle example: orchestratorStub() reads client.channel, which builds lazily through IpcAddressResolver.configureChannelBuilder, and that throws UnsupportedOperationException for a unix:// address on a platform without kqueue or epoll. IllegalArgumentException from the same function is caught; its sibling is not.
respawn already wraps its work in catch (e: Exception), so the collector's own launch is the one place a structural guard is missing, and it would make the allowlist unnecessary rather than merely longer.
Related: RepairAdviceTest exercises the helper with a synthetic lambda. It does not go through requestRepairAdvice, so moving orchestratorStub() back above the guard - the exact bug that was reported - fails no test. The ask was for a regression "using a retained dead orchestrator handle: the failure returns null advice, and a later failure is still handled", and the ordering is the part that regressed. This repo's own AGENTS.md treats mutation-verification as the bar for a fix of this shape. Fix this →
3. A shipped native-image resource changed, and the rollout doc does not mention it. modules/boss-ipc/src/main/resources/META-INF/native-image/.../native-image.properties drops --initialize-at-build-time=io.grpc. That file ships inside the published jar, so it changes how the runtime repo's native images initialise gRPC, not only this repo's smoke binary. The comment justifies it (Netty channel factories are platform-dependent), which is convincing, but it is a downstream behaviour change that belongs in the paired-artifact checklist alongside the marker resource.
4. connectToService is a published-jar behaviour break that is also internally contradictory. if (serviceName !in serviceAddresses) return null followed by an unconditional error(...) means a function declared BossIpcClient? can never return non-null. Any runtime-side peer-to-peer caller moves from a nullable result to a thrown IllegalStateException. Whatever the resolution, this is the third API break in the jar from finding (1) and should be named in the rollout doc.
5. The bridge-test harness is now two harnesses. Three of the ten kernel/services bridge tests speak pinned TLS; the other seven (Secret, RoleManagement, Download, Git, Log, ActiveTabs, Supabase) still use ServerBuilder plus usePlaintext. The three that migrated each carry a hand-copied ~25-line block of NettyServerBuilder/sslContext/overrideAuthority wiring. boss-ipc solved exactly this with IpcTestServer; composeApp desktopTest has no equivalent, so every future bridge test re-derives the pin by copy-paste and the remaining seven have no cheap migration path.
6. EventBusServiceImpl lost observability beyond the security change. SubscriberInfo, anonIdCounter, subscriberInfo and the class's logger are all deleted. The consequence worth stating: SubscribeRequest.subscriber_id is now read nowhere at all, so a proto field that callers still set is silently dead. Deriving sourceProcess from the credential is correct; dropping subscriber bookkeeping is a separate change riding along.
Low / nits
- Cross-thread
ServerCall.close()race is unchanged and still undocumented.finishedserialises close-against-close but notsendMessageagainst close: a handler thread can pass!finished.get()(ProcessIdentityInterceptor.kt:59) while the revoking thread CASes and callssuper.close(). Survivable, but the next reader will assumefinishedmade it safe. - Narrow admission race. When
onRevokedfinds the credential already gone it invokesaction()synchronously at:65, closing the call - but execution continues intoContexts.interceptCallat:79, so the handler still runs and can reach the provider even though no message can escape. That contradicts the "a refused call must never reach the provider" property the bridge tests assert, in a window between:29and:65. ProcessTokenRegistry.principalForremains@Synchronizedand is called per streamed message (accepted last round; noting it persists so it is not lost).ProcessTokenRegistry.issuestill constructs a freshSecureRandom()per call.SpawnIpcSecurity.create:39mints the host token from a throwawayProcessTokenRegistry()that is immediately discarded, so the host to child credential can never be revoked for the life of that child. Probably fine, but it is not stated anywhere.- Terminal session ids are an existence oracle, the same shape as the state-key one that got documented.
sendInput/resize/closeSessionreturnEmptyfor an unknown id andPERMISSION_DENIEDfor a foreign one. Ids are random UUIDs so this is weak, but the state analogue was written down and this one was not. TerminalServiceImpl.ownedSessionopens with a bareIpcCall.current()whose result is discarded. It is load-bearing (it makes a revoked caller fail before the id lookup), which is exactly why it needs a one-line comment.IpcSecuritySmokehand-lists six test method names. A seventh added toIpcAuthorizationTestis silently not exercised natively.- The
@JvmOverloadsrationale onProcessSpawneris still deleted. The annotation survives andKernelReflectionContractTeststill guards the 3-arg shape, so nothing is broken - but a fifth parameter has now been added to that list and the reason not to drop the annotation is gone from the file. modules/boss-process-manager/build.gradle.kts:39still createsFiles.createTempDirectory("bs")per test run and never deletes it.TerminalOwnershipProcess.mainstill ignoresargs, and when its credential assertion fires the sentinel is never written, so the security property surfaces as a 15-secondwithTimeoutrather than as a named failure.IpcTransport.requireCompatibleRuntimenever logs the value it read, so a marker mismatch and a genuinely old runtime are indistinguishable in the log. The exact-match policy itself is a settled decision; the diagnosability is not..github/workflows/authenticated-ipc.yml:5still carriespush: branches: ['fix/security-authenticated-ipc']scaffolding. Also worth deciding before it becomes a required check: with apathsfilter, a required status that does not trigger stays pending rather than passing. (I cannot edit.github/workflows/- GitHub App permissions exclude it.)docs/authenticated-ipc-rollout.mdis not listed in AGENTS.md's Documentation section.
Things I looked at and found correct
Recording these so they are not re-litigated: ProcessSpawner puts config.environment before the BOSS_* keys and then runs IpcEnvironment.removeCredentials before installing fresh ones, so a caller cannot shadow a credential and no inherited one survives. KernelServiceImpl.registerProcess binds expectedAddress to the exact BOSS_IPC_ADDR string the host handed out, and ChildProcessBootstrap.processAddress echoes that env value verbatim, so the equality holds on Windows TCP as well as UDS. IpcTlsIdentity.restore touches no BouncyCastle, so a child needs bcpkix only if it mints an identity - worth confirming against #21's packaging, but it should not be a runtime dependency there. listStateKeys and listProcesses filter rather than refuse. IpcCall.requireOwner inside .collect gives UNAUTHENTICATED on revocation (via current()) and PERMISSION_DENIED on a foreign owner, which is what the fixtures assert.
Not verified
Upstream CI at this exact head, native Linux/macOS/Windows, the packaged host/runtime pair, and runtime #21's marker bytes and shading. Those remain the merge gates, not this read.
· branch fix/security-authenticated-ipc
|
Follow-up at Original and reviewer commits are preserved. Remaining current-head hosted checks and upstream approval are separate gates; no merge or release. Native follow-up at 1ccec3f: protobuf descriptors initialize at runtime to avoid the macOS build-time initialization cycle exposed by the dependent filesystem run. Local tests/JVM smoke/quality passed. Current-head full build plus all three native IPC builds and security smoke tests now pass. Runtime #21 at 303eddb8 pins this host and passes its three-OS CI. Release coordination gates remain unchanged. |
|
@Raghav-Bansal-15 I reviewed I independently downloaded current-head fork JUnit reports: 391 relevant IPC/process/terminal/orchestrator/host-kernel tests pass per OS, zero failures/errors/skips. Full build/quality run 34983084962 and native IPC run 34983010150 pass on Linux/macOS/Windows. Read-only companion runtime #21 is at 303eddb8404f1888e380e0ffc373cedd46762f74, pins this exact host, and its three-platform run 34983216857 passes. Coordinated distribution remains a release gate; none of this authorizes publication. No reviewer source changes or score change this pass. #669 remains an unassigned draft with unique generation/collision/rollback safeguards; no work was taken from it. Current dev merge-tree is clean. Upstream runs 34983018139 / 34983018301 need explicit workflow-execution approval. Keeping ready while that external gate is blocked, without claiming fresh Claude approval of follow-ups or requesting another review loop. No merge or release. |
|
@Raghav-Bansal-15 Your authenticated IPC and recovery follow-ups remain preserved. I reconciled this branch with current dev and the assigned process changes: #570 terminal bounds (now merged) retain authenticated per-instance ownership and credential stripping; #574 private bounded logs retain security-token cleanup on launch failure and exit. Existing terminal ownership tests now wait for bounded exit-history removal; limit tests use the authenticated transport. These integration adjustments are reviewer work, separate from your original contribution. Head |
|
@claude Please review the integration changes on current head 1f4d7dd, focusing on TerminalServiceImpl/TerminalSession ownership under #570 resource bounds, ProcessSpawner credential cleanup with #574 held log streams, and the adapted authenticated terminal tests. Prior contributor findings and follow-ups were reviewed; this request is limited to the new integration, not a repeat broad rewrite. |
|
Claude finished @kshivang's task in 8m 14s —— View job Review: integration changes at
|
|
Integration review disposition:
The new head includes only these focused test/doc repairs after reviewed integration; exact-head CI is required again. No fresh review loop requested. Original author score remains unchanged; integration repairs are reviewer work. |
IPC callers could claim identities without proving them, and a dead adviser could interrupt later recovery. The incompatible authenticated IPC jar also retained its old artifact version.
Pin endpoint certificates, issue revocable per-instance credentials, enforce service authority and scrub subprocess credentials. Publish the contract as IPC 1.1.0 and preserve the separate transport marker. Contain non-cancellation adviser failures and test the real request boundary with a retained dead client. Refuse handler dispatch when revocation wins between identity lookup and listener registration; a deterministic regression fails before this fix.
Validation at
4f209d77: 62 IPC tests, 4 desktop recovery tests, applicable quality checks and contract-jar assembly pass locally. Runtime #21 is paired with this head; its 262 local tests and fatJar build pass. Coordinated distribution, native runtime validation and the minimum supported application release remain release gates; nothing is released.Original and reviewer commits are preserved. Upstream workflow approval and required checks are separate gates; no merge or release.
Native-image follow-up: protobuf descriptors now initialize at runtime to avoid the macOS build-time initialization cycle. Current head
1ccec3f6; local IPC tests/JVM smoke/quality and paired runtime build pass. Current-head hosted checks passed, including the three-OS native build and security smoke tests.Current-head hosted evidence: 🔨 Build & Test, Authenticated IPC boundaries.