Skip to content

EBP-2889: Address session-analysis feedback on solace-application-development - #4

Merged
aelsammak merged 9 commits into
devfrom
EBP-2889
Aug 27, 2026
Merged

EBP-2889: Address session-analysis feedback on solace-application-development#4
aelsammak merged 9 commits into
devfrom
EBP-2889

Conversation

@aelsammak

@aelsammak aelsammak commented Aug 19, 2026

Copy link
Copy Markdown

Changes

Rules moved to where every session reads them

  • Promoted the buried mandates to SKILL.md invariants: AI-assisted disclaimer header on every generated source file, always-emitted verification artifacts, and a live-broker heads-up line before any run that connects.
  • Surfaced the Implement Step 0 door question (Quickstart / Solace Suggested / Custom) and the environment-discovery rule (a running broker or found config.json is a fact to report, never an answer) at the jcsmp.md front door and in the Design mode handoff.

File restructuring

  • Split implement-mode.md (previously too large for one Read, so later steps were unreachable) into a core file plus three per-leaf wiring files: guaranteed-pubsub, direct-pubsub, request-reply. VERIFY: marker strings are unchanged character for character.

Verification made shape-agnostic

  • verify.sh gains an app stage driven by a generated verify-hooks.sh, so web and embedded apps verify with the same script as the two-CLI shape. Added a warn-only conformance preflight. The six existing stages are untouched.

Logging and versioning fixes

  • Removed the log4j2 version pin (it contradicted the no-pins invariant). Replaced with outcome rules: resolve the highest stable 2.x at generation time, one backend only, config file required, and the 2.17.1 Log4Shell floor enforced as a check.

Doc grounding

  • Grounding is bound per design question, and the summary's Grounding docs field may only list pages actually fetched in the session. Removed the never-followed Core Concepts intro mandate.

Design-first routing

  • Mode routing now keys on the design contract, not phrasing: every build request without a confirmed design enters Design mode first, web and embedded shapes included. Implement Step 2 makes the eight-field summary a hard precondition.
  • A fully specified prompt resolves in ONE confirm (summary echoed at close-out). Edits to existing apps split by a topology rule: structural changes re-enter Design, mechanical edits go straight to Implement.
  • The door question stays its own isolated step; Implement no longer re-asks whether a broker exists when Design already confirmed it.

Comment preservation

  • New comments-follow-their-code contract in Step 4: a construct carried from a sample keeps that construct's best-practice comment, dropped demo harness takes its comments with it, and fresh messaging code names the practice it applies. Backed by a new binary item in the checklist's Generation conforma

Door simplification: Non-Secure removed

  • Solace Suggested is TLS-secure by definition: tcps:// with server-certificate validation, requiring a TLS-configured broker. The Secure / Non-Secure sub-question is gone, so the door question is a clean three-way choice.
  • On a no-TLS broker, the skill states the requirement and offers Custom with the equivalent knobs minus the secure session, or Quickstart. It never generates a plaintext session under the Solace Suggested name.
  • Quickstart's plaintext posture is now explicit: no TLS requirement, and a tcp:// dev brokerrget, so the Suggested TLS rule cannot be over-generalized.

…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
@aelsammak
aelsammak marked this pull request as ready for review August 25, 2026 19:13
- 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 mtite-sol left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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):

  1. 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.

  2. 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.

  3. 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.

  1. 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.

  2. 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.

  3. 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".

  4. 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.

  5. 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
@aelsammak
aelsammak requested a review from mtite-sol August 26, 2026 18:35

@mtite-sol mtite-sol left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look good to me!

…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

@cjwmorgan-sol cjwmorgan-sol left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@aelsammak
aelsammak merged commit b6eced5 into dev Aug 27, 2026
5 checks passed
@aelsammak
aelsammak deleted the EBP-2889 branch August 27, 2026 17:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants