Skip to content

fix(pixel): report a requested card published twice under identical headings - #6759

Open
Lightheartdevs wants to merge 2 commits into
mainfrom
claude/pixel-duplicated-requested-heading
Open

Lightheartdevs wants to merge 2 commits into
mainfrom
claude/pixel-duplicated-requested-heading

Conversation

@Lightheartdevs

@Lightheartdevs Lightheartdevs commented Sep 26, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

Fleet qualification round 114 (Qwen3.5-9B, main 5afd46c, website-create): the owner listed three event cards and asked for the Midnight card to start hidden behind a "Show sold out" button. The model published the hidden card and a full copy of it in a section the button also revealed. Both were h2.event-title "Midnight Sold-Out Concert", next to one h2.event-title each for "Dawn Jazz" and "River Lantern Walk".

  • Every listed name was an exact heading, so the requested-text check passed.
  • The show/hide inspection of #card-midnight passed.
  • The owner was told the site was "fully functional".
  • The fleet check (each requested card heading exactly once) failed.

Pixel had no check for requested content that the published page duplicates.

Change

missingRequestedText (plugin/requested-literals.mjs) now reports a {duplicated: n} miss when all of these hold:

  • The owner listed cards or headings, found by the existing counted-list extraction (targets include heading).
  • Within one HTML document, the listed name is the whole text of n >= 2 headings. Letter case and edge punctuation are ignored, as for the other heading rules. A second page that repeats a card (a waitlist or detail page) is not a copy.
  • All of those headings share one tag, one class list and one parent element tag.
  • None of those headings is inside a template or noscript element.
  • Every other name of the same list is the whole text of exactly one heading of that document.
  • No script, style or data file contains the name. This uses the existing opaque check, so lists that scripts render are skipped.
  • The owner's own words do not plausibly ask for content to repeat. When they do, the item literals carry repeats: true and the check stays silent. The cue is deliberately broad:
    • feature, highlight, spotlight, pinned, mirror, repeat, again, twice, duplicate
    • once more, one more time, a second time, a copy of
    • "too" at the end of a clause ("put it in the sidebar too"), but not "too long"
    • "as well", but not "as well as"
    • also + a place ("also in the footer") or a display verb ("also show Dawn jazz in a banner", "should also be listed")
    • both + a place ("both in", "both places"), "in both", "top and bottom"
    • carousel, slideshow, slider, marquee, ticker
    • Portuguese equivalents (destaque, repita, novamente, também, em ambos os lugares, espelhe, cópia de, carrossel)
  • Route notes the host appends to the owner's message ([ODS Portal ...] lines, such as "or copies of existing files" or "do not call exec again") are removed before the cue is tested.

The miss uses the existing flow, with its own fixed text in each place:

  • Publication note (requestedTextInstruction): Requested names head more than one item, while each other listed item has one heading: "Midnight sold-out concert" (2 headings). Keep one item per name and remove the extra copies (a control that reveals a hidden item must show that item, not a second copy), then republish and re-inspect.
  • One bounded revision (REQUESTED_DUPLICATE_HEADING_REVISION_INSTRUCTION), on the next successful tool result for the same snapshot or at finalization.
  • Delivery (requestedTextDeliveryNote): The published page shows requested items more than once, while each other listed item appears once: "Midnight sold-out concert" (2 headings). The preview is available, but that requirement is not met. Delivery status is failed, so replyPayloadSending replaces the model's "fully functional" reply with this host text.

Relation to #6723 (preview-visible-at-load). #6723's load-visibility check deliberately skips text the owner asked to start hidden, and this PR does not change that. This check is a static count of published bytes, not a visibility check. A start-hidden card is still counted: in round 114 both the hidden card and the copy that the click reveals are published, which is exactly the defect.

Evidence: corpus re-run through the real implementation (current head)

The corpus is 437 published pages from qualification history that have a recorded request and harness card verdict. The harness duplicate column uses the prototype's harness-equivalent heading counts.

mode flagged flagged and harness failed them for a duplicate harness-passing pages flagged
prototype methodology (create request applied to the create and edit pages) 4 4 of 4 0 of 389
each page against its own turn's request (what Pixel sees) 3 3 (the 3 create pages) 0 of 389
  • Non-duplicate misses are unchanged from main on every page (0 differences).
  • No corpus request has the repeat cue: 0 of 511 distinct requests, with or without the three Portal route notes appended (delivery requirement, workspace task route, command completion route). Without the route-note removal, the command completion route alone ("do not call exec again") would have silenced the check for all 299 requests that list items.
  • 357 more published pages have no recorded request or verdict. Checked against the standard create prompt, 0 were flagged and 0 have harness-equivalent duplicates.
  • Every corpus page is a single index.html, so counting per document changes no corpus result.
  • Residual: in round 114 the edit turn ("Preserve all three event cards") lists no names, so the checks that use only the current message (as today) cannot see the duplicate that page kept. The create-turn fix is meant to stop the duplicate from being published in the first place.

Tests

tests/requested_duplicate_heading.test.mjs (9 tests) and the fixture tests/requested-duplicate-heading-round114.json. The fixture holds the recorded prompt, write, publication receipt, inspection receipt and final answer. The recorded bytes reproduce the host snapshot digest and the recorded plan hash.

  • Round-114 page: the check returns [{text: "Midnight sold-out concert", duplicated: 2}], with exact note, revision and delivery strings.
  • Guard replay (inspection available):
    • The receipt carries the note.
    • The recorded passing inspection carries the one revision.
    • The recorded answer ends in the failed delivery.
    • The final reply payload no longer says "fully functional".
  • Repair replay: showing the one hidden card instead of a copy clears the miss and delivery passes.
  • Negatives, none reported:
    • a nav or teaser heading with another tag or class, including a nav entry for every card
    • mobile and desktop variants with different classes
    • every listed card repeated, so no sibling appears exactly once
    • a sibling that is missing
    • a longer heading, a comment or an alt attribute
    • names not listed as cards
    • template and noscript copies
    • inline and separate-file scripts that contain the name
    • a card repeated on a second page (waitlist.html), a detail page's heading, a detail page for every card
    • classless card headings beside a classless footer heading, and a dialog heading, under another parent tag
    • 23 English owner phrasings that ask for repetition, including "too", "as well", "also show X in", "put X in the sidebar/header/footer too", "in both places", "again at the bottom", "repeat it", "mirror", "a second time", "a copy of", "top and bottom" and carousels, plus 5 Portuguese phrasings and the earlier feature, highlight, repeat and pin cases
  • Positive controls, still reported:
    • a whole-line script comment
    • 3 copies report duplicated: 3
    • a copy inside one document of a multi-page site reports that document's count, and siblings on another page do not count
    • a classless copied card under the same parent tag
    • "also work on mobile", "also be responsive", "too long", "too tall or too wide", "as well as", "both a header and a footer"
    • the recorded request with the exact pixel-edge delivery requirement, workspace task route and command completion route appended
  • Mutation check: removing any condition fails at least one test. This covers family, parent tag, per-document counting, inert, repeat, sibling, the duplicated exclusion from the absent filter, the route-note removal, both "too" guards and the "as well as" guard, and each new cue alternative (23 mutations).

The fixture evidence and the replay context no longer carry the recorded run id.

Full Linux pixel-agent suite (node --test tests/*.test.mjs):

tree tests pass fail
main 0a63258 3205 3167 0
this head d9fd007 (based on 5afd46c) 3212 3174 0
head merged with main 0a63258 3214 3176 0

Composition with in-flight PRs (git merge-tree against head merged with main)

Known limits

These are from the adversarial probes and are not changed here:

  • Reported, although the owner did not ask for repetition:
    • The model adds a featured or hero section that reuses the exact card markup (same tag, class list and parent tag). The fleet harness counts this as a duplicate too.
    • A copy that is never revealed (a stale <div hidden> copy) or appears only when printed. The check reads published bytes, not visibility, because in round 114 both the card and its copy started hidden.
    • The model builds a carousel with static clones when the owner did not ask for a carousel. aria-hidden clones are not exempt: in the laptop-iteration true duplicate in the corpus (the same page recorded twice), the start-hidden card was itself aria-hidden="true".
    • A dialog or overlay detail view that reuses the full card markup, so the heading keeps its parent tag. The laptop-iteration true duplicate was this pattern: the button revealed an overlay copy of the card instead of the hidden card.
  • Not reported (precision over recall):
    • A copy whose heading has one extra class, or sits under another parent tag.
    • The broad repeat cue also silences the check for many requests that do not ask for repetition, such as "Add a features section", "Highlight the sold-out card in red", "Also add a footer", "the button hides it again" or "Both in light and dark mode".
  • The round-114 edit turn residual described above.

🤖 Generated with Claude Code

…eadings

Fleet round 114 (Qwen3.5-9B, main 5afd46c): the owner listed three event
cards and asked for the Midnight card to start hidden behind a "Show sold
out" button. The model published the hidden card and a full copy of it in
the section the button revealed, both h2.event-title "Midnight Sold-Out
Concert". Every listed name was an exact heading, so the requested-text
check passed, the show/hide inspection of the hidden card passed, and the
owner was told the site was fully functional; the fleet check (each
requested card heading exactly once) failed.

missingRequestedText now reports {duplicated: n} for a listed card or
heading name that is the whole text of n >= 2 headings sharing one tag and
class list, none inside a template or noscript element, while every other
name of the same list is exactly one heading. A script that may render the
name keeps it silent (the existing opaque check), and so does any owner
request to feature, highlight, repeat or duplicate content. The miss goes
through the existing publication note, the one bounded revision and the
failed delivery note, so the reply says the requirement is not met.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at cue

Verifier follow-up for the duplicated-requested-heading check.

Headings were pooled across every published HTML file, so a card repeated
on a second page (a waitlist or detail page) was reported as shown twice.
Copies and the exactly-once siblings are now counted within one document,
and the copies must also share their parent element tag, so a classless
footer or dialog heading is not taken for a copy of the card headings.

The repeat cue now also covers "too" (not "too long"), "as well" (not "as
well as"), "also show/put/list ... " and "also in/on/at ...", "in both
places", "top and bottom", "a second time", "once more", "a copy of",
mirror, and carousels, slideshows and marquees, with Portuguese
equivalents. Route notes the host appends to the owner's message ("do not
call exec again") are removed before the cue is tested.

The fixture evidence and the replay context no longer carry the recorded
run id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant