网文/小说写作 skill 包,覆盖长篇与短篇网络小说的扫榜、拆文、写作、去AI味、封面图全流程 | An all-in-one skill pack for long- and short-form web fiction.
This report presents the forensic synthetic code analysis of worldwonderer/oh-story-claudecode, a JavaScript project with 6,188 GitHub stars. SynthScan v2.0 examined 133,203 lines of code across 571 source files, recording 411 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 4.0 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 411 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/sync-shared-assets.py | 174 | def unmanaged_duplicate_scripts(root: Path, groups: list[Group]) -> list[tuple[str, list[Path]]]: | CODE |
| LOW | scripts/test-scan-runtime-policy.py | 52 | def mutate_filename_with_dead_local_date(fixture: Path) -> None: | CODE |
| LOW | scripts/test-scan-runtime-policy.py | 63 | def mutate_http_get_with_dead_safe_call(fixture: Path) -> None: | CODE |
| LOW | scripts/skill-numbering.py | 356 | def containing_workflow_parent(document: Document, line_index: int) -> int | None: | CODE |
| LOW | scripts/skill-numbering.py | 650 | def unparsable_step_heading_issues(document: Document) -> list[Issue]: | CODE |
| LOW | scripts/test-scan-runtime.js | 321 | function testWindowsInvocationBuilder(modulePath) { | CODE |
| LOW | scripts/test-scan-runtime.js | 477 | function testJjwxcDetailFailureIsolation() { | CODE |
| LOW | scripts/test-scan-runtime.js | 556 | function testQidianFieldContractAndDescriptionLimit() { | CODE |
| LOW | scripts/test-scan-runtime.js | 721 | function testQimaoPartialTargetStatus() { | CODE |
| LOW | scripts/test-scan-runtime.js | 737 | function testLongScanArgumentValidation() { | CODE |
| LOW | scripts/test-scan-runtime.js | 761 | function testHeiyanFieldDriftAndWordFormat() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1215 | function testCdpResetRefusesStaleEndpoint() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1254 | function testCdpResetRefusesUnhealthyTcpHolder() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1271 | function testCdpResetSucceedsWhenPortActuallyFrees() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1291 | function testCdpPlainReuseUnchanged() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1309 | function testCdpRejectsEndpointNotFromThisLaunch() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1332 | function testCdpRejectsForeignHolderWhileLauncherAlive() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1369 | function testCdpRejectsPortHeldOutsideSpawnedTree() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1395 | function testCdpAcceptsPortHeldByLaunchedChildProcess() { | CODE |
| LOW | scripts/test-scan-runtime.js | 1414 | function testCdpRejectsUnverifiableIdentity() { | CODE |
| LOW | scripts/check-current-skill-contracts.py | 531 | def undecodable_source_findings(roots: Sequence[Path]) -> List[Finding]: | CODE |
| LOW | scripts/check-current-skill-contracts.py | 630 | def semantic_primary_fallback_findings( | CODE |
| LOW | scripts/check-current-skill-contracts.py | 808 | def parse_frontmatter_version(path: Path) -> Optional[str]: | CODE |
| LOW | scripts/check-current-skill-contracts.py | 824 | def extract_current_version_fields(text: str) -> dict[str, str]: | CODE |
| LOW | scripts/check-current-skill-contracts.py | 852 | def upgrading_version_findings( | CODE |
| LOW | scripts/check-current-skill-contracts.py | 948 | def sentinel_contract_findings( | CODE |
| LOW | scripts/check-current-skill-contracts.py | 1009 | def extract_outline_rule_fields(text: str) -> set[str]: | CODE |
| LOW | scripts/check-current-skill-contracts.py | 1034 | def outline_rule_contract_findings( | CODE |
| LOW | scripts/check-current-skill-contracts.py | 1051 | def extract_demo_outline_fields(text: str) -> set[str]: | CODE |
| LOW | scripts/check-current-skill-contracts.py | 1068 | def progress_schema_pin_findings(repo_root: Path, expected: int) -> List[Finding]: | CODE |
| LOW | scripts/test-storyctl.py | 41 | def test_frozen_unicode_counting_contract(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 70 | def test_frontmatter_and_first_heading_are_not_body(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 76 | def test_bands_and_status_boundaries(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 115 | def test_outline_target_rejections_remain_unchanged(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 129 | def test_checkpoint_reports_only_current_count_and_remaining_user_range(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 138 | def test_commit_record_has_no_event_or_approval_chain(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 161 | def test_chapter_check_cli_reads_bom_crlf_outline_target(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 206 | def test_wordcount_measure_returns_actual_without_a_target(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 220 | def test_wordcount_check_returns_structured_result(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 247 | def test_wordcount_checkpoint_is_a_pure_measurement(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 258 | def test_cli_errors_are_json_and_nonzero(self) -> None: | CODE |
| LOW | scripts/test-storyctl.py | 268 | def test_demo_outlines_and_bodies_use_the_same_metric(self) -> None: | CODE |
| LOW⚡ | scripts/test-tracking-commit.py | 445 | def test_imported_cutoff_requires_only_new_daily_records(self) -> None: | CODE |
| LOW⚡ | scripts/test-tracking-commit.py | 455 | def test_imported_chapter_revision_creates_an_overlay_record(self) -> None: | CODE |
| LOW⚡ | scripts/test-tracking-commit.py | 462 | def test_check_compares_derived_views_to_state_without_parsing_markdown(self) -> None: | CODE |
| LOW⚡ | scripts/test-tracking-commit.py | 523 | def test_commit_and_check_still_refuse_a_retired_layout(self) -> None: | CODE |
| LOW⚡ | scripts/test-tracking-commit.py | 531 | def test_dropping_a_context_item_without_declaring_it_is_rejected(self) -> None: | CODE |
| LOW⚡ | scripts/test-tracking-commit.py | 540 | def test_declared_context_retirement_is_recorded_in_the_chapter_delta(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 224 | def test_init_creates_one_structured_authority_and_only_derived_views(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 242 | def test_commit_updates_state_and_all_demo_derived_views(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 260 | def test_simple_wordcount_record_commits_the_exact_current_body(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 280 | def test_body_or_target_change_rejects_a_prepared_record_without_writes(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 300 | def test_two_concurrent_different_commits_advance_only_one_revision(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 329 | def test_character_snapshot_lists_are_not_limited_to_eight_items(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 340 | def test_snapshot_target_warns_and_hard_cap_rejects_before_any_write(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 356 | def test_missing_active_snapshot_is_rejected_before_any_write(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 368 | def test_partial_view_write_keeps_old_authority_and_same_transaction_can_retry(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 393 | def test_stale_revision_cannot_overwrite_newer_state(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 406 | def test_old_revision_preserves_current_next_chapter_commitment(self) -> None: | CODE |
| LOW | scripts/test-tracking-commit.py | 417 | def test_old_revision_applies_current_rows_without_moving_update_chapter_back(self) -> None: | CODE |
| 121 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/story-long-write/scripts/author_memory_commit.py | 0 | maintain evidence-backed author preferences and deterministic markdown views. the language model supplies compact semant | STRING |
| HIGH | skills/story-deslop/scripts/author_memory_commit.py | 0 | maintain evidence-backed author preferences and deterministic markdown views. the language model supplies compact semant | STRING |
| HIGH | skills/story-review/scripts/author_memory_commit.py | 0 | maintain evidence-backed author preferences and deterministic markdown views. the language model supplies compact semant | STRING |
| HIGH | …ills/story-short-write/scripts/author_memory_commit.py | 0 | maintain evidence-backed author preferences and deterministic markdown views. the language model supplies compact semant | STRING |
| HIGH | skills/story/scripts/author_memory_commit.py | 0 | maintain evidence-backed author preferences and deterministic markdown views. the language model supplies compact semant | STRING |
| HIGH | skills/story-long-write/scripts/tracking_commit.py | 0 | maintain one structured story state and its deterministic markdown views. the language model supplies compact semantic j | STRING |
| HIGH | skills/story-review/scripts/tracking_commit.py | 0 | maintain one structured story state and its deterministic markdown views. the language model supplies compact semantic j | STRING |
| HIGH | skills/story-import/scripts/tracking_commit.py | 0 | maintain one structured story state and its deterministic markdown views. the language model supplies compact semantic j | STRING |
| HIGH | skills/story-long-write/scripts/tracking_commit.py | 0 | write utf-8 bytes directly. windows 的文本 stdout 是 cp1252(含中文即 unicodeencodeerror),stderr 默认 backslashreplace(中文被转义成反斜杠码位, | STRING |
| HIGH | skills/story-review/scripts/tracking_commit.py | 0 | write utf-8 bytes directly. windows 的文本 stdout 是 cp1252(含中文即 unicodeencodeerror),stderr 默认 backslashreplace(中文被转义成反斜杠码位, | STRING |
| HIGH | skills/story-import/scripts/tracking_commit.py | 0 | write utf-8 bytes directly. windows 的文本 stdout 是 cp1252(含中文即 unicodeencodeerror),stderr 默认 backslashreplace(中文被转义成反斜杠码位, | STRING |
| HIGH | skills/story-long-write/scripts/tracking_commit.py | 0 | move a pre-transaction 追踪/ aside so init can build the current protocol in place. nothing is parsed or converted: the ol | STRING |
| HIGH | skills/story-review/scripts/tracking_commit.py | 0 | move a pre-transaction 追踪/ aside so init can build the current protocol in place. nothing is parsed or converted: the ol | STRING |
| HIGH | skills/story-import/scripts/tracking_commit.py | 0 | move a pre-transaction 追踪/ aside so init can build the current protocol in place. nothing is parsed or converted: the ol | STRING |
| HIGH | skills/story-long-write/scripts/wordcount_core.py | 0 | small deterministic wordcount core shared by storyctl and tracking. | STRING |
| HIGH | skills/story-review/scripts/wordcount_core.py | 0 | small deterministic wordcount core shared by storyctl and tracking. | STRING |
| HIGH | skills/story-import/scripts/wordcount_core.py | 0 | small deterministic wordcount core shared by storyctl and tracking. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/test-skill-numbering.sh | 63 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 71 | ### Step 2: former second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 73 | #### Step 4: nested first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 77 | #### Step 8: nested second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 87 | ### Step 7: beta first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 89 | ### Step 9: beta second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 129 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 133 | ### Step 2: inserted | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 137 | ### Step 3: former second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 139 | #### Step 1: nested first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 143 | #### Step 2: nested second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 153 | ### Step 1: beta first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 155 | ### Step 2: beta second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 180 | ### Step 1: only step | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 189 | ### Step 9: should become one | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 210 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 216 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 253 | ### Step 1: alpha only | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 257 | ### Step 1: beta first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 274 | ### Step 8: alpha | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 281 | ### Step 9: beta | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 375 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 382 | ### Step 2: former second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 108 | assert_contains "$WORK/dry-run.out" "+### Step 2: inserted" | CODE |
| LOW⚡ | scripts/test-skill-numbering.sh | 109 | assert_contains "$WORK/dry-run.out" "+### Step 3: former second" | CODE |
| LOW⚡ | …ory-long-analyze/references/style-profile-generator.md | 9 | ### Step 1: 读拆文报告核心字段 | COMMENT |
| LOW⚡ | …ory-long-analyze/references/style-profile-generator.md | 19 | ### Step 2: 读黄金三章深度拆解 | COMMENT |
| LOW⚡ | …ory-long-analyze/references/style-profile-generator.md | 28 | ### Step 3: 提取章节基调/主题标签序列 | COMMENT |
| LOW | …ory-long-analyze/references/style-profile-generator.md | 49 | ### Step 4: 原文采样 | COMMENT |
| LOW | …ory-long-analyze/references/style-profile-generator.md | 96 | ### Step 5: 选原文锚点片段 (4-6 段) | COMMENT |
| LOW | …ory-long-analyze/references/style-profile-generator.md | 113 | ### Step 6: 落盘 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/sync-shared-assets.py | 174 | CODE | |
| LOW | scripts/sync-shared-assets.py | 204 | CODE | |
| LOW | scripts/shared-references.py | 74 | CODE | |
| LOW | scripts/shared-references.py | 253 | CODE | |
| LOW | scripts/skill-numbering.py | 261 | CODE | |
| LOW | scripts/skill-numbering.py | 373 | CODE | |
| LOW | scripts/skill-numbering.py | 537 | CODE | |
| LOW | scripts/skill-numbering.py | 826 | CODE | |
| LOW | scripts/check-current-skill-contracts.py | 321 | CODE | |
| LOW | scripts/check-current-skill-contracts.py | 565 | CODE | |
| LOW | scripts/check-current-skill-contracts.py | 741 | CODE | |
| LOW | scripts/check-current-skill-contracts.py | 1068 | CODE | |
| LOW | scripts/check-current-skill-contracts.py | 1107 | CODE | |
| LOW | scripts/sync-opencode.py | 46 | CODE | |
| LOW | scripts/sync-opencode.py | 168 | CODE | |
| LOW | scripts/sync-opencode.py | 331 | CODE | |
| LOW | scripts/static-check.py | 200 | CODE | |
| LOW | scripts/static-check.py | 300 | CODE | |
| LOW | scripts/static-check.py | 381 | CODE | |
| LOW | scripts/static-check.py | 439 | CODE | |
| LOW | scripts/generate-codex-agents.py | 31 | CODE | |
| LOW | scripts/generate-codex-agents.py | 128 | CODE | |
| LOW | skills/story-long-write/scripts/author_memory_commit.py | 339 | CODE | |
| LOW | skills/story-long-write/scripts/author_memory_commit.py | 451 | CODE | |
| LOW | skills/story-long-write/scripts/author_memory_commit.py | 547 | CODE | |
| LOW | skills/story-long-write/scripts/author_memory_commit.py | 850 | CODE | |
| LOW | skills/story-deslop/scripts/author_memory_commit.py | 339 | CODE | |
| LOW | skills/story-deslop/scripts/author_memory_commit.py | 451 | CODE | |
| LOW | skills/story-deslop/scripts/author_memory_commit.py | 547 | CODE | |
| LOW | skills/story-deslop/scripts/author_memory_commit.py | 850 | CODE | |
| LOW | skills/story-review/scripts/author_memory_commit.py | 339 | CODE | |
| LOW | skills/story-review/scripts/author_memory_commit.py | 451 | CODE | |
| LOW | skills/story-review/scripts/author_memory_commit.py | 547 | CODE | |
| LOW | skills/story-review/scripts/author_memory_commit.py | 850 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 329 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 823 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 887 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1191 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1311 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1426 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1529 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1334 | CODE | |
| LOW | skills/story-setup/scripts/deploy-antigravity-skills.py | 57 | CODE | |
| LOW | …ills/story-short-write/scripts/author_memory_commit.py | 339 | CODE | |
| LOW | …ills/story-short-write/scripts/author_memory_commit.py | 451 | CODE | |
| LOW | …ills/story-short-write/scripts/author_memory_commit.py | 547 | CODE | |
| LOW | …ills/story-short-write/scripts/author_memory_commit.py | 850 | CODE | |
| LOW | skills/story/scripts/author_memory_commit.py | 339 | CODE | |
| LOW | skills/story/scripts/author_memory_commit.py | 451 | CODE | |
| LOW | skills/story/scripts/author_memory_commit.py | 547 | CODE | |
| LOW | skills/story/scripts/author_memory_commit.py | 850 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/test-antigravity-hook-merge.py | 4 | CODE | |
| LOW | scripts/sync-shared-assets.py | 8 | CODE | |
| LOW | scripts/shared-references.py | 4 | CODE | |
| LOW | scripts/test-scan-runtime-policy.py | 4 | CODE | |
| LOW | scripts/check-short-analysis-scope.py | 4 | CODE | |
| LOW | scripts/skill-numbering.py | 10 | CODE | |
| LOW | scripts/generate-codex-hooks.py | 4 | CODE | |
| LOW | scripts/check-current-skill-contracts.py | 10 | CODE | |
| LOW | scripts/check-reference-similarity.py | 4 | CODE | |
| LOW | scripts/test-storyctl.py | 2 | CODE | |
| LOW | scripts/test-tracking-commit.py | 4 | CODE | |
| LOW | scripts/test-static-check.py | 4 | CODE | |
| LOW | scripts/check-agent-reference-consumers.py | 4 | CODE | |
| LOW | scripts/test-antigravity-skills-deploy.py | 4 | CODE | |
| LOW | scripts/test-author-memory-commit.py | 4 | CODE | |
| LOW | scripts/test-codex-hook-merge.py | 4 | CODE | |
| LOW | scripts/test-current-skill-contracts.py | 4 | CODE | |
| LOW | scripts/static-check.py | 4 | CODE | |
| LOW | scripts/test-chapter-completion-lifecycle.py | 4 | CODE | |
| LOW | scripts/test-shared-assets.py | 4 | CODE | |
| LOW | scripts/test-shared-references.py | 4 | CODE | |
| LOW | scripts/generate-codex-agents.py | 9 | CODE | |
| LOW | skills/story-long-write/scripts/author_memory_commit.py | 10 | CODE | |
| LOW | skills/story-long-write/scripts/tracking_commit.py | 10 | CODE | |
| LOW | skills/story-long-write/scripts/wordcount_core.py | 4 | CODE | |
| LOW | skills/story-long-write/scripts/storyctl.py | 4 | CODE | |
| LOW | skills/story-deslop/scripts/author_memory_commit.py | 10 | CODE | |
| LOW | skills/story-review/scripts/author_memory_commit.py | 10 | CODE | |
| LOW | skills/story-review/scripts/tracking_commit.py | 10 | CODE | |
| LOW | skills/story-review/scripts/wordcount_core.py | 4 | CODE | |
| LOW | skills/story-import/scripts/tracking_commit.py | 10 | CODE | |
| LOW | skills/story-import/scripts/wordcount_core.py | 4 | CODE | |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 7 | CODE | |
| LOW | skills/story-setup/scripts/copy-path-safety.py | 4 | CODE | |
| LOW | skills/story-setup/scripts/merge-codex-hooks.py | 9 | CODE | |
| LOW | skills/story-setup/scripts/merge-claude-settings.py | 9 | CODE | |
| LOW | skills/story-setup/scripts/deploy-antigravity-skills.py | 9 | CODE | |
| LOW | skills/story-setup/scripts/merge-antigravity-hooks.py | 8 | CODE | |
| LOW | …ills/story-short-write/scripts/author_memory_commit.py | 10 | CODE | |
| LOW | skills/story/scripts/author_memory_commit.py | 10 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/test-skill-numbering.sh | 63 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 71 | ### Step 2: former second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 73 | #### Step 4: nested first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 77 | #### Step 8: nested second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 87 | ### Step 7: beta first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 89 | ### Step 9: beta second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 129 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 133 | ### Step 2: inserted | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 137 | ### Step 3: former second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 139 | #### Step 1: nested first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 143 | #### Step 2: nested second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 153 | ### Step 1: beta first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 155 | ### Step 2: beta second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 180 | ### Step 1: only step | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 189 | ### Step 9: should become one | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 210 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 216 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 253 | ### Step 1: alpha only | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 257 | ### Step 1: beta first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 274 | ### Step 8: alpha | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 281 | ### Step 9: beta | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 375 | ### Step 1: first | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 382 | ### Step 2: former second | COMMENT |
| LOW⚡ | scripts/test-skill-numbering.sh | 108 | assert_contains "$WORK/dry-run.out" "+### Step 2: inserted" | CODE |
| LOW⚡ | scripts/test-skill-numbering.sh | 109 | assert_contains "$WORK/dry-run.out" "+### Step 3: former second" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-python-invocation.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/test-hook-encoding-portable.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/test-charcount-portable.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/test-prose-net-parity.sh | 1 | #!/bin/bash | COMMENT |
| LOW | skills/story-long-write/scripts/check-ai-patterns.js | 181 | COMMENT | |
| LOW | skills/story-long-write/scripts/check-ai-patterns.js | 221 | // 反序对比腔(实战漏网 C):「是真嗓子,不是修音修出来的」——not-is-comparison 的反序变种。 | COMMENT |
| LOW | skills/story-long-write/scripts/check-ai-patterns.js | 241 | // 「这一切都结束了」「新的人生才刚刚开始」「命运的齿轮」)。与 trailer-ending 共用文末窗口, | COMMENT |
| LOW | skills/story-long-write/scripts/check-ai-patterns.js | 1361 | const next = skipGap(candidate, index + 1); | COMMENT |
| LOW | skills/story-deslop/scripts/check-ai-patterns.js | 181 | COMMENT | |
| LOW | skills/story-deslop/scripts/check-ai-patterns.js | 221 | // 反序对比腔(实战漏网 C):「是真嗓子,不是修音修出来的」——not-is-comparison 的反序变种。 | COMMENT |
| LOW | skills/story-deslop/scripts/check-ai-patterns.js | 241 | // 「这一切都结束了」「新的人生才刚刚开始」「命运的齿轮」)。与 trailer-ending 共用文末窗口, | COMMENT |
| LOW | skills/story-deslop/scripts/check-ai-patterns.js | 1361 | const next = skipGap(candidate, index + 1); | COMMENT |
| LOW | skills/story-review/scripts/check-ai-patterns.js | 181 | COMMENT | |
| LOW | skills/story-review/scripts/check-ai-patterns.js | 221 | // 反序对比腔(实战漏网 C):「是真嗓子,不是修音修出来的」——not-is-comparison 的反序变种。 | COMMENT |
| LOW | skills/story-review/scripts/check-ai-patterns.js | 241 | // 「这一切都结束了」「新的人生才刚刚开始」「命运的齿轮」)。与 trailer-ending 共用文末窗口, | COMMENT |
| LOW | skills/story-review/scripts/check-ai-patterns.js | 1361 | const next = skipGap(candidate, index + 1); | COMMENT |
| LOW | skills/browser-cdp/scripts/setup-cdp-chrome.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | skills/browser-cdp/scripts/setup-cdp-chrome.js | 21 | // 就是本次启动的实例」——身份取得到且与重建前不同、spawn 出的进程还活着、端口的 LISTEN | COMMENT |
| LOW | …/story-setup/references/zcode/hooks/story_hook_core.js | 1101 | // 只查角色卡:整棵 设定/ 一刀切会让每次碰设定的提交都刷一屏假警告,把同框的 | COMMENT |
| LOW | …ory-setup/references/templates/hooks/story_hook_cli.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | …ferences/templates/hooks/guard-outline-before-prose.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …ferences/templates/hooks/guard-outline-before-prose.sh | 21 | # 处理、与 bash 区域无关;拦截判定全在下方 bash,不受影响。 | COMMENT |
| LOW | …ry-setup/references/templates/hooks/story_hook_core.js | 1101 | // 只查角色卡:整棵 设定/ 一刀切会让每次碰设定的提交都刷一屏假警告,把同框的 | COMMENT |
| LOW | …up/references/templates/hooks/validate-story-commit.sh | 61 | # 冒号/空白都用交替而不是把全角字符塞进方括号字符组:含全角字符的字符组在 C 区域会被 | COMMENT |
| LOW | …/references/templates/hooks/check-prose-after-write.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …-setup/references/antigravity/hooks/story_hook_core.js | 1101 | // 只查角色卡:整棵 设定/ 一刀切会让每次碰设定的提交都刷一屏假警告,把同框的 | COMMENT |
| LOW | …lls/story-setup/references/opencode/story_hook_core.js | 1101 | // 只查角色卡:整棵 设定/ 一刀切会让每次碰设定的提交都刷一屏假警告,把同框的 | COMMENT |
| LOW | skills/story-setup/references/opencode/pre-commit.sh | 1 | #!/bin/sh | COMMENT |
| LOW | skills/story-short-write/scripts/check-ai-patterns.js | 181 | COMMENT | |
| LOW | skills/story-short-write/scripts/check-ai-patterns.js | 221 | // 反序对比腔(实战漏网 C):「是真嗓子,不是修音修出来的」——not-is-comparison 的反序变种。 | COMMENT |
| LOW | skills/story-short-write/scripts/check-ai-patterns.js | 241 | // 「这一切都结束了」「新的人生才刚刚开始」「命运的齿轮」)。与 trailer-ending 共用文末窗口, | COMMENT |
| LOW | skills/story-short-write/scripts/check-ai-patterns.js | 1361 | const next = skipGap(candidate, index + 1); | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/test-ai-patterns.sh | 1007 | # ============================================================ | COMMENT |
| MEDIUM | scripts/test-ai-patterns.sh | 1010 | # ============================================================ | COMMENT |
| MEDIUM | scripts/test-prose-net-parity.sh | 257 | # ── B. 命令函数 parity(codex python vs zcode JS),CI 硬保证 ───────────────── | COMMENT |
| MEDIUM | scripts/test-prose-net-parity.sh | 461 | # ── C. 未归核面 parity(codex python vs JS core),CI 硬保证 ───────────────────── | COMMENT |
| MEDIUM | scripts/check-hook-regex-sync.sh | 158 | # ── 毒句式 js↔py 同步锁 ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/story-setup/references/zcode/hooks/story_hook_core.js | 736 | // ── 毒句式(确定性 AI 句式指纹,写后正文网热路径)───────────────────────────── | COMMENT |
| MEDIUM | …ry-setup/references/templates/hooks/story_hook_core.js | 736 | // ── 毒句式(确定性 AI 句式指纹,写后正文网热路径)───────────────────────────── | COMMENT |
| MEDIUM | …-setup/references/antigravity/hooks/story_hook_core.js | 736 | // ── 毒句式(确定性 AI 句式指纹,写后正文网热路径)───────────────────────────── | COMMENT |
| MEDIUM | …lls/story-setup/references/opencode/story_hook_core.js | 736 | // ── 毒句式(确定性 AI 句式指纹,写后正文网热路径)───────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/skill-numbering.py | 845 | except Exception: | CODE |
| LOW | scripts/check-openclaw-skills.sh | 62 | except Exception: | CODE |
| LOW | scripts/check-openclaw-skills.sh | 88 | except Exception as exc: | CODE |
| LOW | skills/story-long-write/scripts/storyctl.py | 51 | except Exception as exc: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 39 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 61 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 79 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 94 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 102 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 151 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 398 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 509 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 519 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1320 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1322 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1434 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1497 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1512 | except Exception: | CODE |
| LOW | …story-setup/references/codex/hooks/story_codex_hook.py | 1524 | except Exception: | CODE |
| LOW | skills/story-setup/scripts/deploy-antigravity-skills.py | 104 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | demo/长篇/让你管账号,你高燃混剪炸全网/设定/文风.md | 36 | ## 六、原文 few-shot 锚点 | COMMENT |
| MEDIUM | …story-setup/references/zcode/hooks/story_zcode_hook.js | 200 | // Hook checks are defensive guardrails. Unexpected parse/filesystem failures | COMMENT |
| MEDIUM | …s/story-setup/references/antigravity/rules/oh-story.md | 25 | ## Writing guardrails | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/generate-codex-hooks.py | 29 | 'ROOT="$(cd "$ROOT" 2>/dev/null && pwd)" || exit 0; ' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/test-prose-net-parity.sh | 67 | "placeholder": "他打开门。\n(此处省略三百字打斗描写)他赢了。", | CODE |