[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6WM90QCZNQQ1F5MR8W8ZPWC":3,"skill-same:01M6WM90QCZNQQ1F5MR8W8ZPWC":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6WM90QCZNQQ1F5MR8W8ZPWC","zfc-leveling-roadmap",null,"ZFC Level-Up architecture alignment — file boundaries, API contracts, pre-flight checks, and milestone status. Read this BEFORE any level-up\u002Frewards\u002FXP code change.","jleechanorg\u002Fjleechan-skills","jleechanorg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F221404966?v=4","01M6C1VJ99XG950X1DWPEBCBGX","01M6C1VJDK5YVDNT3362RT5WSB",6,"MIT","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fworldarchitect\u002Fskills\u002Fzfc-leveling-roadmap\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000031","产品经理",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"leveling","roadmap","zfc leveling roadmap","alignment","api contracts","file boundaries","mvp","xp","project","milestone","contracts","mvp_site","change","up","read","api","file","code","status","architecture","2026-11-10 10:12:30",false,"---\nname: zfc-leveling-roadmap\ndescription: ZFC Level-Up architecture alignment — file boundaries, API contracts, pre-flight checks, and milestone status. Read this BEFORE any level-up\u002Frewards\u002FXP code change.\nscope: your-project.com\u002Fmvp_site\n---\n\n# ZFC Leveling Roadmap Alignment\n\n## Design Principle\n\nThis skill is the level-up\u002Frewards specialization of the general ZFC contract.\nBefore applying these file boundaries, read\nthe `zero-framework-cognition` skill for the repository-wide\nrules: models make semantic decisions, new regex\u002Fkeyword\u002Fheuristic semantic\nrouting is banned, and model contracts should request minimal semantic fields\ninstead of redundant aliases.\nBefore accepting a backend correction guard, also apply\nthe `root-cause-first` skill: prove the selected model path\nreceived the right prompt\u002Fschema, fix missing or ambiguous prompt\u002Fschema\ninstructions first, and treat backend correction as a last resort.\n\n> **\"Model Computes, Backend Formats\"** — the LLM decides level-up; `rewards_engine.py` formats it; `world_logic.py` wraps the formatted result with modal semantics.\n\nFor WorldArchitect-specific backend ownership, this summary defers to the\nrepository overlay `.claude\u002Fskills\u002Fworldai-zfc\u002FSKILL.md`, the portable\nthe `zero-framework-cognition` skill, and\nthe `backend-justified` skill. Do not infer permission to alter\nmodel-owned domain state from schema validity, determinism, or this file alone.\n\n> **\"LLM Owns Domain Decisions; Backend Preserves and Executes\"** — the model owns gameplay interpretation, progression, rewards, and choices. The server owns authorization, storage, transport, concurrency, and modal\u002Fsession control. A backend transformation of model-owned fields is an exception only when the active repository policy explicitly authorizes that named exception and its required evidence is recorded; preserving a valid player turn is the UX default.\n\n> **Correction Exception Boundary**: This guide does not authorize backend correction of gameplay meaning. Follow the local ZFC\u002Fbackend-justification contract for each proposed transformation. A registered adjustment is necessary only where that active contract requires it; registration or determinism alone does not authorize a domain transformation. Name the exact field, function, policy basis, necessity, and required evidence. Do not add defaults, clamps, suppressions, or normalization to model-owned domain fields based only on contradiction, UX, or determinism.\n\n> **Opaque Choice Boundary**: Planning choice IDs are opaque handles, not semantic signals. `level_up_now`, `finish_level_up_return_to_game`, and `custom_action` are migration\u002Fcompatibility handles only. Level-up choice meaning must come from explicit model\u002Fschema fields on the resolved choice object, not from ID text, prefixes, labels, or backend allowlists.\n\n---\n\n## File Responsibility Table (Mandatory)\n\nBefore modifying ANY file for level-up\u002Frewards\u002FXP work, verify against this table.\n**If your change puts logic in a \"MUST NOT DO\" column → STOP and redesign.**\n\n| File | OWNS | MUST NOT DO |\n|------|------|-------------|\n| `rewards_engine.py` | Format and project explicit model signals; keep transport\u002Fpayload atomicity handling limited to preserving complete supplied representations and server-owned transaction\u002Fcontrol invariants. Any transformation of model-owned gameplay fields requires its own named, policy-authorized exception and evidence. | Model calls, Firestore writes, text interpretation, primary XP\u002Flevel calculation, threshold-derived level-up decisions, or unregistered correction\u002Fnormalization\u002Fsuppression of gameplay meaning |\n| `world_logic.py` | Modal locks and consumption of model-authored finish choices; wrap payloads only where its contract permits | Inject or synthesize choices; recompute model-owned progression; call `canonicalize_level_up_signal()` directly |\n| `game_state.py` | State storage, deterministic mechanical primitives (`xp_needed_for_level`, `level_from_xp`, `coerce_int`) | Decide level-up from state, replace model choices, own level-up decisions, contain level-up dataclasses or resolvers |\n| `agents.py` | Route to correct agent using `rewards_engine.is_level_up_active()` | Inline flag interpretation, XP extraction, stale-flag recovery logic |\n| `llm_parser.py` | Parse model output, call the pipeline **once** via `canonicalize_rewards()`, persist\u002Fdeliver | Duplicate rewards formatting, inline false-positive mutations, call canonicalization separately |\n| `narrative_response_schema.py` | Preserve model output losslessly and validate structural\u002Fschema requirements without deciding gameplay meaning | Class feature synthesis, state mutation, building UI payloads, or rejecting a turn because model-authored progression fields appear contradictory |\n| `llm_service.py` | LLM request\u002Fresponse pipeline, retry on `SchemaRejectionError` | Rewards formatting, level-up flag interpretation, modal state mutation |\n| `structured_fields_utils.py` | Extract non-empty structured fields | Semantic validation, alias normalization, UI formatting |\n| `prompts\u002Flevel_up_instruction.md` | Class-AGNOSTIC contracts only — generic enumeration (\"enumerate ALL subclass options as separate clickable choices\"), generic announce-all-gains rules. The model owns the D&D 5e SRD. | Hardcode subclass names (oaths\u002Fcircles\u002Fpatrons\u002Farchetypes\u002Fdomains), feature names (Divine Health, Channel Divinity, Second Wind…), spell names, or per-class numeric gains as named rules\u002FHARD INVARIANTs. Class names allowed ONLY inside `e.g.`\u002F`for example` illustrations. |\n\n---\n\n## Authorized Public API Surface\n\nThese are the **only** `rewards_engine` functions that external files may call:\n\n| Function | Callers | Purpose |\n|----------|---------|---------|\n| `canonicalize_rewards(structured_fields, game_state, original_state)` | `llm_parser.py` (1 call), `world_logic.py` (polling paths) | Single convergence point for all rewards\u002Flevel-up UI |\n| `is_level_up_active(game_state)` | `agents.py`, `world_logic.py` | Read explicit progression signals and server-owned modal control; any domain transformation follows the Correction Exception Boundary |\n| `project_level_up_ui(game_state, original_state)` | `world_logic.py` (via `_project_level_up_ui_locally()`) | Polling\u002Fprojection path (transitional — delete when callers migrate) |\n| `sync_level_up_signals(game_state, original_state)` | `world_logic.py` (via `ensure_level_up_rewards_pending()` shim) | Idempotent rewards_pending sync |\n| `format_model_level_up_signal(signal)` | `llm_parser.py` (fallback path) | Explicit signal formatter (should become private `_format_...`) |\n\n**All other functions are private implementation details.** Do not call `_canonicalize_core()`, `_enforce_atomicity()`, `_apply_contradiction_guard()`, `resolve_level_up_signal()`, or `ensure_rewards_box()` from outside `rewards_engine.py`.\n\n---\n\n## API Contract Freeze\n\n- `canonicalize_rewards()` returns `(rewards_box, planning_block)` — a **2-tuple**. **Do NOT change this return signature.** Use `out_meta` dict parameter to pass additional data out (e.g., canonical signal, false-positive flags).\n- `canonicalize_level_up_signal()` is called **inside** `rewards_engine.py` only. External files consume precomputed results.\n- `is_level_up_active()` returns `bool`. It reads explicit progression signals and server-owned modal control. This API shape does not authorize contradiction suppression or XP-threshold decisions; any transformation of a model-owned field requires the named active-policy exception and evidence in the Correction Exception Boundary.\n- `ensure_rewards_box()` returns `tuple[dict | None, dict | None]` (rewards_box, signal_metadata). Internal only.\n\n---\n\n## Common Boundary Violations\n\nThese are the most frequently observed agent drift patterns. If you catch yourself doing any of these, STOP:\n\n| If you're about to... | WRONG file | RIGHT approach |\n|----------------------|------------|----------------|\n| Call `canonicalize_level_up_signal()` | `world_logic.py`, `llm_parser.py` | Only inside `rewards_engine.py` (via `_canonicalize_core`) |\n| Build a `level_up_signal` dict | `world_logic.py` | Build in `rewards_engine.py`, pass via return or `out_meta` |\n| Compute XP progress, thresholds, target level, or level-up availability as the primary path | any backend file | Ask the LLM for explicit calculated fields; preserve them unless the exact transformation satisfies the Correction Exception Boundary |\n| Check `level_up_pending` \u002F `level_up_in_progress` flags directly | `world_logic.py`, `agents.py` | Call `rewards_engine.is_level_up_active()` |\n| Call `resolve_level_progression()` | anywhere | **Deleted.** Use `rewards_engine.is_level_up_active()` or `rewards_engine.project_level_up_ui()` |\n| Use `build_level_up_rewards_box()` | anywhere | **Deleted.** Use `rewards_engine.ensure_rewards_box()` (internal) or `project_level_up_ui()` |\n| Change `canonicalize_rewards()` return type | anywhere | **Don't.** Use `out_meta` dict instead |\n| Add signal normalization aliases | `structured_fields_utils.py` | First establish the exact active-policy exception and evidence under the Correction Exception Boundary; this table alone grants no normalization authority |\n| Classify or scrub choices by ID text\u002Fprefix, label, enum name, or CSS class | any backend file | Resolve the submitted handle against persisted `planning_block.choices`, then read explicit structured fields; keep `level_up_now`, `finish_level_up_return_to_game`, and `custom_action` exact checks migration-only |\n| Add a new feature to a level-up PR | the same PR | Open a separate PR — scope creep is the #1 cause of spin |\n| Access `rewards_engine._is_state_flag_true()` from outside | `agents.py`, `world_logic.py` | Use the public helpers or import from `game_state.py` |\n\n---\n\n## Pre-Flight Checklist\n\nRun this **before writing any code** for a PR that touches level-up, rewards, XP, or canonicalization logic.\n\n### 1. File boundary check\nFor each file you plan to modify, check the table above:\n- [ ] Is the change in the \"OWNS\" column? → Proceed\n- [ ] Is it in the \"MUST NOT DO\" column? → **STOP. Redesign.**\n\n### 2. API contract check\n- [ ] Am I changing the return signature of `canonicalize_rewards()`? → **Don't.** Use `out_meta`.\n- [ ] Am I calling `rewards_engine.*` from `world_logic.py` outside the authorized API surface table? → Check boundary table.\n- [ ] Am I directly reading `level_up_pending` \u002F `level_up_in_progress` flags instead of calling `is_level_up_active()`? → Use the centralized function.\n- [ ] Am I adding or expanding a choice-ID allowlist, prefix check, or text\u002Flabel check for level-up behavior? → **STOP.** First prove the selected choice is resolved from persisted structured state and that the model\u002Fschema exposes the needed semantic field. Exact legacy handles (`level_up_now`, `finish_level_up_return_to_game`, `custom_action`) require a migration note and must not become the pattern for new behavior.\n\n### 3. Deleted function check\n- [ ] Am I calling any of these **deleted** functions? → **They no longer exist:**\n  - `game_state.resolve_level_progression_state()`\n  - `game_state.resolve_level_progression()`\n  - `game_state.ensure_level_up_rewards_pending()`\n  - `game_state.LevelProgressionState`\n  - `game_state.PendingRewardsState`\n  - `world_logic.build_level_up_rewards_box()`\n  - `agents._is_stale_level_up_pending()`\n\n### 4. Scope check\n- [ ] Does a task spec exist in `~\u002Froadmap\u002Fzfc-pr-task-specs-2026-04-22.md`?\n- [ ] If yes, is every file I'm touching in the \"Likely files\" list?\n- [ ] Am I adding unrelated features to this PR? → Open a separate PR.\n\n### 5. PR hygiene check\n- [ ] Does an open PR already cover this scope? → Fix that PR instead of creating a new one (see `${CLAUDE_HOME:-$HOME\u002F.claude}\u002Fskills\u002Fpr-quantity-control\u002FSKILL.md`).\n\n---\n\n## Decision Flowchart\n\n```\nIs my change about level-up\u002FXP\u002Frewards logic?\n├── YES → Model-owned gameplay meaning belongs in the prompt\u002Fschema\n│   ├── Server execution or transport? Follow the ownership table and active contract\n│   ├── Does world_logic.py need the result?\n│   │   └── Pass via return value or out_meta dict\n│   ├── Does agents.py need to know if level-up is active?\n│   │   └── Call rewards_engine.is_level_up_active() — never inline flag checks\n│   └── Does llm_parser.py need the result?\n│       └── Call canonicalize_rewards() once; don't call internal functions directly\n├── Is my change about model output?\n│   └── Diagnose the prompt\u002Fschema at the root cause first\n│       └── Preserve valid player turns; no contradiction-repair retry is authorized here\n└── NO → Normal file protocol applies\n```\n\n---\n\n## Historical Milestone Snapshot\n\nThe statuses and implementation notes below are a snapshot from [source commit `04afb7f1b93af731240f1298a1234237e4e608da`](https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fcommit\u002F04afb7f1b93af731240f1298a1234237e4e608da), dated 2026-05-13. They do not establish current project status or grant permission to add a transformation; verify current source and owner instructions before acting. In particular, the “fail-closed” semantic SSE wording describes that historical implementation report and does not authorize rejecting player turns.\n\n| Milestone | Status | Description |\n|-----------|--------|-------------|\n| M0 | ✅ Complete | Delete legacy paths, net LOC ≤ 0 |\n| M1 | ✅ Complete | Model compliance probe — prompt contract + streaming evidence |\n| M1b | ✅ Complete | Repeated-run reliability harness (Wilson score intervals) |\n| M2 | ? Near Complete | Legacy resolver deletion done; formatter narrowing partially done |\n| M3 | ? Partially Started | Snapshot reported CI grep gates active via `design-doc-gate.yml` (8 gates reported enforced) |\n\n### M2 Work Reported Complete at Snapshot (via product-repository PR #6641)\n- ✅ `game_state.py` — all legacy resolvers and dataclasses deleted (422 LOC)\n- ✅ `world_logic.py` — `build_level_up_rewards_box()` deleted, all `resolve_level_progression()` calls removed\n- ✅ `agents.py` — `_is_stale_level_up_pending()` deleted, all routing uses `is_level_up_active()`\n- ✅ `rewards_engine.sync_level_up_signals()` replaces 200-line `ensure_level_up_rewards_pending()`\n- At the snapshot, `_enforce_atomicity()` was reported rewritten for semantic SSE validation (fail-closed); this is a historical implementation note, not current permission to reject turns.\n- ✅ Canonical XP field names enforced: `current_turn_exp`, `total_exp_for_next_level`\n- ✅ `ensure_rewards_box()` returns `tuple[dict|None, dict|None]`, field `resolved_target_level` → `new_level`\n\n### M2 Remaining Work as Reported at Snapshot\nThe snapshot listed these follow-ups; verify current callers and ownership before using them as a plan:\n- `format_model_level_up_signal()` → make private (`_format_model_level_up_signal`)\n- `project_level_up_ui()` → delete when no remaining callers (reported then as used by `_project_level_up_ui_locally()`)\n\n### M3 Snapshot — CI Enforcement Gates (Reported Active)\nAt the snapshot, `design-doc-gate.yml` was reported to enforce 8 grep-based boundary checks. Verify the workflow and its current scope before relying on this historical status.\n\n| Gate | Rule | Status at snapshot |\n|------|------|--------|\n| `world_logic 0 rewards_engine public API imports` | No direct `from rewards_engine import` in world_logic | Reported enforced at snapshot |\n| `world_logic 0 resolve_level_up_signal calls` | No direct resolver calls | Reported enforced at snapshot |\n| `constants get_xp_for_level` | No duplicate XP helpers in constants | Reported enforced at snapshot |\n| `constants get_level_from_xp` | No duplicate level helpers in constants | Reported enforced at snapshot |\n| `_is_state_flag_true 2 files` | Helper exists in exactly 2 files | Reported enforced at snapshot |\n| `world_logic ≤1 project_level_up_ui` | At most 1 non-wrapper call | Reported enforced at snapshot |\n| `non-rewards 0 direct level-up pair builders` | No external pair builders | Reported enforced at snapshot |\n| `llm_parser canonicalize_rewards=1` | Exactly 1 canonicalize call | Reported enforced at snapshot |\n\n### M3 Remaining Work as Reported at Snapshot\nThe snapshot listed these planned checks; verify current code and workflow ownership before implementing them:\n- Centralization ratchet: no new `def` in `world_logic.py` whose name exists in `rewards_engine.py`\n- Architecture test: `level_up_signal` formatting stays in `rewards_engine.py`\n\n---\n\n## Field Ownership Quick Reference\n\n**Every shared dict field must have exactly ONE authoritative writer.**\n\n| Dict \u002F Field | Writer | Semantic |\n|--------------|--------|----------|\n| `level_up_signal.current_level` | LLM | Int: level before applying the level-up |\n| `level_up_signal.target_level` | LLM | Int: target level now available; `target_level > current_level` is the model-owned level-up signal |\n| `rewards_pending.level_up_available` | Backend-derived compatibility\u002Fdisplay field from accepted `level_up_signal` | Bool: deterministic UI alias; do not ask the model to emit it |\n| `rewards_pending.xp_gained` | LLM via state_updates; any transitional transformation requires the named active-policy exception and evidence | Int: model-calculated XP delta for rewards box |\n| `rewards_pending.new_level` | Backend-derived compatibility\u002Fdisplay field from `level_up_signal.target_level` | Int: deterministic UI alias; do not ask the model to emit it |\n| `player_character_data.experience.current` | Active repository field-specific contract | Int: cumulative accepted XP; writer and projection are owned by the current prompt\u002Fschema and ZFC contract |\n| `custom_campaign_state.level_up_in_progress` | Server-owned modal\u002Fsession control state | Bool: level-up modal active; model must not write this on story\u002Frewards turns |\n| `custom_campaign_state.level_up_pending` | Backend-derived compatibility\u002Fcontrol field from accepted level-up signal or modal state | Bool: modal routing compatibility; model must not write this on story\u002Frewards turns |\n| `custom_campaign_state.level_up_complete` | Server-owned level-up flow state | Bool: level-up flow finished (suppresses `is_level_up_active()`) |\n| `custom_campaign_state.level_up_cancelled` | Server-owned level-up flow state | Bool: level-up deferred (suppresses `is_level_up_active()`) |\n\nFor the full field registry, see the `field-ownership-contracts` skill.\n\n---\n\n## Key Architectural Invariants (Post-M2)\n\n1. **Model-owned progression; server-owned modal control**: `is_level_up_active()` may read explicit model-authored progression fields and server-owned modal\u002Fsession fields, but it must not adjudicate progression from XP thresholds or other game mechanics. Suppressing `level_up_pending=True` because a model-owned signal is “mechanically impossible” is a gameplay decision and is not authorized here. A correction to a model-owned field requires an exact active-policy exception, named field\u002Ffunction, concrete necessity, and that policy's evidence. Server-owned completion\u002Fcancellation state may control modal activity without rewriting the model's progression decision.\n\n2. **Streaming preservation**: Preserve supplied stream fields and their representation aliases. Missing one field is not a reason to drop the other or reject the turn. Stream\u002Fpayload atomicity enforcement may protect complete transport representations or server-owned transaction invariants; it must not validate gameplay semantics or discard a valid player turn over metadata\u002Frepresentation mismatch. Reject only when committing would corrupt server-owned storage.\n\n3. **Completion\u002Fcancellation precedence**: `level_up_complete=True` or `level_up_cancelled=True` always returns `False` from `is_level_up_active()`, regardless of other flags.\n\n4. **Progression limits**: Follow the active campaign progression contract; do not add a hardcoded cap or threshold-based fallback to this helper.\n\n5. **Single delegation**: `world_logic._project_level_up_ui_locally()` is a 1-line call to `rewards_engine.project_level_up_ui()`. No independent computation.\n\n---\n\n## Canonical References\nFor any WorldArchitect backend or progression change, read the local overlay `.claude\u002Fskills\u002Fworldai-zfc\u002FSKILL.md` together with the `zero-framework-cognition` skill, the `backend-justified` skill, and the `root-cause-first` skill. Prompt\u002Fschema correction comes before backend protection. Preserve model-owned gameplay meaning and unknown fields; server-owned storage, authorization, transport, concurrency, and modal\u002Fsession control remain server responsibilities. Any domain-field transformation must identify its exact active-policy exception, field and function, concrete necessity, and required evidence; where that policy requires registration, register it. This guide does not authorize finish-choice injection, paired payload dropping, gameplay defaults, clamps, semantic suppression, or rejection of a valid turn.\n\n## Related Skills\n\n- the `field-ownership-contracts` skill — full field writer\u002Freader registry\n- the `evidence-standards` skill — evidence requirements for production PRs\n- the `pr-green-definition` skill — canonical `\u002Fgreen` (CI green + no merge conflicts) definition; quality gates live in the draft phase\n","# ZFC Leveling Roadmap Alignment\n\n## Design Principle\n\nThis skill is the level-up\u002Frewards specialization of the general ZFC contract.\nBefore applying these file boundaries, read\nthe `zero-framework-cognition` skill for the repository-wide\nrules: models make semantic decisions, new regex\u002Fkeyword\u002Fheuristic semantic\nrouting is banned, and model contracts should request minimal semantic fields\ninstead of redundant aliases.\nBefore accepting a backend correction guard, also apply\nthe `root-cause-first` skill: prove the selected model path\nreceived the right prompt\u002Fschema, fix missing or ambiguous prompt\u002Fschema\ninstructions first, and treat backend correction as a last resort.\n\n> **\"Model Computes, Backend Formats\"** — the LLM decides level-up; `rewards_engine.py` formats it; `world_logic.py` wraps the formatted result with modal semantics.\n\nFor WorldArchitect-specific backend ownership, this summary defers to the\nrepository overlay `.claude\u002Fskills\u002Fworldai-zfc\u002FSKILL.md`, the portable\nthe `zero-framework-cognition` skill, and\nthe `backend-justified` skill. Do not infer permission to alter\nmodel-owned domain state from schema validity, determinism, or this file alone.\n\n> **\"LLM Owns Domain Decisions; Backend Preserves and Executes\"** — the model owns gameplay interpretation, progression, rewards, and choices. The server owns authorization, storage, transport, concurrency, and modal\u002Fsession control. A backend transformation of model-owned fields is an exception only when the active repository policy explicitly authorizes that named exception and its required evidence is recorded; preserving a valid player turn is the UX default.\n\n> **Correction Exception Boundary**: This guide does not authorize backend correction of gameplay meaning. Follow the local ZFC\u002Fbackend-justification contract for each proposed transformation. A registered adjustment is necessary only where that active contract requires it; registration or determinism alone does not authorize a domain transformation. Name the exact field, function, policy basis, necessity, and required evidence. Do not add defaults, clamps, suppressions, or normalization to model-owned domain fields based only on contradiction, UX, or determinism.\n\n> **Opaque Choice Boundary**: Planning choice IDs are opaque handles, not semantic signals. `level_up_now`, `finish_level_up_return_to_game`, and `custom_action` are migration\u002Fcompatibility handles only. Level-up choice meaning must come from explicit model\u002Fschema fields on the resolved choice object, not from ID text, prefixes, labels, or backend allowlists.\n\n---\n\n## File Responsibility Table (Mandatory)\n\nBefore modifying ANY file for level-up\u002Frewards\u002FXP work, verify against this table.\n**If your change puts logic in a \"MUST NOT DO\" column → STOP and redesign.**\n\n| File | OWNS | MUST NOT DO |\n|------|------|-------------|\n| `rewards_engine.py` | Format and project explicit model signals; keep transport\u002Fpayload atomicity handling limited to preserving complete supplied representations and server-owned transaction\u002Fcontrol invariants. Any transformation of model-owned gameplay fields requires its own named, policy-authorized exception and evidence. | Model calls, Firestore writes, text interpretation, primary XP\u002Flevel calculation, threshold-derived level-up decisions, or unregistered correction\u002Fnormalization\u002Fsuppression of gameplay meaning |\n| `world_logic.py` | Modal locks and consumption of model-authored finish choices; wrap payloads only where its contract permits | Inject or synthesize choices; recompute model-owned progression; call `canonicalize_level_up_signal()` directly |\n| `game_state.py` | State storage, deterministic mechanical primitives (`xp_needed_for_level`, `level_from_xp`, `coerce_int`) | Decide level-up from state, replace model choices, own level-up decisions, contain level-up dataclasses or resolvers |\n| `agents.py` | Route to correct agent using `rewards_engine.is_level_up_active()` | Inline flag interpretation, XP extraction, stale-flag recovery logic |\n| `llm_parser.py` | Parse model output, call the pipeline **once** via `canonicalize_rewards()`, persist\u002Fdeliver | Duplicate rewards formatting, inline false-positive mutations, call canonicalization separately |\n| `narrative_response_schema.py` | Preserve model output losslessly and validate structural\u002Fschema requirements without deciding gameplay meaning | Class feature synthesis, state mutation, building UI payloads, or rejecting a turn because model-authored progression fields appear contradictory |\n| `llm_service.py` | LLM request\u002Fresponse pipeline, retry on `SchemaRejectionError` | Rewards formatting, level-up flag interpretation, modal state mutation |\n| `structured_fields_utils.py` | Extract non-empty structured fields | Semantic validation, alias normalization, UI formatting |\n| `prompts\u002Flevel_up_instruction.md` | Class-AGNOSTIC contracts only — generic enumeration (\"enumerate ALL subclass options as separate clickable choices\"), generic announce-all-gains rules. The model owns the D&D 5e SRD. | Hardcode subclass names (oaths\u002Fcircles\u002Fpatrons\u002Farchetypes\u002Fdomains), feature names (Divine Health, Channel Divinity, Second Wind…), spell names, or per-class numeric gains as named rules\u002FHARD INVARIANTs. Class names allowed ONLY inside `e.g.`\u002F`for example` illustrations. |\n\n---\n\n## Authorized Public API Surface\n\nThese are the **only** `rewards_engine` functions that external files may call:\n\n| Function | Callers | Purpose |\n|----------|---------|---------|\n| `canonicalize_rewards(structured_fields, game_state, original_state)` | `llm_parser.py` (1 call), `world_logic.py` (polling paths) | Single convergence point for all rewards\u002Flevel-up UI |\n| `is_level_up_active(game_state)` | `agents.py`, `world_logic.py` | Read explicit progression signals and server-owned modal control; any domain transformation follows the Correction Exception Boundary |\n| `project_level_up_ui(game_state, original_state)` | `world_logic.py` (via `_project_level_up_ui_locally()`) | Polling\u002Fprojection path (transitional — delete when callers migrate) |\n| `sync_level_up_signals(game_state, original_state)` | `world_logic.py` (via `ensure_level_up_rewards_pending()` shim) | Idempotent rewards_pending sync |\n| `format_model_level_up_signal(signal)` | `llm_parser.py` (fallback path) | Explicit signal formatter (should become private `_format_...`) |\n\n**All other functions are private implementation details.** Do not call `_canonicalize_core()`, `_enforce_atomicity()`, `_apply_contradiction_guard()`, `resolve_level_up_signal()`, or `ensure_rewards_box()` from outside `rewards_engine.py`.\n\n---\n\n## API Contract Freeze\n\n- `canonicalize_rewards()` returns `(rewards_box, planning_block)` — a **2-tuple**. **Do NOT change this return signature.** Use `out_meta` dict parameter to pass additional data out (e.g., canonical signal, false-positive flags).\n- `canonicalize_level_up_signal()` is called **inside** `rewards_engine.py` only. External files consume precomputed results.\n- `is_level_up_active()` returns `bool`. It reads explicit progression signals and server-owned modal control. This API shape does not authorize contradiction suppression or XP-threshold decisions; any transformation of a model-owned field requires the named active-policy exception and evidence in the Correction Exception Boundary.\n- `ensure_rewards_box()` returns `tuple[dict | None, dict | None]` (rewards_box, signal_metadata). Internal only.\n\n---\n\n## Common Boundary Violations\n\nThese are the most frequently observed agent drift patterns. If you catch yourself doing any of these, STOP:\n\n| If you're about to... | WRONG file | RIGHT approach |\n|----------------------|------------|----------------|\n| Call `canonicalize_level_up_signal()` | `world_logic.py`, `llm_parser.py` | Only inside `rewards_engine.py` (via `_canonicalize_core`) |\n| Build a `level_up_signal` dict | `world_logic.py` | Build in `rewards_engine.py`, pass via return or `out_meta` |\n| Compute XP progress, thresholds, target level, or level-up availability as the primary path | any backend file | Ask the LLM for explicit calculated fields; preserve them unless the exact transformation satisfies the Correction Exception Boundary |\n| Check `level_up_pending` \u002F `level_up_in_progress` flags directly | `world_logic.py`, `agents.py` | Call `rewards_engine.is_level_up_active()` |\n| Call `resolve_level_progression()` | anywhere | **Deleted.** Use `rewards_engine.is_level_up_active()` or `rewards_engine.project_level_up_ui()` |\n| Use `build_level_up_rewards_box()` | anywhere | **Deleted.** Use `rewards_engine.ensure_rewards_box()` (internal) or `project_level_up_ui()` |\n| Change `canonicalize_rewards()` return type | anywhere | **Don't.** Use `out_meta` dict instead |\n| Add signal normalization aliases | `structured_fields_utils.py` | First establish the exact active-policy exception and evidence under the Correction Exception Boundary; this table alone grants no normalization authority |\n| Classify or scrub choices by ID text\u002Fprefix, label, enum name, or CSS class | any backend file | Resolve the submitted handle against persisted `planning_block.choices`, then read explicit structured fields; keep `level_up_now`, `finish_level_up_return_to_game`, and `custom_action` exact checks migration-only |\n| Add a new feature to a level-up PR | the same PR | Open a separate PR — scope creep is the #1 cause of spin |\n| Access `rewards_engine._is_state_flag_true()` from outside | `agents.py`, `world_logic.py` | Use the public helpers or import from `game_state.py` |\n\n---\n\n## Pre-Flight Checklist\n\nRun this **before writing any code** for a PR that touches level-up, rewards, XP, or canonicalization logic.\n\n### 1. File boundary check\nFor each file you plan to modify, check the table above:\n- [ ] Is the change in the \"OWNS\" column? → Proceed\n- [ ] Is it in the \"MUST NOT DO\" column? → **STOP. Redesign.**\n\n### 2. API contract check\n- [ ] Am I changing the return signature of `canonicalize_rewards()`? → **Don't.** Use `out_meta`.\n- [ ] Am I calling `rewards_engine.*` from `world_logic.py` outside the authorized API surface table? → Check boundary table.\n- [ ] Am I directly reading `level_up_pending` \u002F `level_up_in_progress` flags instead of calling `is_level_up_active()`? → Use the centralized function.\n- [ ] Am I adding or expanding a choice-ID allowlist, prefix check, or text\u002Flabel check for level-up behavior? → **STOP.** First prove the selected choice is resolved from persisted structured state and that the model\u002Fschema exposes the needed semantic field. Exact legacy handles (`level_up_now`, `finish_level_up_return_to_game`, `custom_action`) require a migration note and must not become the pattern for new behavior.\n\n### 3. Deleted function check\n- [ ] Am I calling any of these **deleted** functions? → **They no longer exist:**\n  - `game_state.resolve_level_progression_state()`\n  - `game_state.resolve_level_progression()`\n  - `game_state.ensure_level_up_rewards_pending()`\n  - `game_state.LevelProgressionState`\n  - `game_state.PendingRewardsState`\n  - `world_logic.build_level_up_rewards_box()`\n  - `agents._is_stale_level_up_pending()`\n\n### 4. Scope check\n- [ ] Does a task spec exist in `~\u002Froadmap\u002Fzfc-pr-task-specs-2026-04-22.md`?\n- [ ] If yes, is every file I'm touching in the \"Likely files\" list?\n- [ ] Am I adding unrelated features to this PR? → Open a separate PR.\n\n### 5. PR hygiene check\n- [ ] Does an open PR already cover this scope? → Fix that PR instead of creating a new one (see `${CLAUDE_HOME:-$HOME\u002F.claude}\u002Fskills\u002Fpr-quantity-control\u002FSKILL.md`).\n\n---\n\n## Decision Flowchart\n\n```\nIs my change about level-up\u002FXP\u002Frewards logic?\n├── YES → Model-owned gameplay meaning belongs in the prompt\u002Fschema\n│   ├── Server execution or transport? Follow the ownership table and active contract\n│   ├── Does world_logic.py need the result?\n│   │   └── Pass via return value or out_meta dict\n│   ├── Does agents.py need to know if level-up is active?\n│   │   └── Call rewards_engine.is_level_up_active() — never inline flag checks\n│   └── Does llm_parser.py need the result?\n│       └── Call canonicalize_rewards() once; don't call internal functions directly\n├── Is my change about model output?\n│   └── Diagnose the prompt\u002Fschema at the root cause first\n│       └── Preserve valid player turns; no contradiction-repair retry is authorized here\n└── NO → Normal file protocol applies\n```\n\n---\n\n## Historical Milestone Snapshot\n\nThe statuses and implementation notes below are a snapshot from [source commit `04afb7f1b93af731240f1298a1234237e4e608da`](https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fcommit\u002F04afb7f1b93af731240f1298a1234237e4e608da), dated 2026-05-13. They do not establish current project status or grant permission to add a transformation; verify current source and owner instructions before acting. In particular, the “fail-closed” semantic SSE wording describes that historical implementation report and does not authorize rejecting player turns.\n\n| Milestone | Status | Description |\n|-----------|--------|-------------|\n| M0 | ✅ Complete | Delete legacy paths, net LOC ≤ 0 |\n| M1 | ✅ Complete | Model compliance probe — prompt contract + streaming evidence |\n| M1b | ✅ Complete | Repeated-run reliability harness (Wilson score intervals) |\n| M2 | ? Near Complete | Legacy resolver deletion done; formatter narrowing partially done |\n| M3 | ? Partially Started | Snapshot reported CI grep gates active via `design-doc-gate.yml` (8 gates reported enforced) |\n\n### M2 Work Reported Complete at Snapshot (via product-repository PR #6641)\n- ✅ `game_state.py` — all legacy resolvers and dataclasses deleted (422 LOC)\n- ✅ `world_logic.py` — `build_level_up_rewards_box()` deleted, all `resolve_level_progression()` calls removed\n- ✅ `agents.py` — `_is_stale_level_up_pending()` deleted, all routing uses `is_level_up_active()`\n- ✅ `rewards_engine.sync_level_up_signals()` replaces 200-line `ensure_level_up_rewards_pending()`\n- At the snapshot, `_enforce_atomicity()` was reported rewritten for semantic SSE validation (fail-closed); this is a historical implementation note, not current permission to reject turns.\n- ✅ Canonical XP field names enforced: `current_turn_exp`, `total_exp_for_next_level`\n- ✅ `ensure_rewards_box()` returns `tuple[dict|None, dict|None]`, field `resolved_target_level` → `new_level`\n\n### M2 Remaining Work as Reported at Snapshot\nThe snapshot listed these follow-ups; verify current callers and ownership before using them as a plan:\n- `format_model_level_up_signal()` → make private (`_format_model_level_up_signal`)\n- `project_level_up_ui()` → delete when no remaining callers (reported then as used by `_project_level_up_ui_locally()`)\n\n### M3 Snapshot — CI Enforcement Gates (Reported Active)\nAt the snapshot, `design-doc-gate.yml` was reported to enforce 8 grep-based boundary checks. Verify the workflow and its current scope before relying on this historical status.\n\n| Gate | Rule | Status at snapshot |\n|------|------|--------|\n| `world_logic 0 rewards_engine public API imports` | No direct `from rewards_engine import` in world_logic | Reported enforced at snapshot |\n| `world_logic 0 resolve_level_up_signal calls` | No direct resolver calls | Reported enforced at snapshot |\n| `constants get_xp_for_level` | No duplicate XP helpers in constants | Reported enforced at snapshot |\n| `constants get_level_from_xp` | No duplicate level helpers in constants | Reported enforced at snapshot |\n| `_is_state_flag_true 2 files` | Helper exists in exactly 2 files | Reported enforced at snapshot |\n| `world_logic ≤1 project_level_up_ui` | At most 1 non-wrapper call | Reported enforced at snapshot |\n| `non-rewards 0 direct level-up pair builders` | No external pair builders | Reported enforced at snapshot |\n| `llm_parser canonicalize_rewards=1` | Exactly 1 canonicalize call | Reported enforced at snapshot |\n\n### M3 Remaining Work as Reported at Snapshot\nThe snapshot listed these planned checks; verify current code and workflow ownership before implementing them:\n- Centralization ratchet: no new `def` in `world_logic.py` whose name exists in `rewards_engine.py`\n- Architecture test: `level_up_signal` formatting stays in `rewards_engine.py`\n\n---\n\n## Field Ownership Quick Reference\n\n**Every shared dict field must have exactly ONE authoritative writer.**\n\n| Dict \u002F Field | Writer | Semantic |\n|--------------|--------|----------|\n| `level_up_signal.current_level` | LLM | Int: level before applying the level-up |\n| `level_up_signal.target_level` | LLM | Int: target level now available; `target_level > current_level` is the model-owned level-up signal |\n| `rewards_pending.level_up_available` | Backend-derived compatibility\u002Fdisplay field from accepted `level_up_signal` | Bool: deterministic UI alias; do not ask the model to emit it |\n| `rewards_pending.xp_gained` | LLM via state_updates; any transitional transformation requires the named active-policy exception and evidence | Int: model-calculated XP delta for rewards box |\n| `rewards_pending.new_level` | Backend-derived compatibility\u002Fdisplay field from `level_up_signal.target_level` | Int: deterministic UI alias; do not ask the model to emit it |\n| `player_character_data.experience.current` | Active repository field-specific contract | Int: cumulative accepted XP; writer and projection are owned by the current prompt\u002Fschema and ZFC contract |\n| `custom_campaign_state.level_up_in_progress` | Server-owned modal\u002Fsession control state | Bool: level-up modal active; model must not write this on story\u002Frewards turns |\n| `custom_campaign_state.level_up_pending` | Backend-derived compatibility\u002Fcontrol field from accepted level-up signal or modal state | Bool: modal routing compatibility; model must not write this on story\u002Frewards turns |\n| `custom_campaign_state.level_up_complete` | Server-owned level-up flow state | Bool: level-up flow finished (suppresses `is_level_up_active()`) |\n| `custom_campaign_state.level_up_cancelled` | Server-owned level-up flow state | Bool: level-up deferred (suppresses `is_level_up_active()`) |\n\nFor the full field registry, see the `field-ownership-contracts` skill.\n\n---\n\n## Key Architectural Invariants (Post-M2)\n\n1. **Model-owned progression; server-owned modal control**: `is_level_up_active()` may read explicit model-authored progression fields and server-owned modal\u002Fsession fields, but it must not adjudicate progression from XP thresholds or other game mechanics. Suppressing `level_up_pending=True` because a model-owned signal is “mechanically impossible” is a gameplay decision and is not authorized here. A correction to a model-owned field requires an exact active-policy exception, named field\u002Ffunction, concrete necessity, and that policy's evidence. Server-owned completion\u002Fcancellation state may control modal activity without rewriting the model's progression decision.\n\n2. **Streaming preservation**: Preserve supplied stream fields and their representation aliases. Missing one field is not a reason to drop the other or reject the turn. Stream\u002Fpayload atomicity enforcement may protect complete transport representations or server-owned transaction invariants; it must not validate gameplay semantics or discard a valid player turn over metadata\u002Frepresentation mismatch. Reject only when committing would corrupt server-owned storage.\n\n3. **Completion\u002Fcancellation precedence**: `level_up_complete=True` or `level_up_cancelled=True` always returns `False` from `is_level_up_active()`, regardless of other flags.\n\n4. **Progression limits**: Follow the active campaign progression contract; do not add a hardcoded cap or threshold-based fallback to this helper.\n\n5. **Single delegation**: `world_logic._project_level_up_ui_locally()` is a 1-line call to `rewards_engine.project_level_up_ui()`. No independent computation.\n\n---\n\n## Canonical References\nFor any WorldArchitect backend or progression change, read the local overlay `.claude\u002Fskills\u002Fworldai-zfc\u002FSKILL.md` together with the `zero-framework-cognition` skill, the `backend-justified` skill, and the `root-cause-first` skill. Prompt\u002Fschema correction comes before backend protection. Preserve model-owned gameplay meaning and unknown fields; server-owned storage, authorization, transport, concurrency, and modal\u002Fsession control remain server responsibilities. Any domain-field transformation must identify its exact active-policy exception, field and function, concrete necessity, and required evidence; where that policy requires registration, register it. This guide does not authorize finish-choice injection, paired payload dropping, gameplay defaults, clamps, semantic suppression, or rejection of a valid turn.\n\n## Related Skills\n\n- the `field-ownership-contracts` skill — full field writer\u002Freader registry\n- the `evidence-standards` skill — evidence requirements for production PRs\n- the `pr-green-definition` skill — canonical `\u002Fgreen` (CI green + no merge conflicts) definition; quality gates live in the draft phase\n",{"name":5,"scope":51,"description":7},"your-project.com\u002Fmvp_site","main","8144f00ebafc4306264c63239e4b9fa42e48a90e","plugins\u002Fworldarchitect\u002Fskills\u002Fzfc-leveling-roadmap",0,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills","https:\u002F\u002Fgithub.com\u002Fjleechanorg","2026-11-11 22:19:36",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add jleechanorg\u002Fjleechan-skills --skill zfc-leveling-roadmap",{"tool":65,"command":66},"bunx","bunx skills add jleechanorg\u002Fjleechan-skills --skill zfc-leveling-roadmap",{"tool":68,"command":69},"pnpm","pnpm dlx skills add jleechanorg\u002Fjleechan-skills --skill zfc-leveling-roadmap","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fworldarchitect\u002Fskills\u002Fzfc-leveling-roadmap\u002FSKILL.md",true,[],[74,91,111,125,139,155],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":46},"01M716Y5MTJ6GYJZ2ATXCJK8G4","instinct","Use when the user invokes \u002Finstinct or \u002Fin, or asks to \"message Instinct\", \"ask Instinct\", \"tell Instinct\", \"check Instinct\", or read replies from the configured peer assistant. iMessage first, WhatsApp Web as fallback.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finstinct\u002FSKILL.md",[],[76,81,82,83,84,85,86,87,88,40,89,90],"user","when","replies","check","use","identity","whatsapp","gmail","message","ask",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":100,"publishedAt":46},"01M716Y4HF7FVVMJSA2CCVN5VF","hr","Compatibility alias for history-resume; produce the same fresh-state, provenance-aware resume briefing.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhr\u002FSKILL.md",[97],{"categoryNo":98,"categoryName":99,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000038","人力资源",[93,101,102,103,104,105,106,107,108,109,110],"resume","compatibility","provenance","for","history","produce","alias","briefing","state","fresh",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":118,"publishedAt":46},"01M716Y1FFNFKFJYYKF8HQA6T8","history-resume","Resume briefing for the current repository branch or worktree using fresh state and admitted history sources.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhistory-resume\u002FSKILL.md",[117],{"categoryNo":98,"categoryName":99,"taxonomyType":20,"taxonomyTypeDesc":21},[105,101,119,120,81,121,108,122,104,123,124,109,110],"history resume","branch","analysis","repository","worktree","sources",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":46},"01M716XWXJ8EPHK4RH9T14TR85","grok","Alias for the canonical grokbot browser conversation workflow; \u002Fgrok talks to the Grok bot the same way \u002Fdot talks to Dot.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgrok\u002FSKILL.md",[],[127,132,133,134,104,135,107,136,137,138],"dot","bot","workflow","canonical","conversation","browser","grokbot",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":46},"01M70N9Q07DTE0EW5KFXMMMSJ0","codexa-bench","Compare `codexa` and normal `codex` on a fair split of comparable work by default; use `--strict` for duplicate runs of the exact same task.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcodexa-bench\u002FSKILL.md",[],[146,147,148,85,149,104,150,151,152,153,154],"codexa bench","work","split","default","duplicate","task","compare","normal","codex",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":159,"licenseFileUrl":160,"sourceHtmlUrl":161,"categories":162,"keywords":174,"publishedAt":46},"01M6C24S2X60SP8BBFGAEKPEGW","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[163,168,171],{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":172,"categoryName":173,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000032","设计师",[175,176,177,85,178,179,180,81,181,182,43,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,82,198],"frontend","design","frontend design","generic","ui design","react","html","components","artifacts","ui","aesthetics","Production","web components","landing","applications","quality","web","css","create","examples","with","react components","web ui","pages"]