Skip to content

fix(apis): tell Cicada that spec [BLOCKING] markers are build requirements - #368

Open
markmhendrickson wants to merge 1 commit into
mainfrom
fix/359-build-spec-blocking-vocabulary
Open

fix(apis): tell Cicada that spec [BLOCKING] markers are build requirements#368
markmhendrickson wants to merge 1 commit into
mainfrom
fix/359-build-spec-blocking-vocabulary

Conversation

@markmhendrickson

Copy link
Copy Markdown
Owner

Closes #359

Root cause

Cicada was not malfunctioning — it was complying with the prompts.

Three facts compose into a refusal:

  1. Lens agents write [BLOCKING] / [NON-BLOCKING] review vocabulary into the assembled build spec.
  2. The swarm-wide prompt defines [BLOCKING] as "the author must address them."
  3. Cicada's prompt says to "raise a checkpoint rather than opening a PR" when blockers exist.

Cicada is the author. Given a spec containing those markers, reporting instead of building is the specified behavior.

Evidence

Issue blocking markers in spec Build
#1882 0 PR opened
#1963 0 PR #1970 opened
#1964–#1975, #2052 1–4 no PR ❌

The only two successful builds in the log are the only two specs with zero markers.

The markers are often conditional and not real blockers. Verbatim from a failing spec:

Flag as [NON-BLOCKING] for this PR … but record it: if regex is ever exposed on a guest/public-scoped surface, this becomes [BLOCKING] and needs rate-limiting

To a builder scanning for its blockers, a forward-looking note that names both tokens reads as an open [BLOCKING].

Change

Adds a READING THE SPEC — severity markers block to _cicada_build_prompt, stating that markers inside the spec are definition-of-done items for the PR being opened, not findings that withhold it; that conditional markers are forward-looking unless the condition holds today; that pre-impl gates are already green; and that a checkpoint is for being unable to implement at all, never for the word "blocking" appearing.

Signal is preserved — the spec's markers still reach the builder unmodified.

This is option 1 of the three in #359: disambiguate at the point of use. Option 2 (strip markers at assembly) risks losing genuine severity signal; option 3 (split the vocabularies) is more correct but touches every lens prompt. Starting small and verifying by effect.

Verification — and its limits

  • The regression test discriminates: removing the added block makes it fail.
  • 489 tests pass across the apis suites, on a branch cut from current origin/main.

Being explicit about what this does not prove: a green suite shows the prompt says what we intend, not that the builder now builds. Per fixed_means_behavior_verified_not_contract_accepted, real verification is a live dispatch against one of the failing issues after this deploys — a PR that actually appears.

That verification is currently blocked: the daemon runs from a deploy checkout whose auto-deploy is failing (deploy HEAD has diverged from origin/main), so merged fixes are not reaching the running daemon. Flagged to the operator separately.

Related

🤖 Generated with Claude Code

…ments

Lens agents write `[BLOCKING]` / `[NON-BLOCKING]` review vocabulary into the
assembled build spec. The swarm-wide prompt defines `[BLOCKING]` as "the author
must address them", and Cicada's own prompt says to raise a checkpoint rather
than open a PR when blockers exist. Cicada IS the author — so a spec containing
those markers makes refusing-to-build the *compliant* reading. It was not
malfunctioning; it was following the prompts.

Evidence: across ten auto-build handoffs, the only two that ever opened a PR
(neotoma#1882, #1963) are the only two whose specs contain ZERO blocking
markers. All eight failures carry one to four.

The markers are frequently conditional and not real blockers — e.g. "flag as
[NON-BLOCKING] for this PR ... but if `regex` is ever exposed on a guest surface
this becomes [BLOCKING]" — which to a builder scanning for its blockers reads as
an open one.

This is the smallest of the three options in ateles#359: disambiguate at the
point of use rather than stripping severity signal from specs (option 2) or
splitting the vocabularies across every lens prompt (option 3). The build prompt
now states that markers inside the spec are definition-of-done items for the PR
being opened, that conditional markers are forward-looking unless the condition
holds, that pre-impl gates are already green, and that a checkpoint is for being
unable to implement at all — not for the word "blocking" appearing.

Signal is preserved: the spec's markers still reach the builder unmodified.

The regression test discriminates — removing the added block makes it fail.
489 tests pass across the apis suites.

Verification of the actual behaviour requires a live dispatch against one of the
failing issues once this deploys; a green suite only proves the prompt says what
we intend, not that the builder now builds.

Closes #359

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Loxia Review 🪶

Verdict: APPROVE

Summary

Focused two-file change that adds a disambiguation paragraph to Cicada's build prompt so [BLOCKING]/[NON-BLOCKING] markers carried inside an assembled spec read as definition-of-done items rather than reasons to withhold a PR (ateles#359), paired with a regression test. The change is prompt text plus test coverage — no runtime logic, secrets, or new files.

Findings

  • 🔴 Secrets: none detected — diff is prompt copy and test assertions only.
  • 🟡 Scope: focused — swarm_dispatch.py prompt edit + matching test in test_swarm_dispatch.py, both serving ateles#359.
  • 🟢 gitleaks: not needed — no new env var references or files.
  • 🟢 Linting: no issues visible — string concatenation matches the surrounding prompt-assembly style; test follows existing test_build_prompt_* conventions.
  • 🟢 Pattern: follows existing pattern — additive prompt guidance, no daemon/startup surface touched; test reuses _issue_trigger()/SpecState/_cicada_build_prompt helpers.
  • 🟢 Docs: no doc updates needed — no new public files or agent-prompt mirror changes; the Cicada agent_definition prompt is unaffected (this is dispatcher-side spec framing).

Nice touch: the test asserts the spec's own [NON-BLOCKING] marker still reaches the builder (signal preserved) while the new guidance is present — verifying both halves of the intended behavior. Assertions (definition-of-done, open the pr, conditional) all map to literal substrings in the added prompt text.


Loxia automated review · commit f215459

@ateles-agent

Copy link
Copy Markdown
Collaborator

🤖 Lanius — Ateles swarm, PR gate inheritance
COMMENT

Triage & Gate-Status Board

Parent issue: #359 (Closes #359 in PR body)

No Neotoma issue entity existed for ateles#359 prior to this check — issue never carried a gate_status key, and had no GitHub comments/labels evidencing any gate activity. Treated as legacy: gates initialized retroactively rather than hard-blocking.

Gate status (workflow_type: bug — fast path skips ux)

Gate Owner Status
pm Pavo not_required (legacy bug fix, no PM scoping phase)
ux Accipiter not_required (bug fast path)
arch Waxwing not_required (prompt-disambiguation only, no schema/architecture surface)
impl Cicada signed_off (PR #368 is the implementation)
pr_review Vanellus pending
qa Phoenicurus pending
legal Buteo not_required

Owner: current_owner → Vanellus (Phase 4, pr_review gate). Vanellus: please pick up review of this PR.

Labels: none applied (label application not in scope for PR-opened protocol).

  • Parent linked (Closes #359)
  • Parent Neotoma issue entity created (ent_58b765ab8abbd05db80f81ab)
  • Absent gate_status initialized (legacy merge; no signed_off downgraded)
  • Pre-impl gates (pm/ux/arch) satisfied as not_required
  • Vanellus assigned as reviewer (review may proceed)

All pre-impl gates (pm/ux/arch) satisfied → PR gate inheritance is clear.

Full issue pipeline (expectations + Pavo) can be backfilled via trigger_swarm_pr.py issue 359.


📎 Neotoma: ateles#359

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.

Cicada refuses to build when the spec carries [BLOCKING] review markers

2 participants