Fill it in: roll a page's facts, and the people and places they point to, offline (generalises "a whole company") #1328
Open
opened 2026-11-03 16:00:55 +00:00 by claude-bot
·
8 comments
No Branch/Tag specified
main
feat/1328-fill-it-in
feat/1328-fill-frontend
feat/1328-fill-backend
feat/9-foundry-push
fix/9-foundry-live
feat/9-foundry-push-frontend
renovate/celery-5.x
feat/5-foundry-connect
feat/9-foundry-push-backend
feat/9-foundry-push-module
feat/5-foundry-frontend
feat/5-foundry-backend
feat/5-foundry-module
release/v4.8.0-rc1
docs/d341-convert-draft
feat/958-update-to-version
feat/958-convert-sheet
feat/958-pathbuilder-import-frontend
fix/1360-heading-order
feat/958-pathbuilder-import-backend
feat/11-weekly-digest
feat/1341-auto-update
docs/d332-superseded
chore/1345-names-cleanup
feat/1342-mentioned-pages
feat/1328-recipes
fix/1346-pgdg-key
perf/1247-shared-recording-stream
chore/132-gitleaks-allowlist
release/v4.7.1
spike/foundry-module
release/v4.7.1-rc1
docs/decisions-d332-d337
fix/bot-certifi
chore/release-4.7.0
chore/release-4.7.0-rc4
chore/deps-4.7.0
chore/release-4.7.0-rc3
fix/1280-quote-must-say-it
fix/1257-names-row-squeeze
chore/release-4.7.0-rc2
fix/1245-pg-upgrade-count
chore/release-4.7.0-rc1
feat/1257-names-in-prep
feat/1257-be
feat/1257-fe
feat/1257-rating-fixes
design/1328-fill-it-in
feat/1257-name-splits
fix/1326-redis-503
feat/1280-fact-suggestions
feat/1280-be
feat/1280-fe
design/1280-fact-suggestions
feat/1279-infobox
feat/1279-be
feat/1279-fe
feat/1321-shelf-copies
design/1279-infobox
feat/1243-table-find
feat/1257-who-rated
feat/1243-prep-drawer
feat/1243-sheet-pickers
design/1243-browse-in-place
feat/1315-hotwords-default
feat/1242-system-filters
feat/1257-more-name-styles
feat/506-leg3-hotwords
design/1242-system-filters
fix/1302-packs-polish
feat/1241-rules-library
design/1241-rules-library
feat/1245-postgres-18
integ/4.6.2
fix/1263-map-ui-2
fix/1263-map-server
fix/1263-map-ui-1
fix/1261-editor-link-menu
fix/1229-axe-4.14-name-mismatch
renovate/axllent-mailpit-1.x
renovate/eslint-monorepo
renovate/authlib-1.x
chore/release-4.6.0
chore/release-4.6.0-rc2
fix/460-rc2-screens
fix/460-rc2-server
fix/release-prerelease-exit
chore/release-4.6.0-rc1
feat/125-campaign-templates
feat/126-calendar
feat/1181-pictures-and-files
feat/1190-event-people
integ/4.6.0
feat/1191-line-of-the-night
feat/1200-starter-packs
chore/bot-multidict-and-playwright-group
fix/1202-this-week-answered-count
fix/122-124-leftovers
fix/1178-get-routes-that-write
fix/1203-journeys-check-names
design/125-campaign-templates
feat/126-calendar-engine
design/126-in-world-calendar
fix/1189-cited-stamp-in-range
fix/1189-v4-looser-check
fix/1189-richer-beats
fix/1113-export-bind-lists
fix/1154-release-notes-by-file
chore/release-4.5.0
chore/release-4.5.0-rc12
fix/1135-wiki-markup-as-text
fix/demo-usage-cost-in-window
chore/release-4.5.0-rc11
fix/1121-sheet-consistency
fix/1121-sheet-5e-terms-and-card-hp
copy/1122-busiest-pages
fix/1121-relevant-choices
fix/1121-wiki-create-npc-save-sheet-links
fix/1029-menu-stays-on-screen
docs/prototype-transcript-bin-wording
fix/1023-editor-save-row-back-scroll
fix/1020-search-exact-first
fix/1020-table-prep
fix/1020-shell-wordmark-footer-bell
fix/1020-wiki-article-party
fix/872-admin-kept-until-phone-tables
feat/l13-milestone-level-waiting
fix/1000-1001-bell-older-setup-context
fix/999-pronouns-in-prompts
fix/l19-other-class-feats
fix/1010-transcript-window-ordinary-confirm
docs/d254-d269-decisions
fix/702-member-search
fix/680-transcript-bin
fix/993-unidentified-prompts
fix/841-redis-timeouts
fix/990-binned-not-exported
fix/830-export-prep-shelf
fix/deps-audit-2026-10-01
fix/877-title-reads
fix/798-audio-received-at
build/lane11-17-j7
build/lane11-16-levelup
build/lane11-14-seams
build/lane11-14-seed
build/lane11-15-start
build/lane11-13-old-block-out
fix/980-review-r3
build/lane11-12-block
build/lane11-8-packs
fix/demo-seed-canonical-names
build/lane11-11-hot-half
docs/l11-decisions
build/lane11-7-convert
build/lane11-10-editing
fix/npm-audit-brace-expansion
build/lane11-9-sheet-page
fix/bot-pyjwt
build/lane11-6-content
fix/lane11-rank-names
build/lane11-2b-language
build/lane11-4-js-evaluator
build/lane11-3-server
build/lane11-5a-pf2e
build/lane11-5b-5e
feat/design-admin
build/lane11-2-evaluator
build/lane11-1-sheet-pieces
build/lane11-0-drawing
fix/943-quest-objectives-fk
fix/prepsheet-shelf-flake
fix/945-leftovers
build/demo-gm-copy
fix/901-email-landings
build/lane10-8-journeys
build/demo-seed-lanes-8-10
fix/887-gm-own-confirmation
build/lane9-5-j1-admin
fix/918-audience-click
fix/useasync-overtaken
ci/939-critical-path
test/937-backend-suite-speed
chore/claude-orchestration
fix/924-xp-gm-only
fix/session-stale-poll
docs/decisions-d239-d242
fix/930-pypdf
build/lane8-journeys
build/925-quest-editor
fix/894-private-page-pictures
build/lane8-p4-drafts
build/lane8-p7-map
build/lane8-p6-handouts-rules
fix/wiki-fixture-names
build/lane10-d227-test-usage
fix/rsvp-horizon-test-tuesday
fix/media-volume-owner
build/lane8-p3-editor
fix/912-unidentified-rename
build/lane8-p5-party-quests
build/lane8-handout-takeback
build/lane10-pickers
build/lane8-p2-article
build/lane8-6-map
build/lane10-7b-email-pages
build/lane8-5-handouts
build/lane10-7a-test-the-bot-pages
build/lane8-p1-pages
build/lane8-4-quests
build/lane8-2b-feeds
build/lane8-3-parties
build/lane8-2a-links
build/lane10-5-commands
build/lane9-6-seed
build/lane10-4b-reactions
build/lane9-4d-pages
build/lane9-4c-pages
build/lane10-4a-posts
build/lane10-3-email
fix/891-web-fonts
build/lane9-4b-pages
build/lane10-6-test-the-bot
build/lane10-2-notify-out
build/lane8-1-wiki-text
build/lane9-4a-frame
design/lane10-drawings
fix/j6-budget
fix/j5-phone-flake
fix/869-test-leaks
fix/843-record-start-followups
build/lane7-all
build/lane6-all
build/lane9-b2-server
chore/changelog-fragments
docs/decisions-d218
build/lane9-a-owner-overview
fix/rule-card-level-label
fix/834-retention-semantics
fix/o3c-record-without-announcement
docs/decisions-d179
docs/decisions-d131-d170
fix/851-commit-before-response
build/lane6-j3-seed
build/lane9-b1-d67-identity
fix/841-blocking-loop
build/lane9-c-backups-audit
fix/vote-race-and-start-commit
fix/recording-announcement
fix/proposal-read-leak
fix/last-admin-guard
build/lane6-p4c-planning
build/lane6-p4b-margin
build/lane6-p4a-sheet
build/lane5-j4-seed
build/lane6-base
build/lane7-pages-talk
build/lane5-pages
build/lane7-pages-safety
build/lane7-p3-safety
build/lane7-p2-notify
build/lane6-p3-planning
build/lane6-p2-history
build/lane6-p1b-items
build/lane7-p1-threads
build/lane5-p6-faces
build/lane6-p1a-sheet
build/lane5-p5-find
build/lane5-p4a-board
build/lane5-p4b-scenes
build/lane5-p3-live
build/lane5-base
build/lane5-p2-cards
docs/lane5-decisions
build/review-r2-wide
fix/review-r1
build/lane5-p1-scenes
build/demo-seed
build/lane4-journeys-j5
build/lane4-page-review-b
build/lane4-page-review-a
build/lane4-page-read
build/lane4-journeys
build/lane4-page-sess2
build/lane4-page-sess1
build/lane4-notes
build/lane4-discord-on-approval
build/lane4-scheduling
build/lane4-versions
build/760-session-number
build/lane4-decisions
build/797-erase-no-regenerate
build/test-race-audit
build/lane3-completions
build/794-dark-only
build/796-titles-scroll
build/791-retention-anchor
build/a11y-sweep
build/shell-followups
build/retention-preview
build/753-backup-readback
docs/d91-d93
build/lane3-j1
build/ci-harness-paths-selftest
fix/useauth-test-race
build/ci-harness-paths
build/777-ai-settings-read
build/lane3-settings-c
build/lane3-settings-b
build/lane3-j6
build/lane3-sessionform
build/lane3-settings-a
build/lane3-members
build/lane3-thisweek
build/lane3-story
chore/87-align-python-3.12
v4.8.0-rc1
v4.7.1
v4.7.1-rc1
v4.7.0
v4.7.0-rc4
v4.7.0-rc3
v4.7.0-rc2
v4.7.0-rc1
v4.6.2
v4.6.2-rc4
v4.6.2-rc3
v4.6.2-rc2
v4.6.2-rc1
v4.6.1
v4.6.1-rc1
v4.6.0
v4.6.0-rc2
v4.6.0-rc1
v4.5.3
v4.5.3-rc1
v4.5.2
v4.5.2-rc1
v4.5.1
v4.5.1-rc2
v4.5.1-rc1
v4.5.0
v4.5.0-rc12
v4.5.0-rc11
v4.5.0-rc10
v4.5.0-rc9
v4.5.0-rc8
v4.5.0-rc7
v4.5.0-rc6
v4.5.0-rc5
v4.5.0-rc4
v4.5.0-rc3
v4.5.0-rc2
v4.5.0-rc1
v4.4.1
v4.4.0
v4.3.0
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.2
v4.1.1
v4.1.0
v4.0.1
v4.0.0
v3.11.4
v3.11.3
v3.11.2
v3.11.1
v3.11.0
v3.10.0
v3.9.1
v3.9.0
v3.8.0
v3.7.0
v3.6.1
v3.6.0
v3.5.0
v3.4.1
v3.4.0
v3.3.0
v3.2.0
v3.1.0
v3.0.0
v2.1.0
v2.0.0
v1.1.0
v1.0.0
v0.12.0
v0.11.0
v0.10.0
v0.9.1
v0.3.3
v0.9.0
v0.8.0
v0.3.2
v0.3.1
v0.3.0
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.2.1
v0.2.0
v0.1.1
v0.1.0
Labels
Clear labels
backend
Issue related to the backend
bot
Issue related to the bot
bug
Something is not working
duplicate
This issue or pull request already exists
enhancement
New feature
frontend
Issue related to the frontend
help wanted
Need some help
invalid
Something is wrong
question
More information is needed
recording
Issue related to the recording system
security
Security hardening / vulnerability work
wontfix
This won't be fixed
No labels
backend
bot
bug
duplicate
enhancement
frontend
help wanted
invalid
question
recording
security
wontfix
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/Quest-Board#1328
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Origin. The owner, 2026-11-03: first "a whole company, generated offline" (size, trade, name, what it makes, who owns and works there). Then, thinking further: it shouldn't be one category's feature. It should be optional ("after I pick a name I could choose to generate the rest of it"), and it should work from any starting point ("if I generate an NPC, maybe generate where they work or live").
The idea. Every page type already has a list of suggested facts per game system (#1279,
suggested_facts.json). "Fill it in" rolls values for those facts, offline, from tables and from the name generators (#1257). A whole company is then just a Business page filled in. An NPC's Home and Work, a settlement's Ruler and Notable places, and a guild's Leader all use the same mechanism.Two kinds of fact
[[…]]).Optional, step by step. Nothing is written until the GM says so.
Entry points
The company bundle, as the first template. Size (small, medium or large) and Trade (selectable, or "surprise me") set:
Not in scope: AI. All of this is tables and generators. Facts suggested from transcripts are #1280, a different source.
Depends on: #1279 (merged), #1257 (the generators, being rated), and the owner's answers to the questions on the Questions page.
Release: new functionality, so an X.Y.0 after 4.7.0.
A whole company, generated offline: size, trade, name, and the people who own and work thereto Fill it in: roll a page's facts, and the people and places they point to, offline (generalises "a whole company")The owner's answers (2026-11-03). They become decision rows (D327–D329) when the drawing lands.
Next: a drawing (lane 6k) of the editor's dice and "Roll the rest", the draft-bundle list before saving, the company template (size and trade), and "Make it a page" from the name generator. The tables of values for each fact come with it, for review. This is new functionality, so it goes in the release after 4.7.0.
Phone layout (owner, 2026-11-03): the die sits beside the value, not under it. A fact row on a phone is three compact rows: the fact's name; the value with its die or Roll again; Who sees it with Remove. Lane 6k is updated and live (0 overlaps, no sideways scroll at 390 px).
Matching jobs to the company (the owner's question): each trade is a reviewed recipe, in data, not code. A
company_trades.jsonfile, reviewed like the suggested-fact lists, gives each trade:Sizes it comes in. An eatery can be small or medium; a mercenary company only medium or large; a moneylender any.
Roles by size, as slots: a title, how many, required or optional, and who they tend to be. For example:
Required slots are filled first, then optional ones up to the size's headcount, so a large shipper never comes out as a smith and an apprentice.
Traits per role, drawn without repeats and mixed with a general pool. A clerk gets "keeps a second ledger nobody has seen", a barge captain "superstitious about red sails". Traits fit the job, and no two people in one company share one.
What-it-does lines with slots: "{goods} down the {river} to the coast, and {return goods} back up". The goods and route words come from the trade, and the place words from the company's location.
Name patterns fitted to the trade (Forge, Smithy and Ironworks for a smithy; Carrying Company and Freight for a shipper). A name built on the owner's name uses the rolled owner's name, so "Hask's Forge" is always run by a Hask. Relatives share the surname.
Where it can be. A shipper needs a settlement on a river or coast, a quarry the hills, a mill water. A rolled location is drawn to suit, and an existing one is offered only if it fits.
Names of the people come from the campaign's usual styles, or a mix chosen once in the campaign's settings.
All of this is offline and deterministic enough to test: each trade and size is rolled thousands of times in tests, checking that required roles are present, the headcount is right, no trait repeats, the owner and the name agree, and the location suits. The recipes would go on the feedback site to rate, like the names, before they reach Quest Board.
The owner's answers (2026-11-03), Q223–Q226:
Jobs first, not trades first (the owner's suggestion, adopted): list every job once, with the trades it can work in, e.g.
job: smith; trades: smith, shipping, stables. A trade then only says:The remaining places are filled from every job that lists the trade, so adding a job adds it everywhere it fits without touching any trade. A job can carry a title per trade (a smith on a ship is the ship's smith or armourer; in a stables, the farrier), a lowest size (a Factor only in a large house), its traits, and how often it's a relative of the owner.
The same list answers the reverse question, the owner's earlier idea: an NPC who rolls "smith" for their job can roll where they work, from the trades that job lists, as a new company or one the campaign has.
Lane 6k's die is now level with the value box on phones and wide screens (measured to within a pixel).
The owner's answer to Q227 (2026-11-03): (a). The trades list for the company template is these 22, plus Magic & enchantments where the system sells magic (Pathfinder 2e yes; it can be switched off for a low-magic setting):
"Surprise me" stays. Each trade gives its sizes, headcount, the job that runs it and any required jobs. Every other place comes from the jobs list (jobs first, see above).
Names that use the place they're in (the owner's follow-up, 2026-11-03, long-term). Many company, guild, church and noble names include their town, region or area: "The Kettlebridge Chandlers' Guild", "St Odile's of Harrowmere", "House Varro of Kettlebridge", "The Saltmarsh Trading Company". When a roll knows where it is, the name should use that real place, not a generated one.
How it fits here:
The engine in #1257 should be built so a pattern's place slot can be filled from outside, so this needs no rewrite later.
Slice 1 is up for review: PR #1354 (the recipes as data, plus a rating page at
/companieson the feedback site). Not merged, not deployed.Slice 1 is merged (#1354) and live on the feedback site (owner's approval, 2026-11-06).
https://questboard-dev.rhoving.com/feedback/companies?k=<share key>, the same key as the names page. Ratings are stored per rater like the names ones, and they're in the review dashboard under "Company roller", with a CSV.tools/feedback-siteonto docker-test's~/projects/qb-feedback..envand the ratings volume were kept. The old copy is backed up at~/projects/qb-feedback.bak-20261106T210220Z./healthis ok./companies,fill-data.js,fill-engine.jsandname-engine.jsload through the public/feedback/prefix, the page's links are relative, and/namesstill loads its moved engine.Next: slice 2 builds the engine into Quest Board (port the data word for word, as the names were), after the owner's ratings. Two notes are already queued for that round: in-laws shouldn't share the owner's surname, and the two "what it does" lines shouldn't repeat each other.
The owner's company ratings are in (2026-11-09): all 8 trades rated got a thumbs up (inn, brewery, provisions, smithy, carpenter, textiles, bank, magic). The one note: "Chalthorpe & Daughters" had kin whose names didn't match. Q254 (CG1) was answered (c), recorded as D346. Slice 2 uses neutral patterns ("& Kin", "& Family", "& Children") in place of "& Sons", "& Daughters" and "& Daughter", and gendered names follow as their own issue.
Slice 2 starts now: the engine ported into Quest Board with its data word for word, plus the queued fixes:
Then the wiki editor's dice and "Roll the rest", the draft-bundle list, and the company template (the first way in, Q222). A contract comes first.