Conversation
…elopment - Promote buried mandates to SKILL.md invariants: AI-assisted disclaimer header, verification artifacts (checklist + verify.sh + hooks), and the live-broker heads-up; extend the doc-grounding invariant to ban substitute channels and the version invariant to ban the solrsearch index - Surface the Step 0 door-question gate and the environment-discovery rule (a found broker/config never answers a question) in jcsmp.md, design-mode.md, and implement-mode Step 0 - Split implement-mode.md into a core file plus three per-leaf wiring files so the core fits a single Read; state the generation file-output contract up front and move the checklist write into Step 4 generation output - Redesign verification to be shape-agnostic: verify.sh gains an app stage driven by a generated verify-hooks.sh (START_CMD/TRIGGER_CMD/READY_MARKER/PASS_MARKER), a warn-only conformance preflight, and a live-run heads-up line; curl may trigger but never render the verdict - Replace the log4j2 2.26.0 pin with outcome rules: resolve the highest stable 2.x from authoritative metadata, framework-owned SLF4J backends win, config file required, com.solacesystems loggers never silenced, and the 2.17.1 Log4Shell floor enforced as a check - Bind doc grounding to each design question and redefine the Grounding docs field to fetched-pages-only; add a Generation conformance group to the verification checklist - Remove the mandated Core Concepts intro from SKILL.md and prerequisites.md; prerequisites is now broker acquisition only - Solace Suggested decoupling: keep the two-project default but require a surfaced conflict with three resolutions on single-deliverable asks; never merge silently - Rename the Java API Release Notes link to JCSMP API Release Notes (the JAVA_API_RN download serves the JCSMP release notes) and point sample logging comments at the Step 3 rule - Root-caused from 10 analyzed sessions; violations and fixes tracked in EBP-2889
- Key mode routing on the design contract instead of request phrasing; a build prompt without a contract enters Design first, including web and embedded shapes - Add the design-contract gate to jcsmp.md and make the summary a hard precondition in Implement Step 2 (valid sources: same-session summary, explicit summary in chat, saved solace-design.md) - Add the topology rule for edits to existing apps: topology-changing edits re-enter Design, mechanical edits go straight to Implement - Add Design mode's fully-specified path: a prompt that answers every tree question gets one merged confirm at close-out - Dedupe the broker-access question in Implement Step 1 when Design Step 0 already confirmed it this session - Keep the door question an isolated Implement Step 0; a confirmed design never answers it
- Add the comments-follow-their-code contract to implement-mode Step 4: a construct carried from a sample keeps that construct's comment (names adapted), dropped demo harness takes its comments with it, and fresh messaging code that applies a documented practice gets a short comment naming it - Add a binary item to the checklist's Generation conformance group so a run that strips the comments fails its own checklist; keep it outside the preflight's first-four mechanical checks - Align the Step 6 group description with the new non-preflight item - Evidence: a generated embedded Direct Pub/Sub project carried sample constructs without their attached best-practice comments, while every explicitly mandated one-line comment survived (slot-bound rules get followed; unbound ones do not)
- Solace Suggested is TLS-secure by definition: tcps:// with server-certificate validation, requiring a TLS-configured broker; there is no non-secure variant and no Step 0 sub-question, so the door question stays a clean three-way choice - On a broker without TLS, the skill states the requirement and offers Custom with the equivalent knobs minus the secure session (the developer's explicit choice) or Quickstart; it never generates a plaintext session under the Solace Suggested name - Collapse the overlay's Step 1 fork to the TLS build only and delete the plaintext session section; the no-TLS case routes back to the Step 0 door - Update the checklist branch notes, the Step 6 tailoring examples, the Custom span description, and the comment-contract bullet accordingly - Feedback source: live session screenshot showed the door question flattened into four options with Non-Secure preselected
- Make explicit that Quickstart has no TLS requirement and connects with whatever scheme the host carries; a plaintext tcp:// dev broker is a normal Quickstart target - Guard against over-generalizing the new Solace Suggested TLS requirement onto the Quickstart door
- Make shutdown_long_running and the cleanup trap signal the process group (kill -- -PID) instead of the bare PID; every launch site backgrounds under set -m, so each recorded PID leads its own group - Close the macOS bash 3.2 leak where a compound START_CMD keeps the bash -c wrapper alive and a PID-directed kill stopped only the wrapper, orphaning the app (bash 4.4+ execs the final command) - Add a post-wait KILL sweep for any group member that outlives the leader - Document the SIGKILL residual: no trap can run on a hard kill, and set -m places children outside the script's group, so that orphan risk cannot be closed from inside the script - Swap shellcheck disable=SC1091 for the source=/dev/null idiom on the verify-hooks.sh source line - Addresses PR #4 review comments; verified on bash 3.2/4.4/5.0/5.1/5.2 (macOS, Ubuntu 20/22/24.04, Debian 12, openSUSE Leap 15.5): the trap runs on INT/TERM, rc semantics stay 130, and no process leaks
mtite-sol
left a comment
There was a problem hiding this comment.
Added some of my personal comments inline but overall looks good to me, I think splitting things out is the right choice!
I have some general feedback of things to test / look out for like fail-fast scenarios around docs being down, deprecated features discovered while polling latest on active dev, etc but we can take that offline it doesn't gate this PR!
I got Claude to take a second look afterwards here are the results (non-blocking unless you agree with its feedback):
-
implement-mode.md Step 6 mis-describes its own preflight. It lists the preflight-reported items as "disclaimer header, logging floor, version freshness, the recorded verify stage and exit code" — the last one can't be a preflight check (the preflight runs before
the stage) — and it omits "this tailored checklist exists at every project root", which the preflight does check. It also says only the comments item is non-preflight, but the new Generation-conformance group has three (comments, stage/exit code,
grounding-docs-fetched). The group heading "(checked by the verify.sh preflight)" over-promises for 3 of 7 items. -
The log4j conformance item claims far more than the preflight implements. The checklist asserts "exactly one logging backend … any log4j-core on the classpath (including transitive) at or above 2.17.1 … the com.solacesystems loggers are not silenced". The
preflight regexes a literal two lines under log4j-core in pom.xml — it cannot see a transitive log4j-core, a property-driven version, a second backend, or a logger level. mvn dependency:list would actually close it. Separately,
sort -V is GNU-only, so the floor check silently no-ops on macOS — the one platform the new group-kill comment goes out of its way to support. -
The app stage's trigger is the only unbounded wait in a script whose stated rule is that nothing waits unbounded. bash -c "$TRIGGER_CMD" runs in the foreground with no deadline. Every other wait uses a SECONDS deadline, and the header says "NO teardown path may
use a bare unbounded wait". A curl against a wedged web app — precisely the shape this stage exists for — hangs verify.sh forever with the app still up.
4 . ./verify-hooks.sh sources generated shell straight into the observer's scope. The design promise is "the hooks carry the ONLY app-specific facts; the observer logic stays in this script", but a hooks file can cd, set SUB_PID/SUB_LOG/status/rc/TIMEOUT_S, or
redefine cleanup, and silently break the observer. Cheap fix: pull the four values out of a subshell, or document reserved names in the generated template.
-
The group-kill conversion is incomplete. cleanup and shutdown_long_running now signal the group, but the publisher/requestor timeout escalations still do bare-PID kill -TERM "$PUB_PID" / kill -KILL "$PUB_PID" (three sites). Harmless for mvn exec:java today, but
it's the same orphan hole the round was closing. -
Solace Suggested's new single-deliverable carve-out contradicts the rule two lines above it. Option 2 — "one Maven build with separate publisher and consumer modules under a parent pom" — is offered as keeping the decoupling, directly under "there is NO parent
POM and NO aggregator" and against a checklist item reading "its own pom and NO parent POM". Only option 3 is described as recorded under Developer-owned items, so choosing option 2 leaves the checklist item unsatisfied and unrecorded. -
Minor: preflight and the live-run banner fire before the stage name is validated. verify.sh bogus announces "Live-run heads-up: stage 'bogus' starts processes that connect to broker …" and makes a network call to repo1.maven.org, then errors with "unknown
stage". -
Minor: the sol-jcsmp freshness warn conflates two things. It compares the pom to on every run, so a project that resolved correctly at generation time starts warning the moment Solace ships a release. The checklist item is scoped "at generation time";
the check isn't. -
Question count before any code. The body sells "a fully specified prompt resolves in ONE confirm" — that's only the design confirm. A fully-specified "build me X" now walks Design Step 0 (do you have a broker?) → design close-out confirm → Implement Step 0 door
question → Implement Step 1 (which broker?). Three or four turns before generation, on a PR whose stated purpose is addressing session-analysis feedback. The two broker questions especially read as one question split across modes.
One follow-up on the SIGKILL residual: worth asking whether the agent harness's abort sends TERM (covered) or KILL (not). If KILL, an orphaned subscriber JVM keeps the EXCLUSIVE queue flow and breaks every later verify run — the script's own header says exactly
that — so a stale-process check at startup would be the real close-out.
- Remove all sample line-number references from implement-guaranteed-pubsub.md; the numbers drifted from the current samples and the text already names each construct - Remove the stale line-number reference from the ENDPOINT_DENIED comment in verify.sh - Drop the 'NEW (waves 2-4)' annotations and the 'Placeholder stages' header in verify.sh; the direct and request-reply stages are fully implemented - Addresses PR #4 inline review feedback on comment maintenance
…orts - Run TRIGGER_CMD backgrounded in its own process group, polled to PUBLISH_WAIT_S, then escalate SIGTERM/SIGKILL; the app stage's trigger was the script's only unbounded wait, so a wedged app could hang an unattended run forever - Keep the marker watch after a hung trigger; the markers render the verdict, and the publish may have landed even when the HTTP response never returned - Reuse PUB_PID for the trigger so the EXIT trap's group kill covers an orphaned trigger too - Source verify-hooks.sh in a child bash and import only the four contract values via declare -p; a stray cd, variable, or function in the generated file can no longer clobber the observer state or force a false PASS - Add --max-time to the template curl and document the four-assignment contract in implement-mode.md - Verified on macOS bash 3.2.57: a hostile hooks file (status=0, TIMEOUT_S override, cd, stray stdout) plus a 300s trigger exits 1 in 18s with no leaked processes; the pass path exits 0 - Addresses Claude-review findings 3 and 4 from PR #4 review feedback
…tor sample - Add a comment at the setReplyTo site linking the canonical Queues page (well-known-queues section), which documents anonymous/temporary queues in the reply-to field for request/reply - The comments-follow-their-code contract carries the note into generated adaptations
Changes
Rules moved to where every session reads them
File restructuring
Verification made shape-agnostic
Logging and versioning fixes
Doc grounding
Design-first routing
Comment preservation
Door simplification: Non-Secure removed