Own catalogue in a second company; models self-hosted on premises
Decisions (Alexander, 26 Oct 2026): a second company, not the plant company, holds the catalogue; it owns and licenses titles; language models are self-hosted on premises. catalogue-intelligence.md reworked: the catalogue company is a customer of the plant at arm's length (orders through intake and portal, the plant's price list, standby pressing offered to every customer, no moved dates, no data either way, metal in the archive on customer terms; Revenue Code section 71 bis, 200M THB disclosure threshold per the OECD profile), its own ERPNext site, the run-size rule on the plant's price instead of its direct cost, its own advisor instance on hardware it controls, phasing, cost borne by it, risks, open decisions (shareholders and Poy Records, working capital, standby terms, where its systems run). Mirrors: README (planning bullet, project status), roadmap item 28, digital-factory (tool rule, language-model row in the open-source table), artist-platform (standby pressing proposal, pre-orders), production-timeline, revenue-model, plant-assistant (self-hosted on premises; catalogue data removed; advisor as a separate instance).
This commit is contained in:
1 parent
15d28d2e0b
commit
3d9bb9af53
8 files changed
+284
-199
No files matched your search
@@ -65,6 +65,11 @@ steps are open planning items.
|
|||||||
Payap land would need checking
|
Payap land would need checking
|
||||||
([site candidates](docs/site-candidates.md),
|
([site candidates](docs/site-candidates.md),
|
||||||
[Payap partnership](docs/payap-partnership.md)).
|
[Payap partnership](docs/payap-partnership.md)).
|
||||||
|
- A second company, separate from the plant company, is to hold a record
|
||||||
|
catalogue (owned and licensed titles) and have it pressed at the plant
|
||||||
|
as a customer; language models in the project are self-hosted on
|
||||||
|
premises (decided October 2026;
|
||||||
|
[own catalogue](docs/catalogue-intelligence.md)).
|
||||||
- A collaboration with [ResurRec](https://www.resurrec.com/) is under
|
- A collaboration with [ResurRec](https://www.resurrec.com/) is under
|
||||||
discussion. ResurRec has since opened a plant in Japan with automatic
|
discussion. ResurRec has since opened a plant in Japan with automatic
|
||||||
presses, identified from photos as new Pheenix AD12s (October 2026;
|
presses, identified from photos as new Pheenix AD12s (October 2026;
|
||||||
@@ -225,12 +230,13 @@ The detail lives in dedicated documents:
|
|||||||
(for artists, labels and any other customer), and optionally launch a
|
(for artists, labels and any other customer), and optionally launch a
|
||||||
fan-funded campaign that the plant presses and ships to each fan once
|
fan-funded campaign that the plant presses and ships to each fan once
|
||||||
enough have pre-ordered, with refunds if not
|
enough have pre-ordered, with refunds if not
|
||||||
- [Own catalogue](docs/catalogue-intelligence.md): the idea of a catalogue
|
- [Own catalogue](docs/catalogue-intelligence.md): a second company, not
|
||||||
the plant presses for itself (Poy Records as the seed), with a
|
the plant company, owns and licenses a record catalogue and has it
|
||||||
catalogue dashboard, a map of where the records sell, a demand model
|
pressed at the plant as a customer at arm's length (standby runs in
|
||||||
that says what to repress and how many, and an advisor agent for
|
idle press time); its catalogue dashboard, map of where the records
|
||||||
market opportunities, all on ERPNext and the open-source fleet; filler
|
sell, demand model for what to repress and how many, and an advisor
|
||||||
for idle press time, not in the business plan
|
agent on a self-hosted, on-premises model; not in the plant's
|
||||||
|
business plan
|
||||||
- [Order a record](docs/order.html): the order tool as a step-by-step
|
- [Order a record](docs/order.html): the order tool as a step-by-step
|
||||||
configurator after the Mobineko pattern (step rail, choices, a large live
|
configurator after the Mobineko pattern (step rail, choices, a large live
|
||||||
record picture, running price and ship date, a "how to pay" step with
|
record picture, running price and ship date, a "how to pay" step with
|
||||||
|
|||||||
@@ -451,9 +451,9 @@ without a new cut) and a repress takes
|
|||||||
([production timeline](production-timeline.md)). The campaign page can
|
([production timeline](production-timeline.md)). The campaign page can
|
||||||
reopen as "pre-order the repress, pressed when 100 more are in", which
|
reopen as "pre-order the repress, pressed when 100 more are in", which
|
||||||
turns one release into a recurring one. This is the part a plant with
|
turns one release into a recurring one. This is the part a plant with
|
||||||
in-house plating can offer and a broker cannot. The same pre-order is
|
in-house plating can offer and a broker cannot. The planned catalogue
|
||||||
the market test for titles of our own
|
company can use the same pre-order as the market test for its titles, on
|
||||||
([own catalogue](catalogue-intelligence.md)).
|
the same terms as any label ([own catalogue](catalogue-intelligence.md)).
|
||||||
|
|
||||||
## For labels and regular customers
|
## For labels and regular customers
|
||||||
|
|
||||||
@@ -463,7 +463,11 @@ The same calculator and upload path, with an account:
|
|||||||
- direct orders with a deposit instead of a campaign;
|
- direct orders with a deposit instead of a campaign;
|
||||||
- the three gates approved in the customer portal
|
- the three gates approved in the customer portal
|
||||||
([digital factory](digital-factory.md), modules 1 to 3 and 10);
|
([digital factory](digital-factory.md), modules 1 to 3 and 10);
|
||||||
- bulk delivery, dropshipping, or both.
|
- bulk delivery, dropshipping, or both;
|
||||||
|
- standby pressing (proposal, October 2026): a flexible date scheduled
|
||||||
|
into idle press time at a lower price, on the same terms for every
|
||||||
|
customer, the related catalogue company included
|
||||||
|
([own catalogue](catalogue-intelligence.md#arms-length-between-the-two-companies)).
|
||||||
|
|
||||||
## How it is built
|
## How it is built
|
||||||
|
|
||||||
|
|||||||
+245
-174
@@ -1,18 +1,33 @@
|
|||||||
# Own Catalogue: Sales Map, Demand Forecast and Market Advisor
|
# Own Catalogue: Sales Map, Demand Forecast and Market Advisor
|
||||||
|
|
||||||
The idea (Alexander, 26 October 2026): if CNX owns a catalogue it can
|
The idea (Alexander, 26 October 2026): with a catalogue of its own to
|
||||||
press, its sales by shop, region and location can drive a model that says
|
press, sales by shop, region and location can drive a model that says
|
||||||
what to press next. That needs three things: a **catalogue dashboard**
|
what to press next. That needs three things: a **catalogue dashboard**
|
||||||
with a **map of where the records sell**, a **demand model** that turns
|
with a **map of where the records sell**, a **demand model** that turns
|
||||||
those sales into press decisions, and an **advisor agent** that points at
|
those sales into press decisions, and an **advisor agent** that points at
|
||||||
market opportunities. This document plans all three on the systems the
|
market opportunities.
|
||||||
plant already intends to run. It is a planning position: every figure
|
|
||||||
without a source is an estimate, and nothing here is in the business
|
|
||||||
plan's revenue.
|
|
||||||
|
|
||||||
## Why a pressing plant should own a catalogue
|
**Decided the same day (Alexander):**
|
||||||
|
|
||||||
- **It fills press time the plan does not sell.** At the planned 60 %
|
- **A second company holds the catalogue, not the plant company.** It
|
||||||
|
owns titles and licenses titles, and has its records pressed at the
|
||||||
|
plant as a customer.
|
||||||
|
- **It owns and licenses**: owned masters and licensed reissues are both
|
||||||
|
in scope.
|
||||||
|
- **Language models are self-hosted, on premises**, for the catalogue
|
||||||
|
company's advisor as for the [plant assistant](plant-assistant.md); no
|
||||||
|
hosted AI service.
|
||||||
|
|
||||||
|
This document plans the catalogue company's tools on the same open-source
|
||||||
|
stack the plant runs, and the line between the two companies. It is a
|
||||||
|
planning position: every figure without a source is an estimate. Nothing
|
||||||
|
here is in the plant's business plan: the catalogue company's orders
|
||||||
|
would reach the plant as ordinary customer orders, and its capital is its
|
||||||
|
own.
|
||||||
|
|
||||||
|
## Why a catalogue company next to the plant
|
||||||
|
|
||||||
|
- **It can fill press time the plan does not sell.** At the planned 60 %
|
||||||
specials, specials run only on the Duplex system, and the Classic runs
|
specials, specials run only on the Duplex system, and the Classic runs
|
||||||
at about two thirds of its ~128 records an hour
|
at about two thirds of its ~128 records an hour
|
||||||
([revenue model](finance/revenue-model.md#operating-picture-of-the-launch-plant-october-2026)).
|
([revenue model](finance/revenue-model.md#operating-picture-of-the-launch-plant-october-2026)).
|
||||||
@@ -20,15 +35,15 @@ plan's revenue.
|
|||||||
effectiveness, 16 hours and 300 days that is **~60,000 to 160,000
|
effectiveness, 16 hours and 300 days that is **~60,000 to 160,000
|
||||||
records a year** (estimate), black and solid colours only. At the
|
records a year** (estimate), black and solid colours only. At the
|
||||||
calculator's planning rate the launch plant is balanced and that spare
|
calculator's planning rate the launch plant is balanced and that spare
|
||||||
time disappears, so the catalogue is a filler for idle hours, not a
|
time disappears, so the catalogue company's runs are fillers for idle
|
||||||
reason to buy presses.
|
hours, not a reason to buy presses.
|
||||||
- **A repress is the plant's shortest and cheapest order.** The father
|
- **A repress at the plant is short.** The father and mother of every
|
||||||
and mother of every side are archived, so a repress skips cutting and
|
side are archived, so a repress skips cutting and the three artist
|
||||||
the three artist gates and takes **~7 to 11 working days**; a mother
|
gates and takes **~7 to 11 working days**; a mother gives about ten
|
||||||
gives about ten stamper sets and a father 5 to 10 mothers
|
stamper sets and a father 5 to 10 mothers
|
||||||
([production timeline](production-timeline.md#repress-the-shortest-path-in-the-plant)).
|
([production timeline](production-timeline.md#repress-the-shortest-path-in-the-plant)).
|
||||||
A label that has to order from a plant abroad presses big runs months
|
A label that orders from a plant abroad presses big runs months ahead
|
||||||
ahead and carries the stock. A label inside a plant with its own metal
|
and carries the stock. A label next to a plant with its metal in the
|
||||||
archive can press **small runs often, against measured demand**. That
|
archive can press **small runs often, against measured demand**. That
|
||||||
is what makes a demand model worth having: it is asked every few weeks,
|
is what makes a demand model worth having: it is asked every few weeks,
|
||||||
for a few hundred records, not once a year for thousands.
|
for a few hundred records, not once a year for thousands.
|
||||||
@@ -51,29 +66,59 @@ plan's revenue.
|
|||||||
new record sells for "tight"
|
new record sells for "tight"
|
||||||
([Phile-web, 15 October 2024](https://www.phileweb.com/news/audio/202410/15/25744.html),
|
([Phile-web, 15 October 2024](https://www.phileweb.com/news/audio/202410/15/25744.html),
|
||||||
[BRUTUS, 2025](https://brutus.jp/en/post-430468/)). A catalogue earns the
|
[BRUTUS, 2025](https://brutus.jp/en/post-430468/)). A catalogue earns the
|
||||||
retail or wholesale price instead of a pressing fee, and carries stock,
|
retail or wholesale price, and carries stock, rights and marketing in
|
||||||
rights and marketing in exchange.
|
exchange.
|
||||||
|
|
||||||
## What counts as our catalogue
|
**What the split does (our reading).** Stock, licence advances, royalty
|
||||||
|
accounting and the risk of a title that does not sell sit in the
|
||||||
|
catalogue company, not in the plant company, its BOI promotion or the
|
||||||
|
capital plan its shareholders fund
|
||||||
|
([total investment](finance/total-investment.md)). The plant stays a
|
||||||
|
neutral supplier to every label, including this one.
|
||||||
|
|
||||||
| Kind | What it is | In scope |
|
## What the catalogue company holds
|
||||||
|---|---|---|
|
|
||||||
| Poy Records releases | Titles whose masters the label owns; SST in Frankfurt cut lacquers for POY003, 005, 006 and 013 ([equipment suppliers](suppliers/equipment-suppliers.md)) | yes, the seed and the first data |
|
|
||||||
| Licensed reissues | Masters licensed for vinyl: territories, term, sell-off period, royalty per unit, advance | a decision (see Open decisions) |
|
|
||||||
| Customers' titles | Records the plant presses for artists and labels | **no**: their sales are their data |
|
|
||||||
|
|
||||||
Two rules follow from the third row:
|
| Kind | What it is |
|
||||||
|
|---|---|
|
||||||
|
| Owned titles | Masters the company owns. Poy Records' releases are the obvious first ones (SST in Frankfurt cut lacquers for POY003, 005, 006 and 013, [equipment suppliers](suppliers/equipment-suppliers.md)); whether they move into the new company, or Poy Records becomes that company, is open |
|
||||||
|
| Licensed titles | Masters licensed for vinyl: territories, term, sell-off period, royalty per unit, advance and recoupment |
|
||||||
|
|
||||||
- **Customers' data never trains our catalogue decisions.** Order sizes,
|
Which titles, in which territories and until when, is the first list to
|
||||||
represses and shipping addresses of customer titles stay theirs. A
|
write; nothing below can be tested without it.
|
||||||
customer can opt in to share aggregate sales; nobody is opted in by
|
|
||||||
default.
|
|
||||||
- **Customer orders come first on the presses.** Catalogue runs fill
|
|
||||||
idle slots and never move a customer's date. A label that suspects its
|
|
||||||
plant favours its own releases goes elsewhere.
|
|
||||||
|
|
||||||
Which titles Poy Records holds, in which territories and until when, is
|
## Arm's length between the two companies
|
||||||
the first list to write; nothing below can be tested without it.
|
|
||||||
|
The catalogue company is **a customer of the plant like any label**, and
|
||||||
|
both sides keep it that way:
|
||||||
|
|
||||||
|
- **Orders** go through the plant's order intake and customer portal
|
||||||
|
with a customer account and the same gates
|
||||||
|
([artist platform](artist-platform.md#for-labels-and-regular-customers)).
|
||||||
|
A purchase order in the catalogue company's books becomes a sales order
|
||||||
|
and a work order in the plant's ERPNext; the plant's invoice becomes a
|
||||||
|
purchase invoice on the other side.
|
||||||
|
- **Prices** come from the plant's price list. Runs that fill idle slots
|
||||||
|
can be sold as **standby pressing** (a flexible date, scheduled into
|
||||||
|
idle press time, at a lower price), offered on the same terms to every
|
||||||
|
customer, so the related company gets nothing another label could not
|
||||||
|
(proposal; price and terms open). Thai law lets the Revenue Department
|
||||||
|
adjust prices between related companies to arm's length (Revenue Code
|
||||||
|
section 71 bis), and related companies with more than 200 million THB
|
||||||
|
of revenue a year file a disclosure form
|
||||||
|
([OECD transfer pricing profile, Thailand](https://www.oecd.org/content/dam/oecd/en/topics/policy-sub-issues/transfer-pricing/transfer-pricing-country-profile-thailand.pdf)).
|
||||||
|
Whether the two companies are related in that sense depends on who
|
||||||
|
holds the shares, which is open.
|
||||||
|
- **Press dates.** The plant never moves another customer's date for the
|
||||||
|
catalogue company. A label that suspects its plant favours a related
|
||||||
|
label goes elsewhere.
|
||||||
|
- **Data.** The plant's customers' orders, sizes and addresses never
|
||||||
|
reach the catalogue company, and the catalogue company's sales never
|
||||||
|
reach the plant. In the portal it sees what any customer sees: its own
|
||||||
|
orders, its metal parts in the archive and the standby calendar.
|
||||||
|
- **Metal.** Its fathers and mothers sit in the plant's archive under the
|
||||||
|
same storage and retention terms as every customer's, which the
|
||||||
|
customer contract still has to state
|
||||||
|
([production timeline](production-timeline.md#repress-the-shortest-path-in-the-plant)).
|
||||||
|
|
||||||
## The questions the system answers
|
## The questions the system answers
|
||||||
|
|
||||||
@@ -81,28 +126,28 @@ the first list to write; nothing below can be tested without it.
|
|||||||
sells.
|
sells.
|
||||||
2. **How many**: a run sized to the demand of the next few months, since
|
2. **How many**: a run sized to the demand of the next few months, since
|
||||||
the next repress is two weeks away.
|
the next repress is two weeks away.
|
||||||
3. **Which variant**: black or a colour, within what the presses can
|
3. **Which variant**: black or a colour, within what the plant can make
|
||||||
make (catalogue specials compete with customer specials on the Duplex;
|
(specials compete with every customer's specials on the Duplex; black
|
||||||
black and solid colours go on the Classic's idle hours).
|
and solid colours suit standby runs on the Classic's idle hours).
|
||||||
4. **Where the stock goes**: the plant, a distributor, or a shop on
|
4. **Where the stock goes**: its own store room, a distributor, or a shop
|
||||||
consignment.
|
on consignment.
|
||||||
5. **Which titles to add**: licensing leads for a human to research.
|
5. **Which titles to add**: licensing leads for a person to research.
|
||||||
|
|
||||||
## Data sources
|
## Data sources
|
||||||
|
|
||||||
| Source | What it gives | Location detail | Access and terms | Lands in |
|
| Source | What it gives | Location detail | Access and terms | Lands in |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| Own web shop, direct shop accounts, event sales (Poy Festival merch table) | Every sale with its ship-to or the event's place | postcode or city; the event venue | ours | ERPNext: Sales Invoice, POS Invoice, Delivery Note |
|
| Own web shop, direct shop accounts, event sales (Poy Festival merch table) | Every sale with its ship-to or the event's place | postcode or city; the event venue | the company's own | its ERPNext: Sales Invoice, POS Invoice, Delivery Note |
|
||||||
| Distributor statements | Units per account (shop) and territory per month, returns | shop or territory | the distribution agreement must require monthly sell-through by account, not only sell-in | ERPNext: Channel Sales Report (new, below) |
|
| Distributor statements | Units per account (shop) and territory per month, returns | shop or territory | the distribution agreement must require monthly sell-through by account, not only sell-in | its ERPNext: Channel Sales Report (new, below) |
|
||||||
| Consignment shops | Monthly stock count, so sell-through per shop | the shop | the consignment agreement | ERPNext: Channel Sales Report, consignment warehouse per shop |
|
| Consignment shops | Monthly stock count, so sell-through per shop | the shop | the consignment agreement | its ERPNext: Channel Sales Report, consignment warehouse per shop |
|
||||||
| Bandcamp | Raw sales report with the buyer's ship-to city, state, postcode and country for physical items; also as JSON through the Sales API ([help](https://get.bandcamp.help/en/articles/15263368-reading-your-raw-data-sales-report), [API](https://bandcamp.com/developer/sales)) | postcode or city | the label's own account | ERPNext: Sales Invoice per Bandcamp payout with lines, or Channel Sales Report |
|
| Bandcamp | Raw sales report with the buyer's ship-to city, state, postcode and country for physical items; also as JSON through the Sales API ([help](https://get.bandcamp.help/en/articles/15263368-reading-your-raw-data-sales-report), [API](https://bandcamp.com/developer/sales)) | postcode or city | the label's own account | its ERPNext: Sales Invoice per Bandcamp payout with lines, or Channel Sales Report |
|
||||||
| Record passport registrations | A buyer scans the sleeve code and, opting in, gives country and city: the end listener's place even when the record went through a shop or distributor | city | consent on the form; no IP address stored ([traceability](traceability.md)) | machine-data store, per-record rows keyed to the record key |
|
| Record passport registrations | A buyer scans the sleeve code and, opting in, gives country and city: the end listener's place even when the record went through a shop or distributor | city | consent on the form; no IP address stored; the plant runs the passport for every customer and passes a customer's registrations on to it as its processor ([traceability](traceability.md)) | its analytics store, per-record rows keyed to the record key |
|
||||||
| Streaming of our own artists | Top countries and cities per artist and per song in Spotify for Artists ([Spotify](https://artists.spotify.com/en/blog/how-to-read-your-spotify-for-artists-data)); country totals in the distributor's streaming statements | country, top cities | only for artists we release | machine-data store, weekly series |
|
| Streaming of its own artists | Top countries and cities per artist and per song in Spotify for Artists ([Spotify](https://artists.spotify.com/en/blog/how-to-read-your-spotify-for-artists-data)); country totals in the distributor's streaming statements | country, top cities | only for artists it releases | its analytics store, weekly series |
|
||||||
| Interest list and pre-orders | "Tell me when it is pressed" sign-ups and campaign pre-orders on the [artist platform](artist-platform.md) | country, city | consent on sign-up | ERPNext: Lead, Campaign, Payment Entry |
|
| Interest list and pre-orders | "Tell me when it is pressed" sign-ups and pre-orders in its own shop, or through the plant's campaign service on the [artist platform](artist-platform.md) on the same terms as any label | country, city | consent on sign-up | its ERPNext: Lead, Sales Order with advance payments |
|
||||||
| Discogs monthly data dumps | Every release, version and pressing in the Discogs database: labels, countries, formats, identifiers ([data.discogs.com](https://data.discogs.com), CC0) | country of release | free to use (CC0) | a local index on the plant core, refreshed monthly |
|
| Discogs monthly data dumps | Every release, version and pressing in the Discogs database: labels, countries, formats, identifiers ([data.discogs.com](https://data.discogs.com), CC0) | country of release | free to use (CC0) | a local index on its own server, refreshed monthly |
|
||||||
| Discogs API: have/want counts, lowest price and copies for sale ([API](https://www.discogs.com/developers)) | The collectors' view of a title | none useful | **Restricted Data** (marketplace data by name; the have/want counts come from users' collections and wantlists, which the terms also restrict): no commercial use, no storage longer than needed, never shown more than six hours old, no marketing analytics without Discogs' written permission ([API Terms of Use](https://support.discogs.com/hc/en-us/articles/360009334593-API-Terms-of-Use), checked October 2026); 60 requests a minute | not stored; live look-ups by a person only, unless Discogs agrees in writing |
|
| Discogs API: have/want counts, lowest price and copies for sale ([API](https://www.discogs.com/developers)) | The collectors' view of a title | none useful | **Restricted Data** (marketplace data by name; the have/want counts come from users' collections and wantlists, which the terms also restrict): no commercial use, no storage longer than needed, never shown more than six hours old, no marketing analytics without Discogs' written permission ([API Terms of Use](https://support.discogs.com/hc/en-us/articles/360009334593-API-Terms-of-Use), checked October 2026); 60 requests a minute | not stored; live look-ups by a person only, unless Discogs agrees in writing |
|
||||||
| Market totals | Country production and sales series, e.g. RIAJ for Japan ([revenue model](finance/revenue-model.md#resurrec-japan-october-2026)) | country | public | a context layer on the map |
|
| Market totals | Country production and sales series, e.g. RIAJ for Japan ([revenue model](finance/revenue-model.md#resurrec-japan-october-2026)) | country | public | a context layer on the map |
|
||||||
| Events | Tours, festival slots, film or ad syncs, anniversaries, Record Store Day | city, date | entered by the team | ERPNext (a dated note on the Release) |
|
| Events | Tours, festival slots, film or ad syncs, anniversaries, Record Store Day | city, date | entered by the team | its ERPNext (a dated note on the Release) |
|
||||||
|
|
||||||
**Sell-in is not sell-through.** A distributor buying 300 copies says
|
**Sell-in is not sell-through.** A distributor buying 300 copies says
|
||||||
nothing about fans until the shops sell them; returns can come months
|
nothing about fans until the shops sell them; returns can come months
|
||||||
@@ -116,21 +161,27 @@ till could not.
|
|||||||
|
|
||||||
## Where the data lives (ERPNext touchpoints)
|
## Where the data lives (ERPNext touchpoints)
|
||||||
|
|
||||||
The plant's standing rule holds: ERPNext is the only system of record,
|
The catalogue company follows the rule the plant set for itself: ERPNext
|
||||||
our tools read and write it, and only machine-speed data stays outside
|
is its only system of record, its tools read and write it, and only
|
||||||
([digital factory](digital-factory.md#erpnext-the-plants-erp)).
|
machine-speed and signal data stays outside
|
||||||
|
([digital factory](digital-factory.md#erpnext-the-plants-erp)). It runs
|
||||||
|
**its own ERPNext site**, not a second company inside the plant's
|
||||||
|
ERPNext: separate books, a separate database and no shared users, so
|
||||||
|
neither company can see the other's records. The packaging the plant
|
||||||
|
plans to use runs several sites from one installation (frappe-nix with
|
||||||
|
per-site systemd units, [hosting on NixOS](digital-factory.md#hosting-on-nixos)).
|
||||||
|
|
||||||
| Object | In ERPNext | Outside (machine-data store) |
|
| Object | In its ERPNext | Outside (its analytics store) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Release, side, item per format and variant | existing custom Release and Side documents; Item per release, format and variant | none |
|
| Release, side, item per format and variant | custom Release and Side documents from the same `cnx_erp` app; Item per release, format and variant | none |
|
||||||
| Rights | **new** Licence document in `cnx_erp`: licensor, territories, term, sell-off end, royalty basis and rate, advance and recoupment; Release links to it; "owned" or "licensed" on the Release | none |
|
| Rights | **new** Licence document: licensor, territories, term, sell-off end, royalty basis and rate, advance and recoupment; Release links to it; "owned" or "licensed" on the Release | none |
|
||||||
| Royalties | royalty accrual per unit sold, posted as journal entries; a royalty statement print format per licensor | none |
|
| Royalties | royalty accrual per unit sold, posted as journal entries; a royalty statement print format per licensor | none |
|
||||||
| Places | Address gains latitude and longitude of its **postcode or city centroid** (custom fields, filled by the geocoder); shops are Customers in a "Shop" group with their exact location; regions are ERPNext Territories | none |
|
| Places | Address gains latitude and longitude of its **postcode or city centroid** (custom fields, filled by the geocoder); shops are Customers in a "Shop" group with their exact location; regions are ERPNext Territories | none |
|
||||||
| Sales | Sales Invoice, POS Invoice, Delivery Note | none |
|
| Sales | Sales Invoice, POS Invoice, Delivery Note | none |
|
||||||
| Third-party sales | **new** Channel Sales Report: source (distributor, Bandcamp, consignment count), period, lines of item, place (shop, territory or city), units sold, returned, on hand | none |
|
| Third-party sales | **new** Channel Sales Report: source (distributor, Bandcamp, consignment count), period, lines of item, place (shop, territory or city), units sold, returned, on hand | none |
|
||||||
| Stock | Warehouses at the plant, at each distributor and one per consignment shop | none |
|
| Stock | Warehouses: its own store room, each distributor, one per consignment shop | none |
|
||||||
| Metal | Serial No per father, mother and stamper with sets used per mother (already planned) | metrology raw files |
|
| Pressing | Purchase Order to the plant, Purchase Invoice from it; repress-ready status (archived father and mother, stamper sets left) read from the plant's customer portal | none |
|
||||||
| Recommendations | **new** Catalogue Recommendation: title and variant, quantity, the forecast quantiles it rests on, the reason, status (proposed, accepted, rejected), link to the Work Order it became | the full forecast rows per title, place and month |
|
| Recommendations | **new** Catalogue Recommendation: title and variant, quantity, the forecast quantiles it rests on, the reason, status (proposed, accepted, rejected), link to the Purchase Order it became | the full forecast rows per title, place and month |
|
||||||
| Market opportunities | CRM Opportunity and Lead (new shop, distributor, territory, licensing lead) | none |
|
| Market opportunities | CRM Opportunity and Lead (new shop, distributor, territory, licensing lead) | none |
|
||||||
| External signals | none | weekly streams per country and city, passport registrations, Discogs dump index, map aggregates |
|
| External signals | none | weekly streams per country and city, passport registrations, Discogs dump index, map aggregates |
|
||||||
|
|
||||||
@@ -150,12 +201,17 @@ flowchart LR
|
|||||||
STR[Streaming by country<br/>and city, own artists]
|
STR[Streaming by country<br/>and city, own artists]
|
||||||
DG[Discogs CC0 dump]
|
DG[Discogs CC0 dump]
|
||||||
end
|
end
|
||||||
ERP[(ERPNext<br/>releases, licences, sales,<br/>stock, channel reports)]
|
subgraph C[Catalogue company, on premises]
|
||||||
MD[(Machine-data store<br/>signal series, forecast rows)]
|
ERP[(Its ERPNext<br/>releases, licences, sales,<br/>stock, channel reports)]
|
||||||
FC[Forecast job]
|
MD[(Analytics store<br/>signal series, forecast rows)]
|
||||||
DASH[Catalogue dashboard<br/>and sales map]
|
FC[Forecast job]
|
||||||
AG[Market advisor]
|
DASH[Catalogue dashboard<br/>and sales map]
|
||||||
TEAM[Team decides]
|
AG[Market advisor,<br/>self-hosted model]
|
||||||
|
TEAM[Team decides]
|
||||||
|
end
|
||||||
|
subgraph P[Plant company]
|
||||||
|
PORTAL[Order intake and<br/>customer portal]
|
||||||
|
end
|
||||||
SHOP --> ERP
|
SHOP --> ERP
|
||||||
DIST --> ERP
|
DIST --> ERP
|
||||||
BC --> ERP
|
BC --> ERP
|
||||||
@@ -172,7 +228,8 @@ flowchart LR
|
|||||||
DASH --> AG
|
DASH --> AG
|
||||||
AG -->|drafts: recommendations,<br/>opportunities| ERP
|
AG -->|drafts: recommendations,<br/>opportunities| ERP
|
||||||
ERP --> TEAM
|
ERP --> TEAM
|
||||||
TEAM -->|repress work order| ERP
|
TEAM -->|purchase order| PORTAL
|
||||||
|
PORTAL -->|order status, archive,<br/>standby calendar, invoice| ERP
|
||||||
```
|
```
|
||||||
|
|
||||||
## Personal data
|
## Personal data
|
||||||
@@ -180,8 +237,10 @@ flowchart LR
|
|||||||
Buyers' names and addresses are personal data under Thailand's PDPA
|
Buyers' names and addresses are personal data under Thailand's PDPA
|
||||||
(B.E. 2562, fully in force since 1 June 2022;
|
(B.E. 2562, fully in force since 1 June 2022;
|
||||||
[overview](https://pacmap.dev/regulation/th-pdpa-2019)), and so is a sales
|
[overview](https://pacmap.dev/regulation/th-pdpa-2019)), and so is a sales
|
||||||
location fine enough to point at one buyer.
|
location fine enough to point at one buyer. The catalogue company is the
|
||||||
The map is built so that it never needs a person:
|
controller of its buyers' data; the plant handles passport registrations
|
||||||
|
for it as a processor, under a processing agreement. The map is built so
|
||||||
|
that it never needs a person:
|
||||||
|
|
||||||
- addresses are geocoded to the **postcode or city centroid**, never to
|
- addresses are geocoded to the **postcode or city centroid**, never to
|
||||||
the house;
|
the house;
|
||||||
@@ -195,45 +254,45 @@ The map is built so that it never needs a person:
|
|||||||
|
|
||||||
## The catalogue dashboard
|
## The catalogue dashboard
|
||||||
|
|
||||||
One internal tool for the label team, with five views.
|
One internal tool for the catalogue company's team, with five views.
|
||||||
|
|
||||||
1. **Catalogue.** Every title and variant: owned or licensed, licence
|
1. **Catalogue.** Every title and variant: owned or licensed, licence
|
||||||
territories and expiry, stock by place (plant, distributors, each
|
territories and expiry, stock by place (store room, distributors, each
|
||||||
consignment shop), sell-through over 4, 13 and 52 weeks, weeks of
|
consignment shop), sell-through over 4, 13 and 52 weeks, weeks of
|
||||||
cover at the current rate, repress-ready (father and mother archived,
|
cover at the current rate, repress-ready (from the plant's portal),
|
||||||
stamper sets left on the mother from ERPNext's counts), last pressing,
|
last pressing, royalties accrued, and a flag when a recommendation is
|
||||||
royalties accrued, and a flag when a recommendation is open.
|
open.
|
||||||
2. **Sales map.** Sales density by city or hexagon over time, with a
|
2. **Sales map.** Sales density by city or hexagon over time, with a
|
||||||
time slider and filters by title, genre, variant and channel. Layers:
|
time slider and filters by title, genre, variant and channel. Layers:
|
||||||
own sales; shops with our stock (pins sized by stock, coloured by
|
own sales; shops with its stock (pins sized by stock, coloured by
|
||||||
weeks of cover); distributor territories; streaming listeners of our
|
weeks of cover); distributor territories; streaming listeners of its
|
||||||
artists; passport registrations; interest-list sign-ups; country
|
artists; passport registrations; interest-list sign-ups; country
|
||||||
totals (RIAJ and others) as context. A **white-space layer** marks
|
totals (RIAJ and others) as context. A **white-space layer** marks
|
||||||
places where listeners, sign-ups or registrations are high and sales
|
places where listeners, sign-ups or registrations are high and sales
|
||||||
or stock are low: the map's version of a market opportunity.
|
or stock are low: the map's version of a market opportunity.
|
||||||
3. **Title page.** The sales curve with out-of-stock weeks shaded, the
|
3. **Title page.** The sales curve with out-of-stock weeks shaded, the
|
||||||
forecast fan for the next months, the title's own map, its metal
|
forecast fan for the next months, the title's own map, its archived
|
||||||
genealogy and its licence clock.
|
metal and its licence clock.
|
||||||
4. **Repress planner.** Proposed runs against free press slots from the
|
4. **Repress planner.** Proposed runs against the plant's standby
|
||||||
factory scheduler (customer work orders already placed, catalogue in
|
calendar (the idle slots the plant publishes to every customer) and
|
||||||
the gaps), with the Classic's idle hours as the default home for black
|
normal lead times, with the Classic's idle hours as the default for
|
||||||
and solid colours.
|
black and solid colours.
|
||||||
5. **Advisor inbox.** The advisor's notes, each with its numbers linked
|
5. **Advisor inbox.** The advisor's notes, each with its numbers linked
|
||||||
to the rows they came from, and accept or reject buttons that create
|
to the rows they came from, and accept or reject buttons that create
|
||||||
or close the ERPNext document.
|
or close the ERPNext document.
|
||||||
|
|
||||||
**How it is built.** Same stack and rules as every other tool
|
**How it is built.** The same open-source stack as the plant's tools
|
||||||
([digital factory](digital-factory.md#the-factory-application)): Rust
|
([digital factory](digital-factory.md#the-factory-application)): Rust
|
||||||
(axum, minijinja, HTMX) in `cnx-factory`, its own ERPNext integration
|
(axum, minijinja, HTMX), its own ERPNext integration user, NixOS, managed
|
||||||
user, deployed by the clan, internal only (office and the team over the
|
like the plant's machines but on the catalogue company's own server and
|
||||||
mesh, not public). The map is open source and self-hosted, in line with
|
disks; internal only, not public. The map is open source and
|
||||||
the plant's open-source decision
|
self-hosted, in line with the plant's open-source decision
|
||||||
([digital factory](digital-factory.md#open-source-throughout-and-working-with-other-plants)):
|
([digital factory](digital-factory.md#open-source-throughout-and-working-with-other-plants)):
|
||||||
|
|
||||||
- **MapLibre GL JS** (BSD-3-Clause) in the browser;
|
- **MapLibre GL JS** (BSD-3-Clause) in the browser;
|
||||||
- **vector tiles from OpenStreetMap data** (ODbL, attribution on the map)
|
- **vector tiles from OpenStreetMap data** (ODbL, attribution on the map)
|
||||||
as one Protomaps PMTiles file (BSD-3-Clause tooling) served from the
|
as one Protomaps PMTiles file (BSD-3-Clause tooling) served from its
|
||||||
fleet, so no Google Maps or Mapbox account;
|
own server, so no Google Maps or Mapbox account;
|
||||||
- **H3** hexagons (Apache-2.0) for binning;
|
- **H3** hexagons (Apache-2.0) for binning;
|
||||||
- **geocoding offline**: postcode and city centroids from GeoNames
|
- **geocoding offline**: postcode and city centroids from GeoNames
|
||||||
(CC BY 4.0), with a self-hosted Nominatim only if centroids prove too
|
(CC BY 4.0), with a self-hosted Nominatim only if centroids prove too
|
||||||
@@ -247,18 +306,18 @@ before it is allowed to decide anything.
|
|||||||
**Stage 0: no sales history (a new title or a reissue candidate).**
|
**Stage 0: no sales history (a new title or a reissue candidate).**
|
||||||
Demand is borrowed from comparable titles (genre, era, the artist's
|
Demand is borrowed from comparable titles (genre, era, the artist's
|
||||||
streaming, how many pressings already exist per the Discogs dump) and
|
streaming, how many pressings already exist per the Discogs dump) and
|
||||||
tested cheaply: a **pre-order campaign on the
|
tested cheaply with a **pre-order**: in the company's own shop, or
|
||||||
[artist platform](artist-platform.md#fan-funded-campaigns)** for our own
|
through the plant's campaign service on the
|
||||||
title is the experiment. If the pre-orders reach the minimum run, press;
|
[artist platform](artist-platform.md#fan-funded-campaigns) on the same
|
||||||
if not, refund and learn. The same mechanism the platform offers artists
|
terms as any label. If the pre-orders reach the minimum run, press; if
|
||||||
becomes the label's market test.
|
not, refund and learn.
|
||||||
|
|
||||||
**Stage 1: the first months of sales.** A reorder rule, not a model:
|
**Stage 1: the first months of sales.** A reorder rule, not a model:
|
||||||
sell-through per title and place per week, with out-of-stock weeks left
|
sell-through per title and place per week, with out-of-stock weeks left
|
||||||
out of the rate. Repress when the stock that will be left at the end of
|
out of the rate. Repress when the stock that will be left at the end of
|
||||||
the repress lead time (~7 to 11 working days, plus transport to where it
|
the repress lead time (~7 to 11 working days at the plant, plus transport
|
||||||
sells) falls below a safety stock. Dashboard view 1 shows this from the
|
to where it sells) falls below a safety stock. Dashboard view 1 shows
|
||||||
first sale.
|
this from the first sale.
|
||||||
|
|
||||||
**Stage 2: a year of data and a few dozen titles (thresholds are
|
**Stage 2: a year of data and a few dozen titles (thresholds are
|
||||||
estimates).** A hierarchical count model of weekly sales per title and
|
estimates).** A hierarchical count model of weekly sales per title and
|
||||||
@@ -268,8 +327,8 @@ borrows strength from its neighbours. Inputs: past sales with censoring
|
|||||||
for stockouts, the artist's streaming in that place with a lag, price,
|
for stockouts, the artist's streaming in that place with a lag, price,
|
||||||
variant, season (year-end, Record Store Day), events, age since release,
|
variant, season (year-end, Record Store Day), events, age since release,
|
||||||
passport registrations and sign-ups. Output: a forecast **distribution**
|
passport registrations and sign-ups. Output: a forecast **distribution**
|
||||||
(quantiles), never a single number. Runs as a nightly batch job on the
|
(quantiles), never a single number. Runs as a nightly batch job on its
|
||||||
plant core (Python with statsmodels or PyMC from nixpkgs, as a systemd
|
server (Python with statsmodels or PyMC from nixpkgs, as a systemd
|
||||||
timer).
|
timer).
|
||||||
|
|
||||||
**How many to press.** With a two-week repress the run only has to cover
|
**How many to press.** With a two-week repress the run only has to cover
|
||||||
@@ -278,20 +337,25 @@ the quantile of next-period demand at which the margin lost on a missed
|
|||||||
sale balances the cost of a record left unsold.
|
sale balances the cost of a record left unsold.
|
||||||
|
|
||||||
- Missed-sale cost: net selling price after the channel's margin, minus
|
- Missed-sale cost: net selling price after the channel's margin, minus
|
||||||
direct cost (1.35 to 2.70 USD a record in the
|
what the record costs the catalogue company (the plant's price, 3.40
|
||||||
[revenue model](finance/revenue-model.md#operating-picture-of-the-launch-plant-october-2026)),
|
to 4.25 USD a standard record in the
|
||||||
minus royalty.
|
[revenue model](finance/revenue-model.md#operating-picture-of-the-launch-plant-october-2026)
|
||||||
- Unsold-record cost: direct cost plus storage and the money tied up,
|
before any standby discount, plus jacket, sleeve and freight), minus
|
||||||
minus what the PVC is worth as regrind after the label punch
|
royalty.
|
||||||
([pressing line](equipment/pressing-line.md#newbilt-range-making-vinyl-europe-2026-flyers)).
|
- Unsold-record cost: that cost plus storage and the money tied up,
|
||||||
- Floor: a run long enough to pay the press setup (half a day per run in
|
minus any salvage value (an unsold record can be label-punched and
|
||||||
the [production timeline](production-timeline.md#repress-the-shortest-path-in-the-plant))
|
granulated into regrind,
|
||||||
and within one stamper's life (1,000 to 2,000 pressings).
|
[pressing line](equipment/pressing-line.md#newbilt-range-making-vinyl-europe-2026-flyers),
|
||||||
|
if the plant takes it back; terms open).
|
||||||
|
- Floor: the plant's minimum run and setup terms, and within one
|
||||||
|
stamper's life (1,000 to 2,000 pressings,
|
||||||
|
[production timeline](production-timeline.md#repress-the-shortest-path-in-the-plant)).
|
||||||
|
|
||||||
Our wholesale and retail prices for catalogue titles are not in any
|
The catalogue company's wholesale and retail prices, the standby price
|
||||||
document yet; they are inputs to fill before the rule produces a number.
|
and the packaging cost are not in any document yet; they are inputs to
|
||||||
|
fill before the rule produces a number.
|
||||||
|
|
||||||
**How it is checked.** Rolling back-tests on our own history: do the
|
**How it is checked.** Rolling back-tests on its own history: do the
|
||||||
80 % intervals contain about 80 % of outcomes, and does following the
|
80 % intervals contain about 80 % of outcomes, and does following the
|
||||||
model give fewer out-of-stock weeks and less stock unsold after a year
|
model give fewer out-of-stock weeks and less stock unsold after a year
|
||||||
than the Stage 1 rule did? Accepted and rejected recommendations, with
|
than the Stage 1 rule did? Accepted and rejected recommendations, with
|
||||||
@@ -302,9 +366,9 @@ what then sold, are ERPNext records, so this is a report, not a project.
|
|||||||
An agent that reads the dashboard's data and writes a **weekly note**
|
An agent that reads the dashboard's data and writes a **weekly note**
|
||||||
plus answers to questions ("where does molam sell outside Thailand?",
|
plus answers to questions ("where does molam sell outside Thailand?",
|
||||||
"which shops stock out fastest?"). It **proposes and never acts**: it
|
"which shops stock out fastest?"). It **proposes and never acts**: it
|
||||||
places no work order, sends no e-mail to a shop or licensor and changes
|
places no order with the plant, sends no e-mail to a shop or licensor and
|
||||||
no price. An accepted proposal becomes an ERPNext document created by a
|
changes no price. An accepted proposal becomes an ERPNext document
|
||||||
person.
|
created by a person.
|
||||||
|
|
||||||
What it looks for:
|
What it looks for:
|
||||||
|
|
||||||
@@ -316,83 +380,92 @@ What it looks for:
|
|||||||
no shop or distributor; proposed as a CRM Lead for a shop or
|
no shop or distributor; proposed as a CRM Lead for a shop or
|
||||||
distributor to approach.
|
distributor to approach.
|
||||||
- **Variants**: colours that sell faster in a region than black, within
|
- **Variants**: colours that sell faster in a region than black, within
|
||||||
what the presses can make that month.
|
what the plant's standby calendar offers.
|
||||||
- **Events**: an artist's tour or festival date in a city where stock is
|
- **Events**: an artist's tour or festival date in a city where stock is
|
||||||
thin.
|
thin.
|
||||||
- **Licensing leads**: titles in genres that sell for us that, per the
|
- **Licensing leads**: titles in genres that sell for the company that,
|
||||||
Discogs dump, were never reissued or not for decades, with the original
|
per the Discogs dump, were never reissued or not for decades, with the
|
||||||
label named. A lead for a person to research; the advisor never says
|
original label named. A lead for a person to research; the advisor
|
||||||
that rights are available.
|
never says that rights are available.
|
||||||
|
|
||||||
How it is kept honest:
|
How it is kept honest:
|
||||||
|
|
||||||
- the numbers come from the model and the database, the words from the
|
- the numbers come from the model and the database, the words from the
|
||||||
agent; every figure in a note links to its row and date;
|
agent; every figure in a note links to its row and date;
|
||||||
- it separates our own data from outside signals and says how sure it
|
- it separates the company's own data from outside signals and says how
|
||||||
is;
|
sure it is;
|
||||||
- it has read-only tools: the dashboard API, the forecast rows, ERPNext
|
- it has read-only tools: the dashboard API, the forecast rows, ERPNext
|
||||||
reports through a read-only integration user, the local Discogs dump
|
reports through a read-only integration user, the local Discogs dump
|
||||||
index, this repository's market notes, and web search through a
|
index, market notes, and web search through a self-hosted SearXNG for
|
||||||
self-hosted SearXNG for news (tours, syncs, competing reissues);
|
news (tours, syncs, competing reissues); it has no access to the
|
||||||
|
plant's systems beyond the customer portal;
|
||||||
- every suggestion and its outcome is logged, and after six months it is
|
- every suggestion and its outcome is logged, and after six months it is
|
||||||
scored against the plain reorder rule; if it does not beat it, it
|
scored against the plain reorder rule; if it does not beat it, it
|
||||||
becomes a report instead of an agent.
|
becomes a report instead of an agent.
|
||||||
|
|
||||||
**Which model runs it.** The advisor is one role of the
|
**Which model runs it** (decided: self-hosted, on premises). The same
|
||||||
[plant assistant](plant-assistant.md): the same open-weights model on the
|
software as the [plant assistant](plant-assistant.md), as the catalogue
|
||||||
plant's own machines, the same tool rules, with the catalogue tools and
|
company's own instance with its own data and permissions, and an
|
||||||
the catalogue roles' permissions added. The forecasting is ordinary
|
open-weights model on hardware it controls. The forecasting is ordinary
|
||||||
statistics, so the language model only reads, searches and writes. A
|
statistics, so the language model only reads, searches and writes; a
|
||||||
hosted model is a fallback to decide on only if the open one proves
|
mixture-of-experts model such as Typhoon 2.5 may run on a CPU server
|
||||||
inadequate, and then only aggregates leave the fleet.
|
(to be measured, as for the plant). Running it on the plant's `vinyl-ai`
|
||||||
|
instead would put the catalogue company's sales data into prompts on the
|
||||||
|
plant company's hardware; that needs a written hosting agreement and is
|
||||||
|
an open decision, not the default.
|
||||||
|
|
||||||
## How it fits the plant
|
## How it works with the plant
|
||||||
|
|
||||||
- **Scheduling.** Catalogue work orders enter the same ERPNext schedule
|
- **Scheduling.** Its orders enter the plant's schedule like any
|
||||||
as customer orders, flagged as fillers; the factory scheduler places
|
customer's; standby runs go into idle slots, the Classic's first, and
|
||||||
them in idle Classic hours first and never moves a customer date.
|
never move another customer's date.
|
||||||
- **Metal archive.** Catalogue fathers and mothers sit in the archive
|
- **Metal archive.** Its fathers and mothers sit in the archive room with
|
||||||
room with everyone else's
|
every customer's ([facility security](facility-security.md)); the
|
||||||
([facility security](facility-security.md)); "repress-ready" on the
|
portal shows it what is archived and how many stamper sets are left.
|
||||||
dashboard is ERPNext's serial-number data.
|
- **Traceability.** Its sleeves carry the record passport code like every
|
||||||
- **Traceability.** Catalogue sleeves carry the record passport code like
|
other record, which is what makes the registration layer of the map
|
||||||
every other record, which is what makes the registration layer of the
|
possible ([traceability](traceability.md)).
|
||||||
map possible ([traceability](traceability.md)).
|
- **Artist platform.** It can use the plant's campaign service on the
|
||||||
- **Artist platform.** Catalogue pre-orders use the campaign machinery
|
same terms as any label; its own web shop is its own.
|
||||||
and its ring-fenced payments; the catalogue's own web shop is a
|
- **Money.** The plant's [revenue model](finance/revenue-model.md) does
|
||||||
separate storefront on the same public side
|
not count on its orders. Its working capital (stock, licence advances)
|
||||||
([artist platform](artist-platform.md#how-it-is-built)).
|
and its systems are its own, outside the plant's
|
||||||
- **Money.** Not in the [revenue model](finance/revenue-model.md) or the
|
[total investment](finance/total-investment.md).
|
||||||
[total investment](finance/total-investment.md). A catalogue needs
|
|
||||||
working capital for stock and licence advances, which neither plan
|
|
||||||
carries.
|
|
||||||
|
|
||||||
## Phasing
|
## Phasing
|
||||||
|
|
||||||
| Roadmap phase | Step |
|
| Roadmap phase | Step |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 0, validate (now) | List Poy Records' titles and rights; collect its existing sales (Bandcamp report, shops, festival) into one sheet and draw the first map by hand; decide whether to ask Discogs for written permission |
|
| 0, validate (now) | List the titles to own and to license, with rights and territories; collect Poy Records' existing sales (Bandcamp report, shops, festival) into one sheet and draw the first map by hand; decide whether to ask Discogs for written permission |
|
||||||
| 1 to 2, quotes and commit | Decide whether the catalogue is in scope, under which label, owned only or licensed too, and how the working capital is funded |
|
| 1 to 2, quotes and commit | Found the catalogue company (shareholders, name, whether Poy Records is it or moves into it); the plant's customer terms with standby pressing, data and archive clauses |
|
||||||
| 3, build | ERPNext: Licence, Channel Sales Report, Catalogue Recommendation, geocode fields, consignment warehouses; dashboard views 1 and 2 in the factory application; geocoder and tiles on the fleet |
|
| 3, build | Its ERPNext site with Licence, Channel Sales Report, Catalogue Recommendation, geocode fields, consignment warehouses; dashboard views 1 and 2; geocoder and tiles on its own server |
|
||||||
| 4, launch | First catalogue represses in idle slots on the Stage 1 rule; passport registrations live; advisor version 0 (rule-based notes written up by the language model) |
|
| 4, launch | First standby runs at the plant on the Stage 1 rule; passport registrations live; advisor version 0 (rule-based notes written up by the self-hosted model) |
|
||||||
| 5, expand | Stage 2 model once there is a year of data; licensing leads; offer label customers the same dashboard on their own data (opt-in), like the open plant stack, not in the revenue |
|
| 5, expand | Stage 2 model once there is a year of data; licensing leads; the software offered to other labels, open source like the plant stack |
|
||||||
|
|
||||||
## Rough cost (estimates)
|
## Rough cost (estimates)
|
||||||
|
|
||||||
|
All of it borne by the catalogue company.
|
||||||
|
|
||||||
| Item | Effort or cost |
|
| Item | Effort or cost |
|
||||||
|---|---|
|
|---|---|
|
||||||
| ERPNext additions in `cnx_erp` (Licence, Channel Sales Report, Catalogue Recommendation, geocode fields, royalty statement) | 0.5 to 1 person-month |
|
| Company setup, its ERPNext site with Thai tax, the catalogue documents and royalty statement | 1 to 2 person-months, or a partner quote for the ERPNext configuration |
|
||||||
| Importers (Bandcamp, distributor and consignment statements, streaming exports) | 0.5 to 1 person-month |
|
| Importers (Bandcamp, distributor and consignment statements, streaming exports) | 0.5 to 1 person-month |
|
||||||
| Dashboard and sales map in the factory application | 1.5 to 3 person-months |
|
| Dashboard and sales map | 1.5 to 3 person-months, less where the plant's open-source code is reused |
|
||||||
| Forecast job: Stage 1 rule, then the Stage 2 model | 0.5, then 1 to 2 person-months |
|
| Forecast job: Stage 1 rule, then the Stage 2 model | 0.5, then 1 to 2 person-months |
|
||||||
| Advisor: tools, prompts, logging, scoring | 1 to 1.5 person-months |
|
| Advisor: tools, prompts, logging, scoring on the plant assistant's software | 0.5 to 1 person-month |
|
||||||
| Language model and its machine | shared with the [plant assistant](plant-assistant.md#rough-cost-estimates) |
|
| On-premises server for ERPNext, dashboard, forecast and model (CPU first) | a few thousand USD; a GPU only if the CPU trial is too slow ([plant assistant](plant-assistant.md#rough-cost-estimates) for the GPU figure) |
|
||||||
| Map tiles, geocoder, hosting | on the existing fleet |
|
|
||||||
|
|
||||||
## Risks
|
## Risks
|
||||||
|
|
||||||
- **Stock is the risk a pressing plant normally avoids.** Small, frequent
|
- **Stock is the risk a pressing plant normally avoids.** It now sits in
|
||||||
represses keep it small; the model's job is to keep it smaller.
|
the catalogue company; small, frequent represses keep it small, and the
|
||||||
|
model's job is to keep it smaller.
|
||||||
|
- **Related-party pricing.** Prices between the two companies must be the
|
||||||
|
plant's published terms, documented, or the Revenue Department can
|
||||||
|
adjust them.
|
||||||
|
- **Neutrality.** Other labels must be able to trust that the plant does
|
||||||
|
not favour its neighbour; the arm's-length rules above go into the
|
||||||
|
customer terms, not only into this document.
|
||||||
- **Small data.** A few dozen titles is little to learn from; the stages
|
- **Small data.** A few dozen titles is little to learn from; the stages
|
||||||
above exist so that no complex model decides before it has beaten a
|
above exist so that no complex model decides before it has beaten a
|
||||||
simple rule.
|
simple rule.
|
||||||
@@ -402,23 +475,21 @@ inadequate, and then only aggregates leave the fleet.
|
|||||||
- **Platform terms.** Discogs' marketplace and wantlist data are
|
- **Platform terms.** Discogs' marketplace and wantlist data are
|
||||||
restricted; the plan uses its CC0 dumps and live look-ups by a person
|
restricted; the plan uses its CC0 dumps and live look-ups by a person
|
||||||
unless Discogs agrees in writing.
|
unless Discogs agrees in writing.
|
||||||
- **Conflict with customers.** The scheduling rule and the data rule
|
- **Distraction.** A label is a second business for the same people. Its
|
||||||
above have to be written into the customer terms, not only into this
|
runs stay fillers for idle press time until the plant's own order book
|
||||||
document.
|
is validated ([roadmap](roadmap.md) item 1).
|
||||||
- **Distraction.** A label is a second business. The catalogue stays a
|
|
||||||
filler for idle press time until the plant's own order book is
|
|
||||||
validated ([roadmap](roadmap.md) item 1).
|
|
||||||
|
|
||||||
## Open decisions
|
## Open decisions
|
||||||
|
|
||||||
1. **Catalogue in scope**, and under which name: Poy Records (the seed),
|
1. **The catalogue company**: who holds its shares, its name, and whether
|
||||||
CNX Vinyl, or a new imprint.
|
Poy Records is that company or its titles move into it.
|
||||||
2. **Owned titles only, or licensed reissues too.** Licensing adds
|
2. **Working capital** for stock and licence advances: how much and from
|
||||||
advances, royalty accounting and territory limits.
|
whom.
|
||||||
3. **Working capital** for stock and advances: how much and from where;
|
3. **Standby pressing**: price, terms and the minimum run, offered to
|
||||||
neither plan carries it.
|
every customer of the plant.
|
||||||
4. **Discogs**: ask for written permission to use have/want and
|
4. **Discogs**: ask for written permission to use have/want and
|
||||||
marketplace data commercially, or work from the CC0 dumps alone.
|
marketplace data commercially, or work from the CC0 dumps alone.
|
||||||
5. **Language model**: open-weights on the fleet (default) or hosted.
|
5. **Where its systems run**: its own on-premises server (the default
|
||||||
6. **Label customers**: whether they are offered the dashboard on their
|
here) or hardware at the plant under a written hosting agreement.
|
||||||
own data, and on what terms.
|
6. **Other labels**: whether the software is offered to them, and on
|
||||||
|
what terms (it is open source either way).
|
||||||
@@ -48,6 +48,7 @@ everything we build is open source**, and our own code is published.
|
|||||||
| Edge and backup | Caddy, BorgBackup, ZFS | Apache-2.0, BSD, CDDL |
|
| Edge and backup | Caddy, BorgBackup, ZFS | Apache-2.0, BSD, CDDL |
|
||||||
| Our applications | the factory application (`cnx-factory`, Rust: axum, SQLx, minijinja, HTMX), the plant overview, the artist platform (name undecided), the plant and business plan calculator, instrument adapters, NixOS modules | ours, to be published |
|
| Our applications | the factory application (`cnx-factory`, Rust: axum, SQLx, minijinja, HTMX), the plant overview, the artist platform (name undecided), the plant and business plan calculator, instrument adapters, NixOS modules | ours, to be published |
|
||||||
| Design and documents | FreeCAD for the plant model, python-docx and LibreOffice for the business plan | LGPL, MIT, MPL-2.0 |
|
| Design and documents | FreeCAD for the plant model, python-docx and LibreOffice for the business plan | LGPL, MIT, MPL-2.0 |
|
||||||
|
| Language models | open-weights models, **self-hosted on premises** (decided October 2026): the [plant assistant](plant-assistant.md) on `vinyl-core` or `vinyl-ai`; no hosted AI service | per model; Typhoon 2.5: Apache-2.0 |
|
||||||
|
|
||||||
- **Our licence is a decision point.** AGPL-3.0 keeps hosted copies of the
|
- **Our licence is a decision point.** AGPL-3.0 keeps hosted copies of the
|
||||||
factory application open; Apache-2.0 or MIT is the easiest for another
|
factory application open; Apache-2.0 or MIT is the easiest for another
|
||||||
@@ -711,8 +712,10 @@ is kept outside it.
|
|||||||
own, and keeps its records in ERPNext. A tool that cannot read from or
|
own, and keeps its records in ERPNext. A tool that cannot read from or
|
||||||
write to ERPNext this way is not finished; a tool with its own
|
write to ERPNext this way is not finished; a tool with its own
|
||||||
database of business records is not allowed. Machine data is the only
|
database of business records is not allowed. Machine data is the only
|
||||||
exception. The [own catalogue](catalogue-intelligence.md) dashboard,
|
exception. The [own catalogue](catalogue-intelligence.md) tools follow
|
||||||
sales map and demand model are planned this way.
|
the same rule in the catalogue company's own ERPNext site; that
|
||||||
|
company is a customer of the plant and reaches it only through the
|
||||||
|
order intake and the portal.
|
||||||
|
|
||||||
### Hosting on NixOS
|
### Hosting on NixOS
|
||||||
|
|
||||||
|
|||||||
@@ -594,9 +594,9 @@ For CNX it means the ~0.74M records a year the plan needs from Asian
|
|||||||
labels ([roadmap](../roadmap.md) item 1) has to come more from Southeast
|
labels ([roadmap](../roadmap.md) item 1) has to come more from Southeast
|
||||||
Asia, the rest of Asia and Western export, where the plants above
|
Asia, the rest of Asia and Western export, where the plants above
|
||||||
compete, and less from Japan's queue. That makes the buyer conversations
|
compete, and less from Japan's queue. That makes the buyer conversations
|
||||||
in item 1 more pressing, not less. Selling Thai catalogue into Japan is a
|
in item 1 more pressing, not less. Selling Thai catalogue into Japan, the
|
||||||
different route that does not compete with ResurRec's presses there
|
route of the planned catalogue company, does not compete with ResurRec's
|
||||||
([own catalogue](../catalogue-intelligence.md)).
|
presses there ([own catalogue](../catalogue-intelligence.md)).
|
||||||
|
|
||||||
Open questions: where the Japan plant is, since when, how many presses
|
Open questions: where the Japan plant is, since when, how many presses
|
||||||
and which, whether it plates, whether Bangkok keeps its orders or
|
and which, whether it plates, whether Bangkok keeps its orders or
|
||||||
|
|||||||
@@ -74,8 +74,6 @@ the floor's own questions.
|
|||||||
1 Hz machine tags, zone environment, energy and water in VictoriaMetrics
|
1 Hz machine tags, zone environment, energy and water in VictoriaMetrics
|
||||||
([design decision 2](digital-factory.md#design-decisions)).
|
([design decision 2](digital-factory.md#design-decisions)).
|
||||||
- **Alarms**: vmalert and Alertmanager history.
|
- **Alarms**: vmalert and Alertmanager history.
|
||||||
- **Catalogue data**, for those who may see it
|
|
||||||
([own catalogue](catalogue-intelligence.md)).
|
|
||||||
|
|
||||||
## What it does with it
|
## What it does with it
|
||||||
|
|
||||||
@@ -129,7 +127,8 @@ the floor's own questions.
|
|||||||
|
|
||||||
## How it is built
|
## How it is built
|
||||||
|
|
||||||
- **Model.** Open weights, Thai and English, served on site. The first
|
- **Model.** Open weights, Thai and English, **self-hosted on premises**
|
||||||
|
(decided October 2026; no hosted AI service). The first
|
||||||
candidate is **Typhoon 2.5** from SCB 10X, a Thai fine-tune of
|
candidate is **Typhoon 2.5** from SCB 10X, a Thai fine-tune of
|
||||||
Qwen3-30B-A3B for Thai and English with a 256K context, Apache-2.0
|
Qwen3-30B-A3B for Thai and English with a 256K context, Apache-2.0
|
||||||
([model card](https://huggingface.co/typhoon-ai/typhoon2.5-qwen3-30b-a3b),
|
([model card](https://huggingface.co/typhoon-ai/typhoon2.5-qwen3-30b-a3b),
|
||||||
@@ -203,7 +202,7 @@ the floor's own questions.
|
|||||||
| 0 to 1, now | Prototype on the dev trio over this planning repository: the team asks the plan ("how much steam does the launch plant need, and why?") in Thai and English, CPU-only; the test-set habit starts here |
|
| 0 to 1, now | Prototype on the dev trio over this planning repository: the team asks the plan ("how much steam does the launch plant need, and why?") in Thai and English, CPU-only; the test-set habit starts here |
|
||||||
| 3, build | SOPs written as Quality Procedures during commissioning (vendor training sessions recorded and transcribed into procedures), manuals attached to the Assets; assistant v1 on documents and ERPNext records; `vinyl-ai` installed if the CPU trial says so |
|
| 3, build | SOPs written as Quality Procedures during commissioning (vendor training sessions recorded and transcribed into procedures), manuals attached to the Assets; assistant v1 on documents and ERPNext records; `vinyl-ai` installed if the CPU trial says so |
|
||||||
| 4, launch | "Ask" on the kiosks with station context; machine-data and alarm tools; shift handover notes; alert context |
|
| 4, launch | "Ask" on the kiosks with station context; machine-data and alarm tools; shift handover notes; alert context |
|
||||||
| 5, expand | Voice at the presses if the floor test passes; the catalogue advisor as one of its roles; galvanics and audio QC data; offered with the open plant stack to other plants ([digital factory](digital-factory.md#open-source-throughout-and-working-with-other-plants)) |
|
| 5, expand | Voice at the presses if the floor test passes; galvanics and audio QC data; the same software as the catalogue company's advisor, its own instance on its own hardware ([own catalogue](catalogue-intelligence.md)); offered with the open plant stack to other plants ([digital factory](digital-factory.md#open-source-throughout-and-working-with-other-plants)) |
|
||||||
|
|
||||||
## Rough cost (estimates)
|
## Rough cost (estimates)
|
||||||
|
|
||||||
|
|||||||
@@ -195,8 +195,9 @@ Two commercial consequences worth acting on:
|
|||||||
to go back to, so a repress restarts at lacquer cutting and costs the
|
to go back to, so a repress restarts at lacquer cutting and costs the
|
||||||
customer six weeks and a new cutting fee. 3-step buys the two-week
|
customer six weeks and a new cutting fee. 3-step buys the two-week
|
||||||
repress, and that repress is the highest-margin order the plant will
|
repress, and that repress is the highest-margin order the plant will
|
||||||
ever take. For a catalogue of the plant's own it is also what makes
|
ever take. For the planned catalogue company beside the plant it is
|
||||||
small, demand-led runs possible ([own catalogue](catalogue-intelligence.md)). Decided (October 2026): the plant keeps the **father as well
|
also what makes small, demand-led runs possible
|
||||||
|
([own catalogue](catalogue-intelligence.md)). Decided (October 2026): the plant keeps the **father as well
|
||||||
as the mother** of every side.
|
as the mother** of every side.
|
||||||
- **How many represses a mother carries.** The common rule of thumb is
|
- **How many represses a mother carries.** The common rule of thumb is
|
||||||
about **10 stamper sets per mother** before it degrades (Third Man
|
about **10 stamper sets per mother** before it degrades (Third Man
|
||||||
|
|||||||
+5
-4
@@ -173,11 +173,12 @@ These three run in parallel and gate everything downstream:
|
|||||||
27. Mastering and cutting room (can move earlier if title-services demand
|
27. Mastering and cutting room (can move earlier if title-services demand
|
||||||
shows up in Phase 4, or to host the joint audio engineering programme
|
shows up in Phase 4, or to host the joint audio engineering programme
|
||||||
with Payap University, see [Payap partnership](payap-partnership.md))
|
with Payap University, see [Payap partnership](payap-partnership.md))
|
||||||
28. **Own catalogue** (idea, October 2026): press our own titles in idle
|
28. **Own catalogue** (October 2026): a second company owns and licenses
|
||||||
press time, steered by a sales map and a demand model
|
titles and has them pressed at the plant as a customer, in standby
|
||||||
|
runs on idle press time, steered by a sales map and a demand model
|
||||||
([own catalogue](catalogue-intelligence.md)). The data work starts in
|
([own catalogue](catalogue-intelligence.md)). The data work starts in
|
||||||
Phase 0 with Poy Records' existing sales; whether the catalogue is in
|
Phase 0 with Poy Records' existing sales; the company, its
|
||||||
scope, and with what working capital, is decided before the build
|
shareholders and its working capital are settled before the build
|
||||||
|
|
||||||
## Standing principle
|
## Standing principle
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user