Skip to content

Commit 3577381

Browse files
committed
feat: consolidate native reader labs and Brain v4
1 parent af3a96b commit 3577381

85 files changed

Lines changed: 8056 additions & 2824 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 32 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,51 @@
11
{
22
"fixtures": [
33
{
4-
"slug": "interstellar",
5-
"providers": [
6-
"4khdhubnew", "CASTLE", "GOATED", "HDGHARTV", "HINDMOVIEZ", "kisskh", "MOVIEBLAST", "MOVIEBOX", "MOVIX", "playimdb", "VIDLOVE", "ANIME-SAMA", "PURSTREAM", "FLEMMIX", "PAPADUSTREAM", "frenchstream", "streamzo", "MUGIWARASTREAM", "VOIRANIME", "toflix", "sekai", "ANIMESAMA-CO", "ANIMESULTRA", "ANIMEVOSTFR", "ANIMOFLIX", "COFLIX", "FRENCH-MANGA", "NAKIOS", "VOIRANIME-RIP", "VOSTFREE", "WOOKAFR", "movieshunt", "cineby", "videasy", "VIXSRC", "1SHOWS", "allanime", "vidsrc"
7-
],
4+
"slug": "sinners-2025",
5+
"providers": ["MOVIESDRIVE", "MOVIESMOD", "movieshunt", "4khdhub"],
86
"fixture": {
9-
"tmdbId": "157336",
7+
"tmdbId": "1233413",
108
"mediaType": "movie",
11-
"title": "Interstellar",
12-
"year": 2014,
9+
"title": "Sinners",
10+
"year": 2025,
1311
"category": "movie",
14-
"expectedDurationMinutes": 169
12+
"expectedDurationMinutes": 137,
13+
"aliases": ["Sinners"]
1514
}
1615
},
16+
{
17+
"slug": "interstellar",
18+
"providers": ["4khdhub", "CASTLE", "GOATED", "HDGHARTV", "HINDMOVIEZ", "kisskh", "MOVIEBLAST", "MOVIEBOX", "MOVIX", "playimdb", "VIDLOVE", "ANIME-SAMA", "PURSTREAM", "FLEMMIX", "PAPADUSTREAM", "frenchstream", "streamzo", "MUGIWARASTREAM", "VOIRANIME", "toflix", "sekai", "ANIMESAMA-CO", "ANIMESULTRA", "ANIMEVOSTFR", "ANIMOFLIX", "COFLIX", "FRENCH-MANGA", "NAKIOS", "VOIRANIME-RIP", "VOSTFREE", "WOOKAFR", "movieshunt", "cineby", "videasy", "VIXSRC", "1SHOWS", "allanime", "vidsrc"],
19+
"fixture": {"tmdbId": "157336", "mediaType": "movie", "title": "Interstellar", "year": 2014, "category": "movie", "expectedDurationMinutes": 169}
20+
},
1721
{
1822
"slug": "mon-ninja-et-moi-3",
19-
"providers": [
20-
"CASTLE", "MOVIEBOX", "streamzo", "videasy", "VIDLOVE", "VIXSRC", "ANIME-SAMA", "PURSTREAM", "GOATED", "FLEMMIX", "PAPADUSTREAM", "frenchstream", "MUGIWARASTREAM", "VOIRANIME", "toflix", "sekai", "ANIMESAMA-CO", "ANIMESULTRA", "ANIMEVOSTFR", "ANIMOFLIX", "COFLIX", "FRENCH-MANGA", "MOVIX", "NAKIOS", "VOIRANIME-RIP", "VOSTFREE", "WOOKAFR", "movieshunt", "HINDMOVIEZ", "cineby", "HDGHARTV", "playimdb", "MOVIEBLAST", "4khdhubnew", "1SHOWS", "allanime", "vidsrc", "kisskh"
21-
],
22-
"fixture": {
23-
"tmdbId": "1215638",
24-
"mediaType": "movie",
25-
"title": "Mon ninja et moi 3",
26-
"year": 2025,
27-
"category": "movie",
28-
"expectedDurationMinutes": 88,
29-
"aliases": ["Mon ninja et moi 3", "Checkered Ninja 3", "Ternet Ninja 3"],
30-
"forbiddenAliases": ["Enola Holmes 2"]
31-
}
23+
"providers": ["CASTLE", "MOVIEBOX", "streamzo", "videasy", "VIDLOVE", "VIXSRC", "ANIME-SAMA", "PURSTREAM", "GOATED", "FLEMMIX", "PAPADUSTREAM", "frenchstream", "MUGIWARASTREAM", "VOIRANIME", "toflix", "sekai", "ANIMESAMA-CO", "ANIMESULTRA", "ANIMEVOSTFR", "ANIMOFLIX", "COFLIX", "FRENCH-MANGA", "MOVIX", "NAKIOS", "VOIRANIME-RIP", "VOSTFREE", "WOOKAFR", "movieshunt", "HINDMOVIEZ", "cineby", "HDGHARTV", "playimdb", "MOVIEBLAST", "4khdhub", "1SHOWS", "allanime", "vidsrc", "kisskh"],
24+
"fixture": {"tmdbId": "1215638", "mediaType": "movie", "title": "Mon ninja et moi 3", "year": 2025, "category": "movie", "expectedDurationMinutes": 88, "aliases": ["Mon ninja et moi 3", "Checkered Ninja 3", "Ternet Ninja 3"], "forbiddenAliases": ["Enola Holmes 2"]}
3225
},
3326
{
3427
"slug": "breaking-bad-s01e01",
35-
"providers": [
36-
"1SHOWS", "CASTLE", "GOATED", "HINDMOVIEZ", "kisskh", "MOVIX", "PAPADUSTREAM", "persianstremio", "streamzo", "videasy", "VIDLOVE", "VIXSRC", "PURSTREAM", "FLEMMIX", "frenchstream", "toflix", "COFLIX", "DULOURD", "NAKIOS", "WOOKAFR", "DESIFLIX", "cineby", "HDGHARTV", "playimdb", "4khdhubnew", "vidsrc"
37-
],
38-
"fixture": {
39-
"tmdbId": "1396",
40-
"mediaType": "tv",
41-
"title": "Breaking Bad",
42-
"year": 2008,
43-
"season": 1,
44-
"episode": 1,
45-
"category": "tv",
46-
"expectedDurationMinutes": 58
47-
}
28+
"providers": ["1SHOWS", "CASTLE", "GOATED", "HINDMOVIEZ", "kisskh", "MOVIX", "PAPADUSTREAM", "persianstremio", "streamzo", "videasy", "VIDLOVE", "VIXSRC", "PURSTREAM", "FLEMMIX", "frenchstream", "toflix", "COFLIX", "DULOURD", "NAKIOS", "WOOKAFR", "DESIFLIX", "cineby", "HDGHARTV", "playimdb", "4khdhub", "vidsrc"],
29+
"fixture": {"tmdbId": "1396", "mediaType": "tv", "title": "Breaking Bad", "year": 2008, "season": 1, "episode": 1, "category": "tv", "expectedDurationMinutes": 58}
4830
},
4931
{
5032
"slug": "revenant-s01e01",
51-
"providers": [
52-
"CASTLE", "cineby", "DVDPLAY", "GOATED", "HINDMOVIEZ", "kisskh", "MOVIEBOX", "PAPADUSTREAM", "playimdb", "streamzo", "VIXSRC", "PURSTREAM", "FLEMMIX", "frenchstream", "toflix", "COFLIX", "DULOURD", "MOVIX", "NAKIOS", "WOOKAFR", "DESIFLIX", "videasy", "HDGHARTV", "4khdhubnew", "1SHOWS", "vidsrc", "VIDLOVE"
53-
],
54-
"fixture": {
55-
"tmdbId": "210702",
56-
"mediaType": "tv",
57-
"title": "Revenant",
58-
"year": 2023,
59-
"season": 1,
60-
"episode": 1,
61-
"category": "tv",
62-
"expectedDurationMinutes": 77,
63-
"aliases": ["Revenant", "The Devil", "악귀"]
64-
}
33+
"providers": ["CASTLE", "cineby", "DVDPLAY", "GOATED", "HINDMOVIEZ", "kisskh", "MOVIEBOX", "PAPADUSTREAM", "playimdb", "streamzo", "VIXSRC", "PURSTREAM", "FLEMMIX", "frenchstream", "toflix", "COFLIX", "DULOURD", "MOVIX", "NAKIOS", "WOOKAFR", "DESIFLIX", "videasy", "HDGHARTV", "4khdhub", "1SHOWS", "vidsrc", "VIDLOVE"],
34+
"fixture": {"tmdbId": "210702", "mediaType": "tv", "title": "Revenant", "year": 2023, "season": 1, "episode": 1, "category": "tv", "expectedDurationMinutes": 77, "aliases": ["Revenant", "The Devil", "악귀"]}
6535
},
6636
{
6737
"slug": "jujutsu-kaisen-s01e01",
68-
"providers": [
69-
"anikototv", "ANIME-SAMA", "ANIMESAMA-CO", "ANIMEVOSTFR", "hianime", "MOVIX", "MUGIWARASTREAM", "PAPADUSTREAM", "VOIRANIME-RIP", "PURSTREAM", "frenchstream", "streamzo", "VOIRANIME", "toflix", "sekai", "ANIMESULTRA", "ANIMOFLIX", "COFLIX", "DULOURD", "FRENCH-MANGA", "NAKIOS", "VOSTFREE"
70-
],
71-
"fixture": {
72-
"tmdbId": "95479",
73-
"mediaType": "tv",
74-
"title": "Jujutsu Kaisen",
75-
"year": 2020,
76-
"season": 1,
77-
"episode": 1,
78-
"category": "anime",
79-
"expectedDurationMinutes": 24
80-
}
38+
"providers": ["anikototv", "ANIME-SAMA", "ANIMESAMA-CO", "ANIMEVOSTFR", "hianime", "MOVIX", "MUGIWARASTREAM", "PAPADUSTREAM", "VOIRANIME-RIP", "PURSTREAM", "frenchstream", "streamzo", "VOIRANIME", "toflix", "sekai", "ANIMESULTRA", "ANIMOFLIX", "COFLIX", "DULOURD", "FRENCH-MANGA", "NAKIOS", "VOSTFREE"],
39+
"fixture": {"tmdbId": "95479", "mediaType": "tv", "title": "Jujutsu Kaisen", "year": 2020, "season": 1, "episode": 1, "category": "anime", "expectedDurationMinutes": 24}
8140
},
8241
{
8342
"slug": "mushoku-tensei-s01e01",
84-
"providers": [
85-
"anikototv", "ANIME-SAMA", "ANIMESALT", "ANIMESAMA-CO", "hianime", "MOVIX", "MUGIWARASTREAM", "PAPADUSTREAM", "VOIRANIME-RIP", "PURSTREAM", "frenchstream", "streamzo", "VOIRANIME", "toflix", "sekai", "ANIMESULTRA", "ANIMEVOSTFR", "ANIMOFLIX", "COFLIX", "DULOURD", "FRENCH-MANGA", "NAKIOS", "VOSTFREE"
86-
],
87-
"fixture": {
88-
"tmdbId": "94664",
89-
"mediaType": "tv",
90-
"title": "Mushoku Tensei: Jobless Reincarnation",
91-
"year": 2021,
92-
"season": 1,
93-
"episode": 1,
94-
"category": "anime",
95-
"expectedDurationMinutes": 24,
96-
"aliases": ["Mushoku Tensei", "Mushoku Tensei: Jobless Reincarnation"]
97-
}
43+
"providers": ["anikototv", "ANIME-SAMA", "ANIMESALT", "ANIMESAMA-CO", "hianime", "MOVIX", "MUGIWARASTREAM", "PAPADUSTREAM", "VOIRANIME-RIP", "PURSTREAM", "frenchstream", "streamzo", "VOIRANIME", "toflix", "sekai", "ANIMESULTRA", "ANIMEVOSTFR", "ANIMOFLIX", "COFLIX", "DULOURD", "FRENCH-MANGA", "NAKIOS", "VOSTFREE"],
44+
"fixture": {"tmdbId": "94664", "mediaType": "tv", "title": "Mushoku Tensei: Jobless Reincarnation", "year": 2021, "season": 1, "episode": 1, "category": "anime", "expectedDurationMinutes": 24, "aliases": ["Mushoku Tensei", "Mushoku Tensei: Jobless Reincarnation"]}
9845
}
9946
],
10047
"clients": ["tv", "desktop", "mobile"],
101-
"run_revision": "real-coverage-diagnostic-v11-reactivation-proof",
48+
"run_revision": "native-reader-diagnostics-v14-all-providers-including-inactive",
10249
"policy": {
10350
"target_total": 10,
10451
"minimum_vf": 3,
@@ -115,5 +62,13 @@
11562
"provider_timeout_ms": 70000,
11663
"retry_provider_timeouts": true,
11764
"retry_provider_timeout_ms": 70000,
118-
"playback_timeout_ms": 18000
65+
"playback_timeout_ms": 18000,
66+
"native_reader_acceptance": {
67+
"provider_scope": "all",
68+
"include_disabled": true,
69+
"stream_scope": "all",
70+
"primary_fixture": "sinners-2025",
71+
"regression_fixtures": ["interstellar", "mon-ninja-et-moi-3", "breaking-bad-s01e01", "revenant-s01e01", "jujutsu-kaisen-s01e01", "mushoku-tensei-s01e01"],
72+
"publication_requires_fresh_reader_proof": true
73+
}
11974
}

.github/workflows/brain-learning-lab.yml

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ jobs:
2727
timeout-minutes: 55
2828
permissions:
2929
contents: read
30-
actions: read
3130
steps:
3231
- name: Checkout trusted production baseline with history
3332
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
@@ -69,20 +68,6 @@ jobs:
6968
fi
7069
node -e "const x=require('./brain-learning-input/previous.json'); if(x.productionWritesAllowed===true||x.publicationAllowed===true) process.exit(1)"
7170
72-
- name: Import latest official native-client feedback when available
73-
env:
74-
GH_TOKEN: ${{ github.token }}
75-
shell: bash
76-
run: |
77-
set -euo pipefail
78-
mkdir -p brain-learning-input/native
79-
RUN_ID="$(gh run list --workflow native-corpus-device-lab.yml --branch main --limit 20 --json databaseId,status --jq '[.[] | select(.status=="completed")][0].databaseId // empty' || true)"
80-
if [ -n "$RUN_ID" ]; then
81-
gh run download "$RUN_ID" --name "native-corpus-engine-summary-$RUN_ID" --dir brain-learning-input/native || true
82-
fi
83-
[ -f brain-learning-input/native/native-corpus-summary.json ] || printf '{}\n' > brain-learning-input/native/native-corpus-summary.json
84-
[ -f brain-learning-input/native/provider-portfolio.json ] || printf '{}\n' > brain-learning-input/native/provider-portfolio.json
85-
8671
- name: Materialize historical 5.20.63 audit anchor from Git history
8772
shell: bash
8873
run: |
@@ -149,14 +134,20 @@ jobs:
149134
--repair-report brain-sandbox/health-output/repair-report.json \
150135
--historical-training brain-sandbox/historical-training.json \
151136
--previous-state brain-learning-input/previous.json \
152-
--native-summary brain-learning-input/native/native-corpus-summary.json \
153-
--provider-portfolio brain-learning-input/native/provider-portfolio.json \
154137
--overrides provider-overrides.json
155138
node engine_v2/tests/repair-brain.test.mjs
156139
node engine_v2/tests/recipe-memory.test.mjs
157140
node engine_v2/tests/learning-lab-memory.test.mjs
158141
python -m py_compile scripts/run_brain_learning_sandbox.py scripts/build_brain_repair_proposal.py
159142
node -e "const x=require('./brain-learning-output/latest.json'); if(x.productionWritesAllowed!==false||x.publicationAllowed!==false||x.sandboxExecutedProviders!==true) process.exit(1)"
143+
node - <<'NODE'
144+
const fs=require('fs');
145+
const previous=JSON.parse(fs.readFileSync('brain-learning-input/previous.json','utf8'));
146+
const next=JSON.parse(fs.readFileSync('brain-learning-output/latest.json','utf8'));
147+
if (previous.nativeReaderRepairMemory && JSON.stringify(next.nativeReaderRepairMemory)!==JSON.stringify(previous.nativeReaderRepairMemory)) {
148+
throw new Error('native reader repair memory was not preserved across Brain sandbox learning');
149+
}
150+
NODE
160151
if grep -Eiq 'https?://|authorization[=:]|cookie[=:]|token[=:]' brain-learning-output/latest.json; then
161152
echo 'persistent Brain state contains forbidden raw endpoint/credential material' >&2
162153
exit 1
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
name: Canonical media type and native evidence gate
2+
3+
on:
4+
pull_request:
5+
branches: [main]
6+
paths:
7+
- "provider_catalog.json"
8+
- "manifest.json"
9+
- "vf/manifest.json"
10+
- "package.json"
11+
- "package-lock.json"
12+
- ".github/triggers/nuvio-client-lab.json"
13+
- "engine_v2/src/contracts.mjs"
14+
- "engine_v2/tests/contracts.test.mjs"
15+
- "engine_v2/tests/native-reader-diagnosis.test.mjs"
16+
- "engine_v2/tests/learning-lab-memory.test.mjs"
17+
- "engine_v2/scripts/diagnose-native-reader.mjs"
18+
- "engine_v2/scripts/diagnose-native-media-capabilities.mjs"
19+
- "engine_v2/scripts/learning-lab.mjs"
20+
- "scripts/prepare_native_corpus_validation.py"
21+
- "scripts/native_player_diagnostics_codegen.py"
22+
- "scripts/augment_native_corpus_request_contract.py"
23+
- "scripts/augment_native_provider_loading.py"
24+
- "scripts/prepare_native_candidate_repository.py"
25+
- "scripts/resolve_native_repository.sh"
26+
- "scripts/native_evidence_completeness.cjs"
27+
- "scripts/analyze_native_corpus_collection.cjs"
28+
- "scripts/analyze_native_corpus_results.cjs"
29+
- "scripts/analyze_native_media_type_capabilities.cjs"
30+
- "scripts/gate_native_reader_result.cjs"
31+
- "scripts/gate_native_reader_coverage.cjs"
32+
- "scripts/instrument_native_client_evidence.py"
33+
- "scripts/instrument_native_repository_http_evidence.py"
34+
- "scripts/instrument_native_desktop_evidence.py"
35+
- "scripts/capture_native_device_frontend.sh"
36+
- "scripts/watch_native_device_frontend.sh"
37+
- "scripts/augment_native_desktop_player.py"
38+
- "scripts/complete_native_desktop_frontend_phases.py"
39+
- "scripts/run_native_corpus_tv_suite.sh"
40+
- "scripts/run_native_corpus_mobile_suite.sh"
41+
- "scripts/run_native_corpus_desktop_suite.sh"
42+
- "scripts/merge_native_reader_repair_learning.py"
43+
- ".github/workflows/native-android-route-reader.yml"
44+
- ".github/workflows/native-desktop-reader-acceptance.yml"
45+
- ".github/workflows/native-reader-learning-sync.yml"
46+
- ".github/workflows/brain-learning-lab.yml"
47+
- "tests/canonical_media_types_test.py"
48+
- "tests/native_evidence_contract_test.py"
49+
- "tests/native_evidence_codegen_pipeline_test.py"
50+
- "tests/native_repository_cache_contract_test.py"
51+
- "tests/native_repository_http_instrumentation_test.py"
52+
- "tests/native_media_type_capability_test.py"
53+
- "tests/native_reader_learning_memory_test.py"
54+
- ".github/workflows/canonical-media-types.yml"
55+
workflow_dispatch:
56+
57+
permissions:
58+
contents: read
59+
60+
concurrency:
61+
group: canonical-media-types-${{ github.event.pull_request.number || github.ref }}
62+
cancel-in-progress: true
63+
64+
jobs:
65+
canonical-media-types:
66+
runs-on: ubuntu-latest
67+
timeout-minutes: 15
68+
steps:
69+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
70+
with: {persist-credentials: false}
71+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
72+
with: {node-version: "24", package-manager-cache: false}
73+
- name: Install exact dependency tree
74+
run: npm ci --ignore-scripts --no-audit --no-fund
75+
- name: Audit non-optional production dependencies
76+
run: npm audit --audit-level=high --omit=optional
77+
- name: Verify upgraded runtime imports
78+
run: node -e "require('axios'); require('cheerio'); console.log('dependency imports ok')"
79+
- name: Validate canonical catalog and manifest projections
80+
run: python3 tests/canonical_media_types_test.py
81+
- name: Validate Core alias boundary
82+
run: node engine_v2/tests/contracts.test.mjs
83+
- name: Validate full native evidence architecture
84+
run: python3 tests/native_evidence_contract_test.py
85+
- name: Execute native evidence Kotlin codegen pipeline
86+
run: python3 tests/native_evidence_codegen_pipeline_test.py
87+
- name: Validate repository HTTP instrumentation contracts
88+
run: python3 tests/native_repository_http_instrumentation_test.py
89+
- name: Validate persistent native repository cache safety
90+
run: python3 tests/native_repository_cache_contract_test.py
91+
- name: Validate repository and reader Brain diagnosis
92+
run: node engine_v2/tests/native-reader-diagnosis.test.mjs
93+
- name: Validate native reader repair-memory merge
94+
run: python3 tests/native_reader_learning_memory_test.py
95+
- name: Validate Brain cross-day reader-memory preservation
96+
run: node engine_v2/tests/learning-lab-memory.test.mjs
97+
- name: Validate non-blocking tv/anime capability learning
98+
run: python3 tests/native_media_type_capability_test.py

.github/workflows/dependency-gate.yml

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)