One creature consumes another — or a Devour item — and takes what was worth keeping. The fodder's XP always transfers in full. Grade and mutant status transfer too, but only within the same line. The fodder is destroyed permanently: its uid is burned and nothing recovers it.
soulOv[gi].src, so a socketed soul can be levelled without unsocketing it. An empty socket or a class soul has no source creature, and the button is not shown.min-height:276px with 11px padding, the body has 16px 24px padding and a 12px gap, and the preview line is 15px/1.35. Body content is 359–380px against a panel that caps at 593px on a phone, so there is real room before a scrollbar can return. LIVE on release since 2026-08-05 (0.32).position:fixed, which escapes the stage’s CSS zoom, so its max-height:88% resolves against the REAL viewport rather than the 1080-tall stage: 88% of 674px = 593px on a phone against 792px on a 900px desktop. Every other size in this panel is a stage unit. Any fixed-position overlay in this build has the same asymmetry — measure it at a phone viewport, not just at desktop.The fodder picker lists the soul bag's visible pool only: creatures and Devour consumables. By construction this means anything equipped, penned or socketed can never be fodder — those are not in the visible pool. Eggs and class souls are never fodder. The consumer is excluded from its own pool; a creature cannot devour itself. Consumables sort to the top of the picker, then creatures in soul-bag order.
| Aspect | Rule |
|---|---|
| XP | Always transfers, in full, regardless of species: consumer.xp += fodder.xp. Level is re-derived from the shared XP curve. |
| Grade | Transfers within the same LINE, and only upward: the consumer keeps the higher of the two grades. Any stage feeds any other stage of its own line. Grade feeds the Grade Multiplier, so this is a real stat change. |
| Mutant | Transfers within the same LINE, across stages: a mutant fodder makes the consumer a mutant (see Mutant Variants). Never removed, never reversed. |
| Fodder | Destroyed. The record leaves the bag, the uid is burned, equipment is unaffected (a bag creature carries none). |
| Identity | The consumer's uid, origin, gender and everything not listed above are untouched. It is the same creature, fed. |
“Same” means the same LINE (D ruling 2026-08-02). Identity for grade and mutant is Line_ID from creatures.csv, so an S1 and the S3 it advances into ARE the same for this rule: feed a Stage-1 Rare mutant into its own Stage-3 Common and the Stage-3 comes out Rare and mutant. Across different lines only XP moves.
The comparison falls back to the creature row when creatures.csv has no row for a record, so an unknown or forged creature with a blank Line_ID can never read as “same line” as everything else. dvSpeciesId still exists and is still exact-creature identity — it answers a different question and the picker labels off it.
Three item types live in the soul bag under the new Consumable category. None of them can be obtained anywhere yet (D ruling) — no drop, no craft, no purchase mints them (still true at 0.93); mkDevourItem is the single mint and nothing calls it in play. A refused consumable is never spent.
| Item | Effect when consumed | Refusal rule |
|---|---|---|
| Blood Pellet | Grants XP to the consumer. Currently 1,000 XP — economy_params.csv Devour_Pellet_XP, a placeholder pending tuning; each pellet record can also carry its own xp. | None. |
| Mutagen | The consumer becomes a mutant. | Refused if the consumer already is one: ALREADY A MUTANT. |
| [Grade] Essence of Power | Raises the consumer's grade to the essence's grade (e.g. an Abyssal Essence of Power makes the creature Abyssal). One item per grade on the Worn→Void ladder. | Refused unless the essence's grade is strictly higher than the creature's: THE ESSENCE MUST OUTRANK THE CREATURE'S GRADE. Equal or lower is unusable. |
dvJudge) computes the outcome for both the preview line and the execution, so what the panel promises is exactly what commits.A creature-on-creature devour is the server’s (since 0.89, 2026-10-23): the game asks the devour door, the server judges the pair from its own records — grade and mutant status pass along the line and only upward, the XP is the fodder’s recorded XP, and a devour that would change nothing is refused — then spends the fodder and rewrites the consumer. The game shows the server’s answer, never its own guess; a refusal or a lost connection consumes nothing and says so, and a retry on the same fodder replays the first answer. A locked creature, or one in a pen, a party slot or a soul socket, is never fodder. The three consumables still resolve on the client, because nothing mints them; the day one becomes obtainable it goes through the same door. Nothing of economic value is created here: a devour only concentrates what the account already holds into fewer creatures.
| Function | Responsibility |
|---|---|
dvOpenBag / dvOpenSlot / dvOpenSoul | Entry points from the creature sheet, the equipped-creature slot picker, and the soul-socket picker (a socket holding a creature); all three enforce the battle-phase gate. |
dvChoices | The fodder pool: visible soul-bag creatures + consumables, consumer excluded, consumables first. |
dvSpeciesId | Species identity: the codex row (imgId, name fallback). Same row = same species. |
dvJudge | The single outcome judgement shared by preview and execution. |
dvExec | The atomic commit: for a creature fodder, plays /api/devour’s answer; consume fodder, rewrite consumer, toast, save; bails on stale references and puts the fodder back. |
mkDevourItem | The only mint for Blood Pellet / Mutagen / Essence records. No play path calls it. |
Creatures that are equipped (a party slot or a soul socket) or breeding (in a pen) appear in the fodder list, greyed, badged EQUIPPED or BREEDING, and cannot be selected. Clicking one says why rather than doing nothing.
The report that prompted this was a name collision, and the measurement is worth keeping. It was raised as “it is showing mons currently in breeding as options”. Compared by uid on the reporting save, zero penned, equipped or socketed creatures were in the list — penning and equipping both splice the creature out of the bag, which is exactly why isPennedItem() and isEquippedMon() can honestly return false. The account held three creatures called Tempest and two called Ingot; one of each was penned, and the rest were ordinary bag creatures. What the player could not do was tell them apart.
So the filter that was asked for already existed. Showing the unavailable creatures greyed is what fixes the actual confusion, and it is worth more than the filter: a list that silently omits a creature cannot explain where it went.
Client: dvBlockedRecs(), dvChoices() in play/app.js. Probe: tools/probe_devsel.py — BEFORE 4/4 (asserting the creatures are absent entirely), AFTER 7/7, matching by uid rather than by name.
Build 0.47. Two changes to the same list: it has an order, and it has a usefulness filter.
| Key | Direction | Why it sits here |
|---|---|---|
| Level | best first | The XP a fodder carries is the payout that always applies, so it leads. |
| Grade | best first | The second payout, and the one that decides whether a devour is worth spending a creature on. |
| Advancement line | alphabetical | Not a ranking — it exists to group a family together, so every stage of one line lands in one block. |
| Stage | ascending, within a line | S1 before S3, so a family block reads in advancement order. |
| Gender | tie-break | |
| Rarity | last | Rarity does not affect what a devour pays, so it is the weakest key here. |
| Name | ascending | Present so the order is TOTAL and cannot shuffle between re-renders. |
The list now offers only fodder that can actually change the consumer. The predicate is the
existing dvJudge, which returns not-ok exactly when xp, grade and mut are ALL absent
— the same three payouts the 2026-08-06 refusal is built on.
dvJudge
answers “THE CREATURE IS GONE” for every candidate, so filtering on it before that point would
empty the window instead of filling it.Consequence worth recording: the filter made “no rows at all” the wrong empty-state test. The common empty state is now a list holding only blocked cards — the equipped and breeding creatures that exist to explain where a creature went and that can never be picked. A row-count test reads that list as populated and stays silent on a screen the player cannot act on. The empty message now fires on nothing SELECTABLE, not on nothing at all.
| Source | Payout |
|---|---|
| Same-line fodder of a higher grade | Raises the consumer's grade to the fodder's. |
| Mutant fodder | Makes a non-mutant consumer mutant. Never reversed. |
| Any fodder | XP transfers. |
| Blood Pellet | XP. |
| Mutagen | Mutant — and nothing at all if the consumer already is one. |
| [Grade] Essence of Power | Grade, and only if the essence outranks the consumer's grade. |
Correction to earlier text on this page. What can be consumed above ends “Consumables sort to the top of the picker, then creatures in soul-bag order.” The soul-bag order half is stale as of 0.47 — creatures are ordered by the comparator above. The sentence is left as written; this page is append-only.
economy_params.csv Devour_Pellet_XP rather than naming a client constant that no longer exists. The adventure-log line is gone with the log (retired 2026-10-22). No game code changed.economy_params.csv Devour_Pellet_XP (dfmc-client lane hardcode-3; D: “The csvs need to be the source of all truth. Hardcoded NEVER.”). Held for release 0.90. 1,000 XP, still the placeholder (the item is unobtainable). No number changed. A pin that predates the row keeps the old value and names it (never a refusal); it reaches players when DATA_PIN advances and the bake runs. Gate tools/probe_hardcode3.mjs 33/72 → 72/72.grades, row lockdevour). LIVE on release since 2026-10-23 (0.89). The devour door: a creature-on-creature devour now asks /api/devour. The server judges the pair from its own ledger rows: grade and mutant pass along the line and only upward, XP is the fodder's ledger XP, and a devour that pays nothing is refused. The server spends the fodder row and writes the consumer row. The client plays the server's answer and never its own. A refusal or a lost connection consumes nothing and says so. A retry on the same fodder replays the first answer. After the wipe (GRADE_FREEZE_EPOCH), a fodder the save door adopted without a grant (unsourced) is refused. Item lock: a locked creature is no longer offered as fodder, the devour step refuses one, and the door refuses a fodder that the stored save marks locked or that sits in a pen, a party slot or a soul socket. The Devour consumables still run on the client, because nothing mints them. Probe: tools/probe_grades.mjs 7/21 → 21/21.tools/probe_review_lanep.mjs.dvOpenSoul, D 2026-08-06), is now listed under Where it lives and in the engine reference. F167: the 2026-09-25 entry below says the devour theatre still sat after the stage; Q11 (0.87, see Client shell 2026-09-28) has since moved the theatre, the breed toast, the dismantle-done panel and the breed message inside #vxbStage, so the theatre is stage-sized like the window.dvJudge, which returns not-ok exactly when xp, grade and
mut are all absent, and which is the same judgement the preview and the execution use, so the list can never offer
something the confirm step would refuse; it is applied only once a consumer exists, because with no consumer
dvJudge answers “THE CREATURE IS GONE” for everything and the window would empty instead
of fill. Consequence: “no rows at all” is no longer the right empty-state test — the common empty
state is a list holding only blocked (equipped/breeding) cards, so the empty message now fires on nothing
SELECTABLE. New sections above.tools/probe_dvworthless.py 8/8, of which six assertions exist to prove the cases that
must still work rather than the one that must not.tools/probe_devourfit.py, which measures all three panel states at desktop AND phone (BEFORE 8/8, AFTER 10/10).dvJudge compared dvSpeciesId (the DFMC image id), so feeding a Stage-1 into its own Stage-3 passed XP and nothing else — which is what a player means by “Devour is bugged”: the grade they fed in vanished. Now compared on Line_ID via dvLineId(). XP behaviour is unchanged, and cross-line devouring is unchanged.