Skip to content
Agentmart
Submit a tool

marketplace-core

Build an apply loop for a new gig marketplace.

Skill by Daisuke134

IndexedMIT★ 8
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/daisuke134-marketplace-core

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Build an apply loop for a new gig marketplace. Read before adding a platform, before writing any discovery/judgement/reporting code for one, or when an existing lane applies to nothing and its own reports do not say why.

Use cases: writing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/marketplace-core

What's inside

Skill name
marketplace-core
Description
Build an apply loop for a new gig marketplace. Read before adding a platform, before writing any discovery/judgement/reporting code for one, or when an existing lane applies to nothing and its own reports do not say why.
License
MIT
Instructions
108 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts
  • Instructions call the network

Files (52)

  • SKILL.md
  • event.schema.json · schemas/
  • opportunity.schema.json · schemas/
  • payment.schema.json · schemas/
  • work_fit_judgement.schema.json · schemas/
  • application_transaction.py · scripts/
  • apply_policy.py · scripts/
  • contracts.py · scripts/
  • dom_contract.py · scripts/
  • effect_notification.py · scripts/
  • financial_record.py · scripts/
  • form_observer.py · scripts/
  • lane_summary.py · scripts/
  • ledger.py · scripts/
  • listing_catalog.py · scripts/
  • paid_handoff.py · scripts/
  • paid_kernel.py · scripts/
  • platform_enrollment.py · scripts/
  • reconcile_paid_no_effect.py · scripts/
  • reconcile_pre_effect_hint.py · scripts/
  • reply_composer.py · scripts/
  • reply_grounding.py · scripts/
  • reply_kernel.py · scripts/
  • reply_planner.py · scripts/
  • telegram_delivery.py · scripts/
  • telegram_outbox.py · scripts/
  • work_fit.py · scripts/
  • requirements.html · tests/fixtures/form_observer/
  • single_page_form.html · tests/fixtures/form_observer/
  • single_select_form.html · tests/fixtures/form_observer/
  • wizard.html · tests/fixtures/form_observer/
  • wizard_diff_hash.html · tests/fixtures/form_observer/
  • mercor-full-chain.json · tests/fixtures/
  • test_application_transaction.py · tests/
  • test_apply_policy.py · tests/
  • test_apply_transport_portability.py · tests/
  • test_contracts.py · tests/
  • test_dom_contract.py · tests/
  • test_effect_notification.py · tests/
  • test_financial_record.py · tests/
  • test_form_observer.py · tests/
  • test_lancers_delivery_mapping.py · tests/
  • test_listing_catalog.py · tests/
  • test_outbox_claim_fence.py · tests/
  • test_paid_kernel.py · tests/
  • test_platform_enrollment.py · tests/
  • test_reply_grounding.py · tests/
  • test_reply_kernel.py · tests/
  • test_reply_planner.py · tests/
  • test_skill_matches_the_code.py · tests/
  • test_work_fit.py · tests/
  • test_work_fit_judge.py · tests/

SKILL.md (first lines)

# marketplace-core — one apply loop, many marketplaces

An apply loop does seven things. Only three of them are about the marketplace.

```
① find postings      platform-specific
② judge fitness      SHARED
③ write the proposal SHARED
④ submit             platform-specific
⑤ read back          platform-specific
⑥ report             SHARED
⑦ remember           SHARED
```

A new platform is `①④⑤` and nothing else. If you find yourself writing a refusal
rule, a Telegram message or a duplicate check, stop: it exists here already, and a
second copy will drift. Measured 2026-09-07, Coconala's private copy of the
refusals was missing `manual_marketplace_operation` and
`original_illustration_or_modelling`, applied 20-30 times a day to 出品代行 and
イラスト作成 for a week, and the marketplace restricted the account.

## What you write

```python
discover(category_or_query) -> [posting]   # the platform's own facet, not guessed nouns
fetch(posting_id)           -> text        # enough body to judge on
submit(posting, proposal)   -> receipt_id  # the irreversible bit
readback(receipt_id)        -> bool        # the platform's own record, not yours
```

## What you get

| module | for |
|---|---|
| `work_fit.py` | ② `HARD_PROHIBITION_CLASSES` (12) for text, `category_refusal()` for a bare label, `judge()` when the lane has no planner |
| `listing_catalog.py` | ① `listing_terms()` / `search_terms()` — what the owner sells, as search nouns |
| `application_transaction.py` | ⑦ claim → submit → readback, so a crash cannot double-apply |
| `ledger.py` | ⑦ the receipt record |
| `telegram_outbox.py` | ⑥ fencing, retry, and suppression of an unchanged message |
| `telegram_delivery.py` | ⑥ the send itself — no external CLI |
| `lane_summary.py` | ⑥ the wake sentence |
| `dom_contract.py` | ④⑤ a selector that names itself when it stops matching |
| `platform_enrollment.py` | Meta Loop: policy、thin adapter、funded work、公式canary/readback、replay-zero、positive net economicsを一つのpromotion gateへ束ねる |

## Seven traps, each measured

**1. Ask the board, don't guess nouns.** Lancers: keyword 「業務システム」 returns 3
postings; `/system` returns 23, `/writing` 30. Five category requests see three
times what twelve keyword requests do, at under half the request rate.

**2. Filter at the source.** 27 of 30 Lancers cards were 求人 — fetched, parsed,
normalised and counted before being discarded. `type[]=project` drops them before
they cost anything.

**3. Count every way out.** A CrowdWorks wake reported `inspected: 63` against
counters summing to 26. The other 37 left through a bare `continue`. A lane that
refuses without saying why cannot be repaired from its own reports, and the
counters are all the owner sees.

**4. One error name per failure, not per file.** `proposal_form_changed` was raised
from 41 places in one file and recorded by 3. It cost a day. Every raise site must
name its function and line, and any handler that *relabels* an exception must
record the original first — two such handlers made the recorder look broken.

**5. A cache that never wrote is worse than none.** Lancers' skip cache called
`hashlib` without importing it; the caller swallowed every exception with a comment
explaining why a cache failure must not stop applications. It never stopped one. It
never cached one either, so every refusal was re-judged by the planner every minute
and the 20-row batch filled with work already refused.

**6. Slices, and a reason to read the next one.** A wake reads the union in slices
of `MAX_OPPORTUNITIES`. Continue on *both* "nothing eligible here" and "all of these
are already claimed" — the second is exactly when the next slice matters, and
skipping it hid 80 of 100 fetched rows.

**7. A promoted rule must be re-read against the new catalogue.**
`mandatory_desktop_or_browser_operations` was correct on Coconala and, hours after
being shared, refused RPA scenario building and a system migration on Lancers —
that platform's core work. Building, migrating and publishing through a tool are
deliveries; only operating it for hours is not.

## Order of work

1. `discover` against the platform's own facet, and count what you drop.
2. `fetch` + `work_fit` before anything is submitted. **A lane that applies before
   it can refuse is the one that loses the account.**
3. `application_transaction` around `submit`/`readback`.
4. Report through the outbox with the title, the price and the receipt id — a real
   application must say more than a refusal does.
5. Only then widen discovery. Widening before submission is proven produces skips.

## Reading a lane that applies to nothing

In this order, because each is cheaper than the last:

```
台帳       ~/.local/state/anicca/<platform>/…       what actually happened
wake summary  eligible_count vs verified_count      found vs landed
counters      do they sum to inspected?             what left silently
evidence      *-changes.jsonl                       which selector, which posting
Telegram      skills/tools/telegram-user            what the owner really receives
```

The lane's own log is the *last* place to look, not the first. Twice on
2026-09-07 the reported error named the wrong thing: `planner_runner_failed` was a
full disk, and `proposal_form_changed` was a relabelled browser timeout.

From Daisuke134/life-manager, MIT.

More from Daisuke134/life-manager

Signals

Stars
8
Forks
2
Open issues
2,737
Last commit (this folder)
Oct 24, 2026 (4 days ago)
Last release
Aug 15, 2026 (2 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from Daisuke134

Cite this page

marketplace-core skill. Agent Mart. https://agentmart.dev/skills/daisuke134-marketplace-core (last updated 2026-10-24)