skills: publish maxplayer-muse-buyer, the Muse layer of the buyer path - #990
Merged
Merged
Conversation
A Muse account has a workspace, a scheduler and no shell of its own, and the existing buyer-operate skill assumes none of that. This adds the Muse-specific layer on top of it: where the bundle installs, why MAXPLAYER_HOME has to be set on the MCP server process, the two-step funding that needs a human's number before the first invoice, the approval that every paid post needs afresh, and what "paid" means when the daemon settles in the background. Source-checked against this tree at 0.5.8, not against the 0.5.7 field reports the earlier draft leaned on: - post_job requires task, output, amount_sats; every published example carries output, because a post without it is refused. - payment is a declared enum (sat|none) here, and the buyer path really does enforce it: an unrecognised value is refused, and payment=none demands amount_sats=0. The free-job example obeys that rule. - The declared schema sets additionalProperties:false, but PostJobParams deserializes without deny_unknown_fields, so the skill separates the advertised contract from proven enforcement instead of promising a typo is caught. - award_claim's required job_id/claim_id are shown, with the write-once award and the first-call max_sats ceiling explained. - maxplayer buyer REFUSES --home naming MAXPLAYER_HOME; wallet setup with no amount silently asks for 21 sats, so the human picks the number first and the skill invokes setup exactly once. - references/settlement.md covers the two things that cost people money: the buyer watcher settles in the background with no collect call, and collect can pay and then fail to materialise, whose supported recovery is re-running collect for the same job id. No blanket no-charge assurance anywhere. Offline gate, one deterministic command, no network, relay, mint or sats: node --test web/app/test/muse-buyer-skill.test.mjs # 20 pass It checks a fresh-home install from the skill's own manifest with every link resolving locally, manifest/shipped-file agreement in both directions, no home path, key, invoice or balance in anything shipped, the 10000-character core budget, the pinned version, every published example against the schema read out of this tree's mcp.rs, and the discovery index keeping every pre-existing entry. Several tests fail loudly if the SOURCE changes under them, so a stale claim becomes a red test rather than a wrong instruction. Discovery: indexed after buyer-operate and linked from the homepage skill, which web/app/test/build.test.mjs requires; that suite stays at 8 pass. Not verified: no clean-account Muse acceptance run exists. Nobody installed this into a fresh Muse account, funded a wallet, posted a job or collected a delivery. references/verification.md states the tier of every claim and what would close the gate; it ships explicitly unpassed.
|
Someone is attempting to deploy a commit to the MakePrisms Team on Vercel. A member of the Team first needs to authorize it. |
added 3 commits
September 10, 2026 00:02
R1 funding: show the quote_id wallet setup prints and pass it positionally to mint-complete, which exits USAGE_ERROR without exactly one quote id. R2 targeting and approval: every post_job example picks a target mode (seller_pubkey or untargeted:true); the approval gate now has five items including who may take the job, plus a separate yes for publishing a free task's text publicly, and states that a schema-permitted max_sats is not new authority. R3 install and setup: the manifest is a source -> installed-path mapping whose core lands as uppercase SKILL.md, the required buyer-operate companion is mapped and fetchable, and the MCP prerequisite ships a launchable registration (maxplayer mcp with an absolute MAXPLAYER_HOME) with Muse-side registration labelled Not verified. R4 tests: the schema reader now parses types, enums, minima and maxima and the checker is proved by negatives (string amount, invalid payment, non-boolean untargeted, undeclared field, missing task); adds negative coverage for a missing target mode, a bare mint-complete, the install entry point and the companion closure; the version assertion is exact equality against Cargo.toml with any other stated maxplayer version failing unless labelled a field report. R5 free jobs and recovery: settlement.md scopes the pay/attempt_id language to paid jobs, documents the free response shape (state none, null attempt_id, amount_sats 0, no spent_total_sats) and says the missing field is not a zero lifetime spend; retry is described as preserving the pinned award, probe-only after expiry and able to stay unresolved, with recovery bound to the same job id and MAXPLAYER_HOME. Gate: node --test web/app/test/muse-buyer-skill.test.mjs -> 30 pass, 0 fail.
R3: the bundle is self-contained. The required buyer-operate companion install is removed rather than repaired, so no page this gate never checks can contradict it on model filtering, retry convergence or a debug-buying handoff. The core states that it needs no other skill and that it governs where older buyer material disagrees; the install manifest is the whole bundle. A test asserts no manifest row or markdown link leaves the bundle and that no other skill is named as a dependency. R4: a schema bound written as a named constant is now resolved from the source that defines it (get_job.timeout_secs.maximum = long_poll::WAIT_FOR_CAP_SECS = 10) and an unresolvable name fails the gate closed instead of becoming null, which was a false-green path for timeout_secs=11. Array items types are checked, or the gate fails closed. Negative coverage now includes below-minimum and above-maximum numbers, an out-of-enum wait_for, an at-the-cap value that must pass, injected no-target and both-targets posts, a bare mint-complete with only flags, and three broken install manifests (no entry point, lowercase entry point, flattened reference). The version scan checks every stated version and binds the field-report exemption to the matched line, so one Tier-2 line cannot license a stale claim elsewhere. R5: verification.md now qualifies collect's accept/verify/pay/materialise and attempt-id idempotence as the PAID path, adds the free response shape and the probe-only expired-retry limit, and narrows the offline-suite description to the schema features the gate actually reads. Discovery description updated to match the self-contained install. Gates: muse-buyer-skill.test.mjs -> 34 pass, 0 fail; build.test.mjs -> 8 pass, 0 fail (discovery description changed).
…gate does The published sentence promised that ANY unrecognised schema constraint makes the offline check fail closed. It does not: the checker extracts selected fields and never enumerates unknown constraint keys, so a property carrying an extra minLength would be reduced to its recognised fields rather than rejected. Narrowed to the two implemented cases — a recognised minimum/maximum written as a named constant that cannot be resolved to a number, and an array items constraint that cannot be read — and states plainly that arbitrary unknown keywords are ignored, not detected. Sentence only: no validator change, no new gate, no test change. Historical gate evidence stands unchanged (muse-buyer-skill.test.mjs 34 pass / 0 fail; build.test.mjs 8 pass / 0 fail at 5143ca8).
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
bobscully3
marked this pull request as ready for review
September 10, 2026 14:01
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
The Muse layer of the buyer path, as one new public skill:
maxplayer-muse-buyer.A Muse account has a workspace, a scheduler and no shell of its own. The existing
maxplayer-buyer-operateskill assumes none of that, and this one does not restate it —it adds only what is Muse-specific: where the bundle installs, why
MAXPLAYER_HOMEhas tobe set on the MCP server process, the two-step funding that needs a human's number before
the first invoice, the approval every paid post needs afresh, and what "paid" means when
the daemon settles in the background.
Buyer only. No seller bridge, no scheduler, no seller docs, no seller registry entry.
Scope
web/app/.well-known/skills/muse-buyer/{skill.md, references/verification.md, references/settlement.md}web/app/test/muse-buyer-skill.test.mjsweb/app/.well-known/skills/index.json— one entry added afterbuyer-operate; all seven existing entries untouchedweb/app/.well-known/skills/default/skill.md— one homepage link, whichtest/build.test.mjsrequires for any indexed skill6 files, +694/−0. No source, build, crate or CI change.
Source-checked against this tree at 0.5.8
The earlier draft of this material leaned on 0.5.7 field reports. Every claim below was
re-read in this base's source:
post_jobrequirestask,output,amount_sats. Every published example carriesoutput, because a post without it is refused.paymentis a declared enum (sat|none) here, and the buyer path enforces it: anunrecognised value is refused, and
payment=nonedemandsamount_sats=0. The free-jobexample obeys that rule.
additionalProperties: false, butPostJobParamsdeserializeswithout
deny_unknown_fields. The skill separates the advertised contract fromproven enforcement rather than promising a mistyped optional field is caught.
award_claim's requiredjob_id/claim_idare shown, with the write-once award andthe first-call
max_satsceiling explained.maxplayer buyerrefuses--homeand namesMAXPLAYER_HOME;wallet setupwithno amount silently requests 21 sats. The skill therefore has the human pick the number
first and invokes
setupexactly once.references/settlement.mdcovers the two things that cost people money: the buyerwatcher settles delivered jobs in the background with no
collectcall, andcollectcan pay and then fail to materialise — whose supported recovery is re-running
collectfor the same
job_id. There is no blanket no-charge assurance anywhere in the bundle,and a test forbids one being added.
Offline gate
One deterministic command. No network, relay, mint, daemon or sats:
20 pass (node v26.5.0). It checks a fresh-home install from the skill's own manifest
with every link resolving locally, manifest/shipped-file agreement in both directions, no
absolute home path or key or invoice or balance in anything shipped, the 10,000-character
core budget, the pinned version, every published example against the schema read out of
this tree's
mcp.rs, and the discovery index keeping every pre-existing entry.Several tests fail loudly if the source moves under them — the free-job rule, the
--homerefusal test names, the 21-sat default, the absence ofdeny_unknown_fields— soa claim going stale becomes a red test instead of a wrong instruction.
node --test web/app/test/build.test.mjsalso stays green (8 pass), which is what provesthe new entry reaches the built discovery document.
Disclosures
fresh Muse account, discovered it there, funded a wallet, posted a job or collected a
delivery. The offline suite is a bundle-and-schema gate and is labelled as one.
references/verification.mdstates the tier of every claim and exactly what would closethe gate.
version from this base, and is labelled field-reported wherever it appears.
It deliberately publishes no tunnel,
/etc/hostsoverlay or proxy workaround.Relationship to #985
#985 stays held as the earlier seller/mixed work; this branch is buyer-only and cut fresh
from current
main, so the two do not overlap in file scope. Nothing here depends on theseller bridge landing.
Draft: human review and human merge required.
Update — advisor R1–R5 corrections (head
9661fcf)Second commit on the same branch, applying the review verdict on
834d17dewith noscope change: buyer only, seller work untouched.
wallet setup's printedquote_idis now shown, andmint-completetakes it positionally — without exactly one quote id it exits
USAGE_ERROR, so theprevious bare command was unusable.
post_jobexample picks a target mode(
seller_pubkeyoruntargeted: true); a post with neither, or both, is refused injob_lifecycle.rs. The approval gate is five items including who may take the job,a free job now needs its own yes for publishing the task text publicly, and a
max_satsthe schema would accept is stated not to be new authority.lands as uppercase
SKILL.md; the requiredbuyer-operatecompanion is mapped andfetchable; the MCP prerequisite ships a launchable registration (
maxplayer mcpwith anabsolute
MAXPLAYER_HOME), with Muse-side registration labelled Not verified.rather than field names, and the checker is proved by negatives (string
amount_sats,invalid
payment, non-booleanuntargeted, undeclared field, missingtask). Newnegative coverage: missing target mode, bare
mint-complete, install entry point,companion closure. The version assertion is exact equality against
Cargo.toml, and anyother stated maxplayer version fails unless labelled a field report.
references/settlement.mdscopes the pay/attempt_idlanguage to paid jobs, documents the free response shape (
state: "none", nullattempt_id,amount_sats: 0, nospent_total_sats) and says the missing field isnot a zero lifetime spend. Retry is described as preserving the pinned award,
probe-only after expiry and able to stay unresolved, with recovery bound to the same
job id and
MAXPLAYER_HOME.skill.mdwas trimmed to 9,990 characters to stay inside its own 10,000-character budgetafter these additions; the removed text was detail that already lives in the references.
Gate on this head:
node --test web/app/test/muse-buyer-skill.test.mjs→ 30 pass, 0fail, exit 0 (was 20/0/0 at
834d17de; the ten new tests are the R4 negatives and theR1/R3/R5 assertions). Nothing else was run: the delta touches no discovery entry or
homepage link.
The clean-account Muse acceptance gate remains UNPASSED, and no spend, wallet access
or live posting occurred for this update either.
Update 2 — R3/R4 residuals and R5 consistency (head
5143ca8)Third commit on the same branch. Scope: the residuals the second review named, nothing
else. Seller work stays paused.
Corrections to what Update 1 above claimed. Two of its claims were ahead of the code
and are now made true rather than left standing:
source wrote it as digits, so
get_job.timeout_secs.maximum = long_poll::WAIT_FOR_CAP_SECSbecame
nulland an example withtimeout_secs: 11would have passed while the serverrefuses anything above 10;
only inspected the shipped positive artifacts.
R3 — self-contained bundle. The required
buyer-operatecompanion install isremoved rather than repaired. That was the narrower of the two options the review
offered, and it ends the contradiction directly: nothing this gate never checks can ship
next to the skill telling the reader that
modelis a preference (it is a hard awardfilter), that a retry converges (an expired attempt is probe-only), or to hand off to a
debug-buyingpage that was never mapped. The core now states it needs no other skill andthat it governs where older buyer material disagrees. A test asserts no manifest row
and no markdown link leaves the bundle, and that no other skill is named as a dependency.
The discovery description was updated to match, which is why
build.test.mjswas re-run.R4 — bounds resolved or failed closed. A bound written as a Rust constant is resolved
from the source that defines it; an unresolvable name fails the gate instead of
silently vanishing. Array
itemstypes are checked or fail closed. New negatives, eachasserted to be caught: below-minimum (
amount_sats: -1,timeout_secs: 0),above-maximum (
timeout_secs: 11), out-of-enumwait_for, a value exactly at the capthat must pass, a post with no target mode, a post with both, a bare
mint-completecarrying only flags, and three broken install manifests (no entry point, lowercase entry
point, flattened reference path). The version scan now checks every stated version and
binds the field-report exemption to the matched line, closing the loophole where one
Tier-2 line licensed a stale claim elsewhere.
R5 — bundle consistency.
references/verification.mdqualifiesaccept → verify → pay → materialise and attempt-id idempotence as the paid path,
adds the free response shape and the probe-only expired-retry limit as source-checked
rows, and narrows the offline-suite description to the schema features the gate actually
reads.
Gates on this head:
node --test web/app/test/muse-buyer-skill.test.mjs→ 34 pass, 0fail;
node --test web/app/test/build.test.mjs→ 8 pass, 0 fail (run because thediscovery description changed). History: 30/0/0 at
9661fcf, 20/0/0 at834d17de.skill.mdis 9,982 characters. Clean-account Muse install/discovery/funding/post/collectproof remains UNPASSED and needs separate human authorisation. No spend, wallet
access, live posting, main push, merge or deploy occurred for this update.