Skip to content

feat(ctf): multi-event corpus ingestion and 30 new tier-B challenges - #31

Closed
log0u7 wants to merge 1 commit into
mainfrom
feat/ctf-corpus-scale-v4
Closed

log0u7 wants to merge 1 commit into
mainfrom
feat/ctf-corpus-scale-v4

Conversation

@log0u7

@log0u7 log0u7 commented Oct 26, 2026

Copy link
Copy Markdown
Owner

Summary

  • ingest generalizes across CTF-Archives events (Zeekr, WQB, CCB 2026): content-root resolution with dedup (symlink-cycle guarded), longest directory name = canonical challenge name, hex-hash suffix stripped for README statement matching (all 29 WQB/CCB statements extract now).
  • 30 new tier-B challenges (WQB 27 slots incl. SilentConfig tar.gz, CCB 3): statements in Chinese, flag format only, writeups never embedded. The statement-less incident challenge stays out of the corpus (gitleaks trips on its fictional decoy UUID; its tar remains in the local store - no allowlist needed, the file is not in this history).
  • Regression guards: case-id charset/uniqueness asserts, manifest-vs-cases consistency test (the orphan class found by review), statement-less fallback test, symlink-cycle test.
  • New totals: 53 corpus cases (12 verified tier, 41 tier-B) + 3 legacy pack examples.
  • Replaces feat(ctf): multi-event corpus ingestion and 30 new tier-B challenges #30 (same feature, branch history rebuilt without the gitleaks-flagged intermediate commit).

Issue for this PR

N/A

Checklist

  • Conventional Commits
  • test_ctf_ingest.py: 6 tests across the three extraction layouts
  • 473 tests + lint + mypy green locally

ingest generalizes across CTF-Archives events (Zeekr 2026-09-19, WQB
2026-09-04, CCB 2026-09-13): extraction layouts vary per zip (wrapper
dirs, nesting), so challenges resolve to their content root and
deduplicate by that root (symlink-cycle guarded), with the longest
directory name as the canonical challenge name. Statement matching
strips the hex-hash suffix of release dir names.

30 new tier-B challenges (WQB 27 slots incl. SilentConfig, CCB 3):
statements in Chinese, flag format only, writeups never embedded. The
statement-less incident challenge stays out of the corpus (gitleaks
trips on its fictional decoy UUID; its tar remains in the local store).

Regression guards: case-id charset/uniqueness asserts, a
manifest-vs-cases consistency test (the orphan class found by review),
a statement-less fallback test and a symlink-cycle test. New totals:
53 corpus cases (12 verified tier, 41 tier-B) + 3 legacy pack examples.
@log0u7

log0u7 commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

Duplicate of #30 and superseded by main (5df562b): corpus ingestion landed, incident case intentionally excluded to keep gitleaks clean.

@log0u7 log0u7 closed this Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant