We built the same plugin six ways
As part of our WordCamp US 2026 talk we built out the same plugin with the latest Frontier Sol 5.6 and Fable 5 model at xHigh. We pitted it against our Starter pipeline and our Principal WP Pipeline running Opus 4.8.
As with each plugin we started with the same prompt:
Build an invite-only WordPress plugin for video-game collectors. Registered users search IGDB to add games to their library. Games can have one of four statuses (playing / finished / backlog / wishlist). They can curate a front-end library at
/my-library/, follow each other, and see an activity feed.
This post is part of a series
We build the same plugin with Sol 5.6 xHigh, Fable 5 xHigh, our starter pipeline and our full pipeline. Here are the results.
Full pipeline
Initial output ·With design work This page
Starter pipeline
Frontier models
Sol 5.6 · Fable 5
See it in action
Highlights
Acceptance criteria walkthrough
Try it yourself
Boots a fresh WordPress in your browser with the plugin activated and demo content loaded. The search runs against the real IGDB catalog. Nothing is saved, refresh to start over.
Boot takes about 20 seconds · runs in your browser
How the pipeline built this
This reason the output of the pipeline is so much stronger is because it doesn’t just make assumptions. It uses our Organizational AI Framework to understand the task, gather context, coordinates with our built in stakeholders, reviews and audits the output of every phase and is based on hundreds of compounding sessions.
Here are all the questions and the decisions we made as part of building this pipeline per phase.
Definition Phase Questions
Invites: who is allowed to send one?
Nothing in the ticket said who could issue an invite, and that shapes whether the community grows on its own or stays gatekept by admins.
- Admin-only for version one, with member-to-member invites as a possible later step. (was the default)
- Open to any existing member, with no cap.
- Open to any existing member, but rate-limited with a per-inviter quota. (your answer, overriding the default)
Library page: a plugin-owned route or an editable WordPress page?
If the personal library is a normal editable page, an editor can break the feature by moving or deleting its contents; a plugin-owned route cannot be broken that way.
- A plugin-owned, generated route, not editable as a WordPress page. (your answer, the default)
- An editable WordPress page that staff maintain, with guardrails against accidental breakage.
Browsing others: how does a member view someone else’s library?
Every logged-in member can see any library, but the only address named was a self-view, so there was no defined way to browse another member’s collection.
- A stable per-member address, read-only to everyone but the owner. (your answer, the default)
- One self-only address, with other members’ libraries reached some other way, such as a directory or a modal.
Curate: does that include removing a game or changing its status after adding it?
The stated done-criteria only tested adding, viewing, and a status change showing in the feed, so a literal build could ship with no way to remove a game.
- Support add, status-change, and remove. (your answer, the default)
- Add and view only, with status-change as the sole edit and no remove in version one.
Event tracking: record adds, status-changes, invites, and follows now, even without a dashboard?
Version one has no engagement dashboard, but if these actions are not captured as they happen, a future dashboard could only be built from launch day forward.
- Ship basic event capture alongside the feature now, even with nothing consuming it yet.
- No separate event capture in version one; the activity feed’s own records of adds, changes, and follows suffice. (your answer)
Consent: does member-activity tracking need its own consent category, and does the invite email need a privacy disclosure?
Everything here is visible only to logged-in members, and joining collects an email, so member behavior identifies individuals in a way anonymous analytics does not.
- Use the same consent category as general analytics, and flag invite-email collection to whoever owns the privacy documentation. (your answer)
- Give member-activity tracking its own consent category, separate from anonymous analytics.
Attribution: record which channel and which member brought in each signup?
This is cheap to capture at registration and expensive to reconstruct later, even if nothing uses it in version one.
- Record the invite channel and the inviting member at redemption, even with nothing consuming it yet. (your answer)
- Don’t record it; capture only what version one needs.
Invite admin: should admins get a list of pending, redeemed, and expired invites?
Without a list view, whoever manages membership cannot check whether an invite arrived or clean up expired ones short of direct database access.
- Include an admin list of invites, with status, resend, and revoke, in version one. (your answer)
- Track invite state in the data model but don’t surface it in an admin screen for version one.
Following: is it immediate, or does it need the other member’s approval?
Because any member can already see any library, an approval step would not protect anything visibility does not already expose; it would only change what shows in a follower’s feed.
- One-directional and immediate, with no approval step. (your answer, the default)
- Follow requires approval from the followed member, with a request, accept, and decline flow.
Member role: what WordPress role do invited members get, and can they reach wp-admin?
Any wp-admin access beyond a member’s own profile is an unnecessary support surface for a front-end-only feature.
- The default Subscriber role, restricted to the front end with no wp-admin access beyond their own profile. (your answer)
- A custom role for library members, still restricted to the front end.
- Give members some wp-admin dashboard access.
Scale: is the expected membership size a hard cap, or just a planning assumption?
If the size is meant as a ceiling, that is a registration rule to reject or queue invites past it, which was not stated anywhere.
- A planning assumption only, used for sizing caches and rate limits, with no enforced cap. (your answer, the default)
- A hard cap, where the system rejects or queues invites once membership reaches the limit.
You also corrected the size the plan should assume, from about 100 members up to about 1,000, and told the team to size caching, IGDB rate-limit handling, and query sizing accordingly: The ~100 figure came from a recommended default accepted without confirmation in the first discovery round and is now rejected.
Advertising: does this feature need to account for ads on the pages it adds?
If the plugin runs on a site that carries ads elsewhere, the new library, search, and feed pages would need to preserve those ad slots.
- The plugin runs standalone, with no advertising now or planned. (your answer, the default)
- The plugin runs alongside a site that carries ads, so ad-slot and layout constraints apply to the new pages.
Based on the questions at this gate we added scope to the plugin.
First, a full data export and erasure path built on WordPress’s own privacy tools (GDPR Compliance), so when a member leaves or requests deletion, their library, follows, activity, and invite email are removed.
Second, two public, search-indexable surfaces: a public game catalog carrying structured data, and opt-in public member profiles. Both depend on a check that IGDB’s terms permit redisplaying its data.
Requirements Phase Questions
Build approach: build the membership and social layer custom, or adopt third-party plugins?
A plugin-based hybrid would be faster to stand up, but the candidate plugins’ compatibility with this project’s conventions was assumed, not verified, and each would need its own data-export and erasure hooks confirmed.
- Build custom, native to this project’s conventions, with full control over the data model, erasure hooks, IGDB integration, and public-page output. (your answer, the default)
- A hybrid: install existing plugins for the social and invite layer, and build only the game-collection part custom.
IGDB terms: do IGDB’s terms actually permit publicly redisplaying cached game data?
This was a blocking check for the public catalog. The research agent could not reach IGDB’s terms directly to verify them, so every finding was a secondary source and the recommendation was to treat the question as open.
- Confirm directly with IGDB before any public-catalog work, then build it with a visible attribution line.
- Proceed now on the secondary-source indicators, with attribution built in and the surface ready to pull behind noindex quickly if the terms turn out to prohibit it. (your answer)
Erasure and shared pages: when a member erases their account, what happens to a public game page their add created?
A public game page is shared by everyone who holds that game, so tying its removal to the member who first added it would take a popular page down for everyone still holding it.
- Key the page to the game, not to any one member; it persists while any active member holds the game, and erasure removes only the erased member’s own entries. (your answer, the default)
- Tie the page to the member who first added it, so erasing that member removes the public page even if others still hold the game.
Storage model: should library entries live in a custom database table or a custom post type?
Entries need to be filtered by member and status and kept out of the normal Posts screen, search, and feeds either way, and the choice is costly to change once entries exist.
- A custom table with indexed columns for faster per-member and per-status filtering, at the cost of hand-built admin and API surfaces. (your answer, the default)
- A custom post type with status as post meta, which gives free admin and API scaffolding but slower filtering at scale.
Moderation: should there be a tool to correct a bad game entry or remove an inappropriate feed post?
Every member’s library and feed is visible to every other member, with no pre-publish review, so after-the-fact correction is the only path.
- A minimal capability to correct a single cached game record and remove a single feed entry. (your answer, the default)
- No moderation tooling in version one; corrections happen through direct database access if needed.
Feed granularity: what counts as one feed entry when a member changes a game’s status repeatedly?
A member flipping one game between statuses several times in a session could otherwise flood every follower’s feed with one entry per flip.
- One entry per status change, with no deduplication. (your answer, the default)
- Collapse repeated changes to the same game within a short window into a single updated entry.
Cache refresh: does cached game data ever refresh after it is added, or is it copied once?
This decides whether a background sync job is in scope at all, if IGDB later corrects a title, cover, or release date.
- Copy once on add, with a manual per-game refresh action for correcting a stale entry, and no background job. (your answer, the default)
- A scheduled background refresh that re-fetches cached games on a cadence.
Design tokens: does the plugin own its design tokens, or ship alongside a theme that provides them?
The repository has no theme at all, so the badges, buttons, and forms this feature needs have nowhere to resolve design tokens unless something provides them by the time it ships.
- The plugin owns its tokens independently, with no dependency on a separate theme being installed. (your answer)
- The feature ships alongside a minimal theme whose token file these design tokens extend.
Data volume: what data volume should the primary storage be sized for?
Member count is bounded at about 1,000, but each member’s library, follows, and activity generate rows, which affects the storage choice and whether the feed needs pagination from day one.
- Small: under 10,000 total rows even at five years.
- Medium: 10,000 to 1,000,000 rows, consistent with about 1,000 members each holding a few dozen to a few hundred games, follows, and feed rows. (your answer, the default)
- Large: over 1,000,000 rows within five years, which would need the storage and feed built for scale from day one.
Traffic: what traffic level should the library pages and the public catalog be sized for?
The private, logged-in pages are bounded by the member count, but the public catalog exists to draw search traffic and could see much more if it ranks well.
- Low: under 10,000 pageviews a month across all surfaces.
- Medium: 10,000 to 1,000,000 pageviews a month across the private and public surfaces. (your answer, the default)
- High: over 1,000,000 a month, which would need the public catalog built for edge caching from day one.
Invite lifecycle: what states can an invite be in, and how are duplicate redemptions and already-registered emails handled?
The invite state machine was undefined, and a wrong guess here is expensive to unwind once members are registered against it.
- Four explicit states (pending, redeemed, expired, revoked), atomic redemption so a second concurrent attempt fails cleanly, and an already-registered email is told to log in instead. (your answer, the default)
- A simpler two-state active or inactive model, with duplicate redemptions and existing emails handled as generic errors.
A note on the live IGDB demo
To let the demo reach the real IGDB API from inside WordPress Playground, we built a small proxy server that the plugin uses which was added after the fact and not part of the pipeline build. We added it separately, after the fact, to make the in-browser demo work against real data.
