feat(parity): capability matrix for larpinq against five competitors - #730
Merged
Merged
Conversation
…cells unknown Systems, areas, category and the seed rows from our code and from what competitors do. No rating yet: every cell is unknown until the readers report. Read at development a82e254.
153 rated rows and 5 pending in 11 areas, read at development a82e254. Competitor columns are documentation readings from 2026-09-26. Seven cross-area duplicates and two engineering-only rows dropped; the pretix licence cell corrected from the LICENSE text.
Contributor
Quality Report — ConductionNL/larpinq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 108/108 | |||
| npm | ✅ | ✅ 525/525 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it on any branch from the Actions tab, or locally with npx playwright test. |
||||
| Hydra gates | ✅ |
Quality workflow — 2026-09-26 08:12 UTC
Download the full PDF report from the workflow artifacts.
This was referenced Sep 26, 2026
Game masters cannot override an unmet skill requirement, because no screen exposes the override
#733
Open
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
openspec/parity/capabilities.json, larpinq's first capability matrix. The competitor columns are documentation readings. It is a data file only: no page is wired to it and no code changes.I read the code at development
a82e254. The matrix has 153 rated rows and 5 pending questions in 11 areas, rated for larpinq and five competitors.Category
This is LARP organisation management: the back office a live-action role-play group runs its campaign on. It keeps the game world, the character sheets and the players behind them. It encodes the group's own ruleset (abilities, skills with prerequisites, items, conditions and effects) and refuses illegal builds. It awards experience after each event, and it runs the events themselves: roster, check-in, printed sheets and GM run sheets.
It is not a ticket shop, a worldbuilding wiki or a virtual tabletop. Buyers still compare it against all three for the parts that overlap.
I decided this from the code: 10 schemas in
lib/Settings/larpinq_register.jsonand 31 pages insrc/manifest.json. It is written into the file'scategoryfield so it can be corrected in one place.What research existed
larp,larpingappandlarpinqfinds only portfolio lines.market-intelligencehas nothing for larpinq.larpingapp:openconnectorandshillinq.Columns and why
larpmanagermylarplarp-portalkankapretixLeft out:
MyLARP and LARP Portal publish thin documentation. That is why their columns hold 102 and 78 unknowns, each covered by a system-level
unknownReason.Licences. Kanka's licence adds a Commons Clause, so it is source-available and rates partial on
adm-open-source. The pretix reader also rated pretix partial, citing "anti-SaaS terms". I corrected that cell to yes from the LICENSE text. pretix's Section 7 terms are an extra permission: they let you skip AGPL section 13 when you are not running pretix as a service. The plain AGPLv3 grant stands.Rows
Ratings (153 rated rows):
Where the rows came from:
Pending (5). These are questions a code reading cannot settle, so they are kept out of the rated list:
x-openregister-notifications: approval, and an event reminder.hermiq-ai-toolingchange is unbuilt.Dropped at the end (9).
Sample rows (larpinq / larpmanager / mylarp / larp-portal / kanka / pretix):
rul-skill-prerequisiteslib/Settings/larpinq_register.json:480-491,lib/Service/SkillRequirementChecker.php:111prg-block-illegal-buildlib/Service/SkillRequirementChecker.php:70-99evt-checkinsrc/views/EventRoster.vue:48-71ins-dashboardsrc/manifest.json:155evt-calendarlib/Settings/register.d/event-calendar-leaf.jsonchr-approvallib/Settings/larpinq_register.json:101-111chr-live-statslib/Service/CharacterService.php:353-403, computed but not shownprt-character-pdflib/Controller/CharactersController.php:139, no page calls itprg-award-xp-bulkreg-online-paymentClaimed differentiators nobody has checked
These are rows where we read yes and no competitor reads yes or partial. For all but the Nextcloud-specific ones, the LARP-specific columns are mostly unknown, so they are unverified claims, not established leads:
chr-conditions: record the conditions affecting a character.rul-define-conditions: define conditions and their effect on stats.rul-effect-stacking: effects stack in a predictable order.rul-skill-tree-per-character: the skill tree coloured for one character.rul-skill-tree-cycle-tolerance: the skill tree survives a prerequisite cycle.prg-requirement-report: see why a character cannot take a skill.prg-xp-audit: every XP award, with who gave it, when and why.chr-xp-award-history: per-character award history.Nextcloud-only, and genuinely unique to the platform:
ply-link-contact,ply-link-user,com-deep-links,ins-unified-search,adm-reimport-config.Clearest gaps. These are rows where we read no and at least two of the three LARP tools read yes or partial:
All of registration and payment reads no.
Live-defect candidates
Each of these is a code reading and needs a live check.
slNotesPrivateandbackgroundare described as hidden from players but sit in the CharacterDetail widgetschar-progressandchar-identityinsrc/manifest.json. The app has no property-level access control: a grep forx-property-rbacfinds nothing.lib/Controller/CharactersController.php:139(downloadPdf) checks for a Nextcloud admin.EventsControllerandlib/Listener/CharacterRequirementListener.phpcheck thegamemastersgroup.lib/Settings/register.d/portal-identity.jsonsayscharacter.ownerRefis stamped byPortalObjectWriter. No such class exists in the repo, solib/Portal/PortalContributionProvider.phpwould scope players by a field nothing fills.character.requirementOverridesis enforced and audited byCharacterRequirementListener. But it isvisible:falseand in no widget, so no page lets a GM create an override.lib/Service/CharacterService.php:353-458computes ability values and a per-source audit trail. Its only consumer is the XP budget check inSkillRequirementService. The overlay's "transparent stat audit trail" and "self-recomputing character sheets" are listed as stable but are not reachable on any page.item.uniqueandcondition.uniqueare declared inlib/Settings/larpinq_register.json, but no listener enforces them.src/views/settings/Settings.vue:450calls/index.php/apps/larpingapp/api/settings/load, with the old app id, on a route found only in the fallback list inappinfo/routes.php. The caller,loadConfiguration()at line 444, is never invoked, so this is dead code rather than a visible break.openspec/specs/event-signup-to-forms-leaf/spec.mdsays capacity and waitlist logic stays in larpinq. A grep oflib/for capacity and waitlist finds nothing.openspec/specs/larping-skill-widget/spec.mddescribes a GraphQLSkillUsageChartthat no longer exists.src/services/graphql.jshas no importers.src/views/EventRoster.vue:210-220sends OCS headers on a plain app route. This is unconfirmed.Backends no page reaches
characters#downloadPdf:appinfo/routes.php:30,lib/Controller/CharactersController.php:139.events#downloadRunsheet:appinfo/routes.php:31,lib/Controller/EventsController.php:105.Neither PDF route has a caller in
src/.openspec/changes/larpinq-pdf-frontend-download-actionis the open change for this.CharacterService::calculateAllCharacters()(lib/Service/CharacterService.php:246-255) has no callers. Two readers found this independently./api/preferences/{key}has no literal caller insrc/. nc-vue may call it internally, but that is unconfirmed.src/services/graphql.jshas no importers.Where the method was harder than the skill says
ba97f33againsta82e254). Thels-remotecheck in the brief was needed, not a formality.Verification
python3 parity_verify.py openspec/parity/capabilities.json --strict, from hydra.claude/skills/parity-verifyon development:The only finding is the unknown census.
--strictexits 1 on the census alone, by design. There are nostale-readingfindings, because every column was read today.This is a JSON file under
openspec/that no code imports, so the product's suites cannot be affected, and I did not run them.🤖 Generated with Claude Code