Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1130 commits
Select commit Hold shift + click to select a range
1343068
Add map-level fight-initiation assembler and summary
lucasdoell Jun 13, 2026
89b68c5
Add Prisma entry point for map fight initiation
lucasdoell Jun 13, 2026
7728000
Clarify fight-initiation window intent and tidy tests
lucasdoell Jun 13, 2026
339d39f
Add fight initiation translation keys
lucasdoell Jun 13, 2026
32f622f
Add fight initiation inspector component
lucasdoell Jun 13, 2026
3b4061a
Remove dead description key and fix undetermined-fight headline
lucasdoell Jun 13, 2026
b819b55
Add Going First tab to the map page
lucasdoell Jun 13, 2026
0b40e55
Guard map fight-initiation load and rename tab to Initiation
lucasdoell Jun 13, 2026
df9d63c
Show response gap and ability-commit evidence in initiation inspector
lucasdoell Jun 13, 2026
6188252
Overlay objective captures on the initiation timeline
lucasdoell Jun 13, 2026
c0d99ee
Replace capture overlay with toggleable round markers
lucasdoell Jun 13, 2026
01ffecc
Collapse round markers into single transitions and fix list keys
lucasdoell Jun 13, 2026
9e911cd
Merge fight-initiation-going-first: add fight initiation (Going First…
lucasdoell Jun 13, 2026
063ac05
Add FSR schema: FaceitRole enum and PlayerFsr/PlayerFsrTier/FsrBaseli…
lucasdoell Jun 13, 2026
854eee6
Add FSR shared types
lucasdoell Jun 13, 2026
f899532
Add FSR constants with tier weights and shrinkage defaults
lucasdoell Jun 13, 2026
1fa9dd4
Add FSR per-role stat configs
lucasdoell Jun 13, 2026
eb4a8c7
Add FSR formula functions for z-scores, composites, and headline blend
lucasdoell Jun 13, 2026
551bf37
Add FSR (tier x role) baseline computation
lucasdoell Jun 13, 2026
8d04e4a
Add FSR SQL aggregate loader for per-tier player groups
lucasdoell Jun 13, 2026
70ffcbd
Add FSR recompute orchestration with advisory lock and stale-row cleanup
lucasdoell Jun 13, 2026
7db0ce5
Add read-only FSR dry-run script for validation and weight tuning
lucasdoell Jun 13, 2026
24b5aab
Add FSR bootstrap script and wire recompute into the daily cron
lucasdoell Jun 13, 2026
9c11c8b
Use bulk createMany in a transaction for FSR writes instead of per-ro…
lucasdoell Jun 13, 2026
c475da0
Move FSR recompute to its own daily cron at 06:30 UTC
lucasdoell Jun 13, 2026
ab6432d
Add FACEIT team scouting types and query error
lucasdoell Jun 13, 2026
af2ae5c
Add pure aggregations for FACEIT team scouting
lucasdoell Jun 13, 2026
1716f3a
Add FACEIT team scouting metrics
lucasdoell Jun 13, 2026
a2e3111
Add FACEIT team scouting Effect service and register its layer
lucasdoell Jun 13, 2026
95940d2
Add read-only FACEIT team scouting dry-run script
lucasdoell Jun 13, 2026
250c6da
Fix FACEIT attack/defense split to match faction1/faction2 format
lucasdoell Jun 13, 2026
e1d76a5
Add faceit-scouting feature flag
lucasdoell Jun 13, 2026
1496a31
Add FACEIT teams autocomplete API route
lucasdoell Jun 13, 2026
4588049
Add FACEIT team scouting i18n strings
lucasdoell Jun 13, 2026
797b134
Add FACEIT team search index page and search component
lucasdoell Jun 13, 2026
af75c2f
Add FACEIT team profile page and tab components
lucasdoell Jun 13, 2026
02d6425
Fix combined-mode match dedup and make FACEIT recommendation text i18…
lucasdoell Jun 13, 2026
f5ad70c
Add FACEIT player scouting types
lucasdoell Jun 13, 2026
fe7a5cd
Add pure player aggregations for FACEIT scouting
lucasdoell Jun 13, 2026
eaeab23
Add FACEIT player scouting metrics
lucasdoell Jun 13, 2026
8809116
Add FACEIT player scouting Effect service and register its layer
lucasdoell Jun 13, 2026
bf01021
Add read-only FACEIT player scouting dry-run script
lucasdoell Jun 13, 2026
1df579d
Fix unrated player role usage to map DB role casing to FaceitRole enum
lucasdoell Jun 13, 2026
3a68db8
Add FACEIT player scouting i18n strings
lucasdoell Jun 13, 2026
7c69d20
Add FACEIT players autocomplete API route
lucasdoell Jun 13, 2026
29ecc21
Add FACEIT player search index page and search component
lucasdoell Jun 13, 2026
656e436
Add FACEIT player profile page and panel components
lucasdoell Jun 13, 2026
2480500
Translate hardcoded eyebrow and verified labels in FACEIT player panels
lucasdoell Jun 13, 2026
4e8c435
Add FACEIT team/player entries to the scouting nav dropdown behind th…
lucasdoell Jun 13, 2026
3458cf0
Redesign FACEIT team and player scouting pages
lucasdoell Jun 13, 2026
10a3646
Scope combined FACEIT history to the overlapping core players
lucasdoell Jun 13, 2026
e8c4205
Keep all scouted-team matches when combining FACEIT history
lucasdoell Jun 13, 2026
dd08ca4
Add patch timeline to FACEIT team scouting
lucasdoell Jun 13, 2026
f0e4641
Redesign OWCS scouting pages and tie in FACEIT roster signal
lucasdoell Jun 13, 2026
1f2b800
Exclude marked substitutes from player intelligence
lucasdoell Jun 13, 2026
51b35c3
Add fight-initiation rollup tally helpers
lucasdoell Jun 13, 2026
a99af18
Tidy rollup loop variable and test import order
lucasdoell Jun 13, 2026
5e91818
Add team initiation aggregation service
lucasdoell Jun 13, 2026
4bbe6e7
Add team initiation card and translations
lucasdoell Jun 13, 2026
ac816a2
Register and wire team initiation service into the team stats page
lucasdoell Jun 13, 2026
d07f19e
Order initiation service registration and fix team card no-data guard
lucasdoell Jun 13, 2026
5939df9
Add scrim initiation aggregation service
lucasdoell Jun 13, 2026
38ba4ed
Add scrim initiation section and translations
lucasdoell Jun 13, 2026
9ab7bee
Add Fight Initiations section to the scrim overview
lucasdoell Jun 13, 2026
9d20ecb
Exclude marked substitutes from all team stats aggregates
lucasdoell Jun 14, 2026
80751a0
Merge fight-initiation-phase2: team and scrim fight initiation aggreg…
lucasdoell Jun 14, 2026
ce3fa48
Roll scrim WPA into a sortable overview accordion section
lucasdoell Jun 14, 2026
056c876
Restyle match story tab surfaces to the flat FACEIT table look
lucasdoell Jun 14, 2026
c1c7e80
Reformat
lucasdoell Jun 14, 2026
bed09d8
Fix linting issues
lucasdoell Jun 14, 2026
2359f68
Add winner and winnerSource fields to Map
lucasdoell Jun 14, 2026
d3529de
Add resolveMapWinner helper preferring stored winner
lucasdoell Jun 14, 2026
320c9ac
Resolve scrim overview winners from stored value
lucasdoell Jun 14, 2026
f9a521c
Resolve team analytics map winners from stored value
lucasdoell Jun 14, 2026
f64ace7
Add scrim map set-winner endpoint with winner validation
lucasdoell Jun 14, 2026
7b8d829
Audit log scrim map winner overrides
lucasdoell Jun 14, 2026
cd839a4
Add scrim map winner badge and override dialog
lucasdoell Jun 14, 2026
f159228
Localize scrim map winner UI and remove dead draw handling
lucasdoell Jun 14, 2026
dd2c599
Add computePushWinner coordinate approximation
lucasdoell Jun 14, 2026
5fd9cd2
Add ParserData and bundle adapters for push winner
lucasdoell Jun 14, 2026
ba058dd
Select Push map winner at upload and persist it
lucasdoell Jun 14, 2026
5081e30
Share upload winner source type and reuse parsed team names
lucasdoell Jun 14, 2026
2b8870d
Add Push winner backfill script
lucasdoell Jun 14, 2026
a6a3014
Normalize and validate upload map winner against team names
lucasdoell Jun 14, 2026
ded9f1e
Move map winner badge to the bottom-left of the card
lucasdoell Jun 14, 2026
36b1ccd
Show resolved winner on the map overview page
lucasdoell Jun 14, 2026
9005d16
Show Push map score as 1-0 or 0-1 based on the winner
lucasdoell Jun 14, 2026
248e6ca
Make detected Push winner suggestion clearer and persistent
lucasdoell Jun 14, 2026
b4da3ca
Show map winner when scrim overview is gated off
lucasdoell Jun 14, 2026
5c916fb
Reformat
lucasdoell Jun 14, 2026
dac460c
Scaffold the WP GBM bake-off prototype directory
lucasdoell Jun 14, 2026
a42c059
Port the WP grouped-CV fold function to the bake-off harness
lucasdoell Jun 14, 2026
ff09303
Port WP metrics and isotonic calibration to the bake-off harness
lucasdoell Jun 14, 2026
4f222be
Add grouped-CV runner and LR self-validation to the bake-off harness
lucasdoell Jun 14, 2026
45906b6
Add the LR-vs-GBM bake-off runner with decisive-subset metrics
lucasdoell Jun 14, 2026
2144671
Record the WP GBM bake-off findings and Phase 2b verdict
lucasdoell Jun 14, 2026
9e0a22c
Add GBM tree family to the WP artifact and branch inference
lucasdoell Jun 14, 2026
94686be
Decompose fight-swing drivers by ablation so GBM and LR share one method
lucasdoell Jun 14, 2026
fa180f0
Serialize LightGBM boosters into the WP tree artifact schema
lucasdoell Jun 14, 2026
b5d2e4a
Add TS-vs-LightGBM tree inference parity fixture
lucasdoell Jun 14, 2026
3f3a850
Add per-mode GBM trainer with champion/challenger selection
lucasdoell Jun 14, 2026
78deac2
Add GBM artifact build and on-real-data parity validation scripts
lucasdoell Jun 14, 2026
e793729
Add the one-off GBM artifact upload script
lucasdoell Jun 14, 2026
217f664
Export the WP feature matrix to Blob and add the publish-callback route
lucasdoell Jun 14, 2026
167ed7a
Exclude the bun-run GBM prototype scripts from app typecheck
lucasdoell Jun 14, 2026
4163087
Add the Vercel Python GBM trainer and wire the retrain pipeline
lucasdoell Jun 14, 2026
885b029
Ignore Python bytecode in the wp-train function dir
lucasdoell Jun 14, 2026
48f4e78
Update the WP model card for the GBM production engine
lucasdoell Jun 14, 2026
3d5efc6
Document wp-train env vars, hard-fail on missing feature hash, fix st…
lucasdoell Jun 14, 2026
33753cb
Merge wp-gbm-engine: GBM production win-probability engine (Phase 2b)
lucasdoell Jun 14, 2026
dd8db04
Add 5 player stat fields to shared team base data projection
lucasdoell Jun 14, 2026
66d38c0
Add team scatter stat helpers and tests
lucasdoell Jun 14, 2026
1226508
Add team scatter service and process function
lucasdoell Jun 14, 2026
6591116
Add CorrelationScatter chart component
lucasdoell Jun 14, 2026
a97603d
Add TeamChartsTab with presets and custom builder
lucasdoell Jun 14, 2026
a763641
Add i18n strings for team charts tab
lucasdoell Jun 14, 2026
36a7cb7
Wire up Charts tab on team stats page
lucasdoell Jun 14, 2026
f509c33
Force 1:1 aspect ratio on team correlation scatter charts
lucasdoell Jun 14, 2026
fbdc911
Exclude substitute players from team charts and use 3:2 aspect ratio
lucasdoell Jun 14, 2026
d3adf4c
Polish team correlation scatter: label halos, axis spacing, formattin…
lucasdoell Jun 14, 2026
e48a587
Add expand-to-inspect dialog with axis zoom to team charts; fix Slide…
lucasdoell Jun 14, 2026
76b567b
Align team stats loading skeleton tabs with current tab set
lucasdoell Jun 14, 2026
5fee8b6
Surface custom chart axis selectors inside the expanded inspector
lucasdoell Jun 14, 2026
16ee516
Merge feat/team-charts-tab: team stats Charts tab with per-player cor…
lucasdoell Jun 14, 2026
e876048
Reformat
lucasdoell Jun 15, 2026
96b99d9
Move initation tab before compare tab
lucasdoell Jun 15, 2026
6f2f20c
Decide WP champion/challenger in the publish route with the live R2 i…
lucasdoell Jun 15, 2026
d3cc015
Merge wp-cc-fix: decide GBM champion/challenger in the publish route
lucasdoell Jun 15, 2026
071ab78
Extract shared AppHeader shell for dashboard, map, and player pages
lucasdoell Jun 15, 2026
622645e
Flip query builder flag default value to false
lucasdoell Jun 15, 2026
4a5d750
Reformat
lucasdoell Jun 15, 2026
1c11e90
Compute Match Story missed opportunities with reason tags
lucasdoell Jun 15, 2026
7a44937
Add missed-opportunities strings to all three catalogs
lucasdoell Jun 15, 2026
af3343a
Add the Match Story missed-opportunities section
lucasdoell Jun 15, 2026
43d61ea
Add ultimate names to heroes and a getHeroUltimate helper
lucasdoell Jun 15, 2026
282b8a9
Collapse missed opportunities to one area and add the per-fight ult b…
lucasdoell Jun 15, 2026
4d087cc
Plumb ult instances into the Match Story computation
lucasdoell Jun 15, 2026
f3d3ee5
Type the missed-opportunities test fixtures without any
lucasdoell Jun 15, 2026
9749264
Revise missed-opportunities catalog keys for the ult breakdown
lucasdoell Jun 15, 2026
79722a3
Render the per-fight ult breakdown in missed opportunities
lucasdoell Jun 15, 2026
44b6d64
Merge wp-missed-opportunities: Match Story missed-opportunities surface
lucasdoell Jun 15, 2026
27d3a5b
Redesign missed opportunities and add point-flip progress labels
lucasdoell Jun 15, 2026
7207a1e
Add query-builder catalog shaping helpers
lucasdoell Jun 15, 2026
2cbaf73
Add pure helpers for the AI query tools
lucasdoell Jun 15, 2026
583b833
Add describeQueryCatalog and runQuery AI tools
lucasdoell Jun 15, 2026
3151174
Return a clear error when resolveOptionsFor lacks teamId
lucasdoell Jun 15, 2026
6061b7c
Expose the AI query tools when the query builder flag is on
lucasdoell Jun 15, 2026
88eaf93
Describe the AI query tools in the system prompt when enabled
lucasdoell Jun 15, 2026
b984d9c
Note where the model row cap is duplicated in prose
lucasdoell Jun 15, 2026
4d9c378
Reformat
lucasdoell Jun 15, 2026
46839c5
Index case-insensitive player_name lookups
lucasdoell Jun 15, 2026
e5fa0a5
Drop 15 redundant single-column indexes
lucasdoell Jun 15, 2026
7a073f2
Use approximate row counts for large-table stats
lucasdoell Jun 15, 2026
2ac61d5
Add chunk helper for batching
lucasdoell Jun 15, 2026
96afa78
Add mapWithConcurrency helper with bounded concurrency
lucasdoell Jun 15, 2026
3da605c
Batch team fight-initiation event fetch by map
lucasdoell Jun 15, 2026
fe3293b
Add HoverPrefetchLink for on-intent prefetching
lucasdoell Jun 15, 2026
37e8b2d
Add per-tab nav with on-intent prefetch and range carry-over
lucasdoell Jun 15, 2026
fa0de56
Extract shared team stats context loader
lucasdoell Jun 15, 2026
a38b6b2
Add shared team stats header and insufficient-scrims gate
lucasdoell Jun 15, 2026
ccab1c1
Add team stats Performance route
lucasdoell Jun 15, 2026
bc65821
Add team stats Heroes route
lucasdoell Jun 15, 2026
f0ce0c8
Add team stats Trends route
lucasdoell Jun 15, 2026
2a332cc
Add team stats Maps route
lucasdoell Jun 15, 2026
95d0eb5
Add team stats Swaps route
lucasdoell Jun 15, 2026
08d884b
Add team stats Teamfights route
lucasdoell Jun 15, 2026
ddef12f
Add team stats Ultimates route
lucasdoell Jun 15, 2026
ff4ac85
Add team stats Winrates route
lucasdoell Jun 15, 2026
51ae9dc
Add team stats Charts route
lucasdoell Jun 15, 2026
a7e9dd7
Add team stats Positional route
lucasdoell Jun 15, 2026
777cfe0
Add team stats Tendencies route
lucasdoell Jun 15, 2026
c448c33
Add team stats Simulator route
lucasdoell Jun 15, 2026
cac5bf1
Convert team stats base route to Overview-only with shared header
lucasdoell Jun 15, 2026
30524b3
Simplify team stats loading skeleton for per-tab routes
lucasdoell Jun 15, 2026
c71cf22
Add authed team stats-summary API route for the persistent header
lucasdoell Jun 15, 2026
799e832
Add client team stats header backed by React Query
lucasdoell Jun 15, 2026
955c1dc
Move team stats shell into the layout
lucasdoell Jun 15, 2026
a7bc685
Skeleton only page content in team stats loading state
lucasdoell Jun 15, 2026
1ad95a3
Restore full-width tab distribution in team stats nav
lucasdoell Jun 15, 2026
60d4f3c
Lift app header above page content stacking contexts
lucasdoell Jun 15, 2026
4d3c32f
Reformat
lucasdoell Jun 15, 2026
c03b3c9
Signal timeframe changes with a terminal dot-matrix loader
lucasdoell Jun 15, 2026
7ef297e
Add predictive prefetch geometry module
lucasdoell Jun 15, 2026
9c21a59
Add usePredictivePrefetch hook
lucasdoell Jun 15, 2026
bf29ca8
Format predictive prefetch hook
lucasdoell Jun 15, 2026
c9a9518
Reject protocol-relative hrefs in predictive prefetch
lucasdoell Jun 15, 2026
c03af87
Adopt predictive prefetch on team stats nav
lucasdoell Jun 15, 2026
c889d72
Remove superseded proximity prefetch experiment
lucasdoell Jun 15, 2026
214a2e7
Gate predictive prefetch on speed before zero-distance
lucasdoell Jun 15, 2026
cdb9192
Add predictive prefetch debug overlay behind env flag
lucasdoell Jun 15, 2026
0f5f66c
Add TempoBaseline model and migration
lucasdoell Jun 15, 2026
46f777d
Add pure tempo baseline aggregation helpers
lucasdoell Jun 15, 2026
94d251d
Add pure tempo classification and delta formatting
lucasdoell Jun 15, 2026
13f4fc3
Avoid rendering negative-zero tempo deltas
lucasdoell Jun 15, 2026
83776aa
Add cached tempo baseline read
lucasdoell Jun 15, 2026
db7142b
Add global tempo baseline recompute
lucasdoell Jun 15, 2026
504b283
Tolerate per-team failures in tempo baseline recompute
lucasdoell Jun 15, 2026
3ef1a0e
Add weekly tempo baseline cron
lucasdoell Jun 15, 2026
f6d67d0
Add tempo read i18n keys and drop hardcoded-bucket keys
lucasdoell Jun 15, 2026
87a95c1
Match zh unit spacing in tempo delta string
lucasdoell Jun 15, 2026
2f817e0
Show data-driven fight duration read from global baseline
lucasdoell Jun 15, 2026
f95275c
Show data-driven ult charge and hold read from global baseline
lucasdoell Jun 15, 2026
6f3f1d1
Extract shared tempo read-label hook
lucasdoell Jun 15, 2026
67405df
Thread ult tempo baselines into tournament stats page
lucasdoell Jun 15, 2026
ab3ea97
Add pure opponent ult-tempo benchmark helpers
lucasdoell Jun 15, 2026
f6d53c8
Compute opponent ult-tempo comparisons in the ult service
lucasdoell Jun 15, 2026
55cc3a7
Add opponent ult comparison i18n keys
lucasdoell Jun 15, 2026
02a5b62
Fix indentation of opponent i18n block
lucasdoell Jun 15, 2026
a71d875
Add opponent comparison hover card body
lucasdoell Jun 15, 2026
d160d03
Show opponent comparison hover card on ult tempo rows
lucasdoell Jun 15, 2026
307ff52
Identify opponents by player_team name instead of opponentTeamId
lucasdoell Jun 15, 2026
62cb738
Center the opponent comparison hover card
lucasdoell Jun 15, 2026
5731b56
Add opponent delta diverging bar chart
lucasdoell Jun 15, 2026
6362dac
Widen delta chart label headroom to avoid clipping
lucasdoell Jun 15, 2026
05e8aea
Replace opponent hover table with persistent per-metric delta charts
lucasdoell Jun 15, 2026
75bf2d1
Move delta labels outside bars and clarify opponent delta wording
lucasdoell Jun 15, 2026
9f3c170
Flip charge-time delta chart to good-positive and add better/worse le…
lucasdoell Jun 15, 2026
cca9e74
Orient delta charts with better on the right, worse on the left
lucasdoell Jun 15, 2026
58d58fd
Add Antarctic maps for calibration
lucasdoell Jun 16, 2026
ffef8db
Update Antarctic subpoint names
lucasdoell Jun 16, 2026
4d417ff
Add pixel-space remap core for map render re-alignment
lucasdoell Jun 16, 2026
251dc66
Tighten remap generic typing and add applyPixelAffine unit test
lucasdoell Jun 16, 2026
9c21e55
Add OpenCV alignment engine for map render re-alignment
lucasdoell Jun 16, 2026
a455737
Clarify alignment matcher loop and name tuning constants
lucasdoell Jun 16, 2026
8410506
Add map-align serverless handler and register Vercel function
lucasdoell Jun 16, 2026
bd61519
Match map-align error handling to wp-train pattern
lucasdoell Jun 16, 2026
08ada46
Add align route that stages a render and computes the pixel transform
lucasdoell Jun 16, 2026
75cf75e
Harden align route: secret guard, engine timeout, richer logs
lucasdoell Jun 16, 2026
cbeb2dd
Add apply route that backs up, promotes, and remaps calibration
lucasdoell Jun 16, 2026
cba343c
Harden apply route: exact staged-key check, id guard, recovery docs
lucasdoell Jun 16, 2026
e4d30d6
Add revert route to restore the last render swap
lucasdoell Jun 16, 2026
fcaa6f7
Log underlying error when revert finds no backup
lucasdoell Jun 16, 2026
bd1415f
Add replace-render dialog with anchor-overlay review to calibration e…
lucasdoell Jun 16, 2026
ccb01c1
Fix stale-closure discard and polish replace-render file input
lucasdoell Jun 16, 2026
dafd249
Add blink and swipe old-vs-new compare to render re-alignment review
lucasdoell Jun 16, 2026
e3db9b2
Bound alignment to a working resolution to handle high-res renders
lucasdoell Jun 16, 2026
bce2df8
Document non-PNG full-decode boundary in decode_bounded
lucasdoell Jun 16, 2026
3b681f4
Move alignment engine off Vercel into a local uv CLI script
lucasdoell Jun 16, 2026
364d6ab
Reduce align route to staging only; transform now comes from local CLI
lucasdoell Jun 16, 2026
557e9f2
Switch replace-render dialog to paste the local alignment transform
lucasdoell Jun 16, 2026
f10df88
Reset compare-panel state when the replace-render dialog closes
lucasdoell Jun 16, 2026
964eda8
Add batch aligner that loops all map pairs into a transforms manifest
lucasdoell Jun 16, 2026
f74780b
Make replace-render review scrollable and viewport-bounded
lucasdoell Jun 16, 2026
6641f21
Drop crossOrigin in MapCanvas so presigned images load without CORS
lucasdoell Jun 16, 2026
0b70f5d
Fix replace-render dialog horizontal overflow and script-hint key
lucasdoell Jun 16, 2026
3fac335
Reformat
lucasdoell Jun 16, 2026
6b150a5
Add gitignore for map alignment script
lucasdoell Jun 16, 2026
86ad809
Fix translation key for matchmaker
lucasdoell Jun 16, 2026
6711686
Add support for Shion
lucasdoell Jun 16, 2026
3f76b1b
Hard-code origin route
lucasdoell Jun 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .deepsec/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
node_modules/
.env*.local

# Scan output — regenerated by `deepsec scan` / `process`. INFO.md
# and SETUP.md (manually edited) stay tracked.
data/*/files/
data/*/runs/
data/*/reports/
data/*/project.json
23 changes: 23 additions & 0 deletions .deepsec/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Agent setup

This is a deepsec scanning workspace. Each registered project has its
own setup prompt at `data/<id>/SETUP.md` — open the relevant one when
asked to set a project up.

## Common tasks

- **Set up a project for scanning**: read `data/<id>/SETUP.md` and
follow it (read `node_modules/deepsec/SKILL.md`, then fill
`data/<id>/INFO.md` from the target codebase).
- **Add a new project**: run `deepsec init-project <root>` — it
scaffolds `data/<id>/` and prints/writes the setup prompt for the
new project.
- **Write a custom matcher** (only after a real true-positive shows you
a pattern worth keeping): read
`node_modules/deepsec/dist/docs/writing-matchers.md`.

## Reference

The deepsec skill is at `node_modules/deepsec/SKILL.md` (after
`pnpm install`). The full docs ship at
`node_modules/deepsec/dist/docs/`.
74 changes: 74 additions & 0 deletions .deepsec/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# deepsec

This directory holds the [deepsec](https://www.npmjs.com/package/deepsec)
config for the parent repo. Checked into git so teammates inherit
project context (auth shape, threat model, custom matchers); generated
scan output is gitignored.

Currently configured project: `parsertime` (target: `..`).

## Setup

1. `pnpm install` — installs deepsec.
2. Add an AI Gateway / Anthropic / OpenAI token to `.env.local`. If
you already have `claude` or `codex` CLI logged in on this
machine, you can skip the token for non-sandbox runs (`process` /
`revalidate` / `triage`); deepsec auto-detects and reuses the
subscription. See
`node_modules/deepsec/dist/docs/vercel-setup.md` after install.
3. Open the parent repo in your coding agent (Claude Code, Cursor, …)
and have it follow `data/parsertime/SETUP.md` to fill in
`data/parsertime/INFO.md`.

## Daily commands

```bash
pnpm deepsec scan
pnpm deepsec process --concurrency 5
pnpm deepsec revalidate --concurrency 5 # cuts FP rate
pnpm deepsec export --format md-dir --out ./findings
```

`--project-id` is auto-resolved while there's only one project in
`deepsec.config.ts`. Once you've added a second project, pass
`--project-id parsertime` (or whichever id you want) explicitly.

`scan` is free (regex only). `process` is the AI stage (≈$0.30/file
on Opus by default). Run state goes to `data/parsertime/`.

## Adding another project

To scan another codebase from this same `.deepsec/`:

```bash
pnpm deepsec init-project ../some-other-package # path relative to .deepsec/
```

Appends an entry to `deepsec.config.ts` and writes
`data/<id>/{INFO.md,SETUP.md,project.json}`. Open the new SETUP.md
in your agent to fill in INFO.md.

## Layout

```
deepsec.config.ts Project list (one entry per scanned repo)
data/parsertime/
INFO.md Repo context — checked into git, hand-curated
SETUP.md Agent setup prompt — checked in, deletable
project.json Generated (gitignored)
files/ One JSON per scanned source file (gitignored)
runs/ Run metadata (gitignored)
reports/ Generated markdown reports (gitignored)
AGENTS.md Pointer for coding agents
.env.local Tokens (gitignored)
```

## Docs

After `pnpm install`:

- Skill: `node_modules/deepsec/SKILL.md`
- Full docs: `node_modules/deepsec/dist/docs/{getting-started,configuration,models,writing-matchers,plugins,architecture,data-layout,vercel-setup,faq}.md`

Or browse on
[GitHub](https://github.com/vercel/deepsec/tree/main/docs).
74 changes: 74 additions & 0 deletions .deepsec/data/parsertime/INFO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# parsertime

## What this codebase does

Parsertime is a Next.js 16 App Router app for collegiate Overwatch teams to
track scrims, maps, player stats, tournaments, scouting, matchmaker requests,
availability, notifications, and AI chat insights. It is TypeScript/React with
Prisma on Postgres, NextAuth, Vercel KV/Blob/Edge Config, Stripe billing and AI
credits, Axiom telemetry, Discord bot integrations, FACEIT ingest, and server
route handlers under `src/app/api`.

## Auth shape

- NextAuth is configured in `src/lib/auth.ts`; route handlers and server pages
normally call `auth()` and then resolve the app user through `UserService`
with `AppRuntime.runPromise`.
- Role and plan checks use `$Enums.UserRole.ADMIN` / `UserRole.ADMIN` and the
`Permission` / `check` helpers for feature gates such as `create-team`,
`create-scrim`, and stats timeframe access.
- Team/scrim/map access is project-specific: use `isAuthedToViewTeam`,
`isTeamOwnerOrManager`, `isAuthedToViewScrim`, `isAuthedToViewMap`, or
explicit owner/manager/member checks against Prisma.
- Machine endpoints use non-session auth: `authenticateBotSecret`,
`resolveDiscordUser`, `verifyTeamAccess`, local cron secret checks, Stripe
webhook signatures, and FACEIT HMAC signatures.
- `guestMode` is an intentional sharing path for scrims and some `/team`
layouts; it should not imply general team membership or write access.

## Threat model

Highest impact is cross-team or public access to private scrim data, map stats,
player availability, reports, chat history, tournament admin flows, or team
management actions. Next are privilege escalation to admin/manager capabilities,
abuse of Stripe/AI-credit flows, unauthorized Blob/R2 uploads, bot/internal
endpoint abuse via shared secrets, and forged FACEIT/Stripe/cron callbacks.
Public scouting, leaderboard, health, metadata, and guest availability surfaces
exist, but should return only deliberately public or constrained data.

## Project-specific patterns to flag

- Any mutating `src/app/api/**/route.ts` that touches Prisma/services without
`auth()`, a named auth helper, `authenticateBotSecret`, a cron secret, or a
verified external webhook signature.
- Team, scrim, map, tournament, comparison, notification, or credit handlers
that trust a `teamId`, `scrimId`, `mapId`, `userId`, `conversationId`, or
`scheduleId` from params/body without checking membership, owner/manager
status, admin role, or the matching session user.
- Admin-only paths under `src/app/settings/admin` and `src/app/api/admin` that
do not require `UserRole.ADMIN` before search, audit-log, map-calibration, or
impersonation behavior.
- Upload/presign flows using `handleUpload`, Vercel Blob, R2, avatar/banner
keys, or map-calibration files that authenticate a user but do not authorize
ownership/manager/admin access for the target team/user/map.
- DEV_TOKEN/testing-email fallbacks, cron-like destructive routes, bot routes,
and webhook endpoints that are reachable in production without fail-closed
secret/signature validation.

## Known false-positives

- `src/app/api/auth/[...nextauth]/route.ts` is intentionally public because
NextAuth owns the callback/session flow; evaluate `src/lib/auth.ts` instead.
- `src/app/api/stripe/webhooks/route.ts` and
`src/app/api/faceit/webhook/route.ts` are sessionless by design; the intended
auth is Stripe signature verification or FACEIT HMAC verification.
- `src/app/api/bot/**` and `src/app/api/internal/availability/**` are machine
endpoints; `authenticateBotSecret` plus Discord user/team checks are the
expected auth shape.
- `src/app/api/availability/[scheduleId]/responses/**` allows unauthenticated
availability submissions for shared schedules, with optional password/name
ownership semantics.
- Public metadata and read surfaces include `robots.ts`, `sitemap.ts`,
`manifest.ts`, `.well-known/**`, `api/health`, `api/og`, `api/leaderboard/**`,
and public scouting/profile/stat pages; do not require `auth()` solely for
those routes.
55 changes: 55 additions & 0 deletions .deepsec/data/parsertime/SETUP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Agent setup for `parsertime`

This is a deepsec scanning workspace. Project `parsertime` was just registered
(target: `..`). Setup is incomplete — `data/parsertime/INFO.md`
still has placeholder sections.

## What to do

1. **Read the deepsec skill.** After `pnpm install`, the file is at
`node_modules/deepsec/SKILL.md`. It maps every doc topic to a file
under `node_modules/deepsec/dist/docs/`. Read `getting-started.md`,
`configuration.md`, and `writing-matchers.md` (skim the rest).

2. **Fill in `data/parsertime/INFO.md`.** It's auto-injected into the AI
prompt for every batch — keep it short and selective.

**Length budget: 50–100 lines total.** Verbose context dilutes
signal in the scanner's prompt window. The goal is "what would a
reviewer miss if they didn't read this?", not exhaustive enumeration.

**Per-section rubric**:
- Pick 3–5 representative items per section. **Don't list every
file, helper, or callsite** — pick the patterns.
- Name primitives by their public name (e.g. `withAuthentication`,
`auth.can()`, `isTeamAdmin`). **No line numbers.** Don't enumerate
more than 5 paths in any list.
- Skip generic CWE categories — built-in matchers already cover
"SSRF", "SQL injection", "XSS". Cover what's _project-specific_:
internal auth helpers, custom middleware names, fork-specific
stubs, intended-public endpoints.
- One short paragraph or 3–5 short bullets per section. Not both.

Source material (read in this order, stop when you have enough):
- `../README.md`
- any `AGENTS.md` / `CLAUDE.md` in `..`
- `../package.json` (or `go.mod`, `pyproject.toml`, etc.)
- 5–10 representative code files (entry points, auth helpers) — not
a full code tour.

3. **(Optional) Add custom matchers** for repo-specific patterns the
built-in matchers won't catch. Read
`node_modules/deepsec/dist/docs/writing-matchers.md` first; the
workflow there starts from a confirmed finding and grows the matcher
from it. Don't add matchers speculatively — wait for a real TP.

## When you're done

The user will run:

```bash
pnpm deepsec scan --project-id parsertime
pnpm deepsec process --project-id parsertime
```

You can delete this file once setup is complete.
6 changes: 6 additions & 0 deletions .deepsec/data/parsertime/tech.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"tags": ["github-actions", "nextjs", "node", "prisma", "react"],
"sentinels": ["next.config.ts", "package.json"],
"detectedAt": "2026-05-27T15:25:18.654Z",
"rootPath": "/Users/lucasdoell/code/parsertime"
}
8 changes: 8 additions & 0 deletions .deepsec/deepsec.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineConfig } from "deepsec/config";

export default defineConfig({
projects: [
{ id: "parsertime", root: ".." },
// <deepsec:projects-insert-above>
],
});
12 changes: 12 additions & 0 deletions .deepsec/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "deepsec-workspace",
"version": "0.1.0",
"private": true,
"description": "deepsec scanning workspace",
"type": "module",
"workspaces": [],
"packageManager": "pnpm@9.15.4",
"dependencies": {
"deepsec": "^2.0.10"
}
}
Loading
Loading