Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
60b66b6
docs(harbour): reject cross-model repair experiment
zedarvates Aug 24, 2026
ee3b4eb
docs(harbour): record fail-closed A06 reproduction
zedarvates Aug 24, 2026
1cdcb1b
docs(harbour): record blocked third-model probe
zedarvates Aug 25, 2026
a3ab133
feat(video-validation): add semantic prevalidator package
zedarvates Aug 27, 2026
43ecead
feat(video-validation): add provider-agnostic semantic prevalidator
zedarvates Aug 27, 2026
a509db5
test(video-validation): cover semantic prevalidator routing
zedarvates Aug 27, 2026
ce6663b
feat(video-routing): add deterministic multi-subject strategy router
zedarvates Aug 27, 2026
4b54ab0
feat(video-routing): expose multi-subject routing primitives
zedarvates Aug 27, 2026
7d438ee
test(video-routing): cover multi-subject strategy decisions
zedarvates Aug 27, 2026
4202d3b
docs(harbour): record default-model corpus regression
zedarvates Aug 27, 2026
b8c8cd5
feat(video-routing): adapt existing shot specs to routing inputs
zedarvates Aug 27, 2026
c946da6
test(video-routing): cover shot-spec adapter
zedarvates Aug 27, 2026
1cf11e4
fix(video-routing): fail closed on non-boolean contact metadata
zedarvates Aug 27, 2026
96eaf1f
feat(video-routing): export shot-spec routing adapter
zedarvates Aug 27, 2026
1eed516
test(video-routing): reject ambiguous contact metadata
zedarvates Aug 27, 2026
2ee3bee
docs(harbour): record Gemma corpus rerun
zedarvates Aug 27, 2026
718eaa5
test(harbour): refine privacy-safe acceptance failures
zedarvates Aug 28, 2026
03c2c54
docs(harbour): record Anna draft revision 10
zedarvates Aug 28, 2026
76965d0
docs(harbour): refresh owner handoff and grants evidence
zedarvates Aug 28, 2026
cdaf4c0
test(harbour): run browser smokes sequentially
zedarvates Aug 28, 2026
13adb02
fix(harbour): preserve states in forced colours
zedarvates Aug 28, 2026
96df0e1
docs(harbour): record Anna draft revision 11
zedarvates Aug 28, 2026
17b7095
docs(harbour): refresh revision 11 demo evidence
zedarvates Aug 28, 2026
bef958f
fix(harbour): make repair prompt schema-complete
zedarvates Aug 29, 2026
234987a
test(harbour): lock schema-complete repair contract
zedarvates Aug 29, 2026
b4a41b7
docs(harbour): prepare Anna media requirements request
zedarvates Aug 29, 2026
291ceb4
Merge remote-tracking branch 'github/agent/storycore-harbour-bootstra…
zedarvates Aug 29, 2026
8847853
docs(harbour): record Anna draft revision 12
zedarvates Aug 29, 2026
5ce095e
feat(harbour): prepare validated Anna marketplace logo
zedarvates Aug 29, 2026
104a149
docs(harbour): record working-draft install path
zedarvates Aug 29, 2026
8cc3e87
docs(harbour): capture Anna manifest credential blocker
zedarvates Aug 29, 2026
67944e4
docs(harbour): close Anna manifest read blocker
zedarvates Aug 29, 2026
fa7984c
docs(harbour): update manifest reauthentication runbook
zedarvates Aug 29, 2026
3800320
docs(harbour): diagnose dev-install permission mismatch
zedarvates Aug 29, 2026
07897e0
feat(game-bridge): add src/game_bridge/__init__.py
zedarvates Aug 29, 2026
0854007
feat(game-bridge): add src/game_bridge/__main__.py
zedarvates Aug 29, 2026
06641c2
feat(game-bridge): add src/game_bridge/contract.py
zedarvates Aug 29, 2026
4566168
feat(game-bridge): add tests/game_bridge/test_contract.py
zedarvates Aug 29, 2026
4bd76ac
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/REA…
zedarvates Aug 29, 2026
238d011
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/sto…
zedarvates Aug 29, 2026
328fdb8
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/god…
zedarvates Aug 29, 2026
0e3bef1
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/god…
zedarvates Aug 29, 2026
fd07c88
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/god…
zedarvates Aug 29, 2026
f515a49
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/god…
zedarvates Aug 29, 2026
62a9fe4
feat(game-bridge): add fixtures/storycore-game/coinfall-chronicle/god…
zedarvates Aug 29, 2026
e97aec1
fix(game-bridge): constrain CLI paths and simplify validation
zedarvates Aug 30, 2026
06c5ef8
test(game-bridge): update tests/game_bridge/test_contract.py
zedarvates Aug 30, 2026
a87a37b
test(game-bridge): update fixtures/storycore-game/coinfall-chronicle/…
zedarvates Aug 30, 2026
ba62afd
ci: apply scoped PR44 path-safety fix
zedarvates Aug 30, 2026
3a44275
fix(game-fixture): satisfy strict Godot typing
zedarvates Aug 30, 2026
7639d6b
test(game-fixture): record verified Godot smoke in fixtures/storycore…
zedarvates Aug 30, 2026
ac53f62
test(game-fixture): record verified Godot smoke in tests/game_bridge/…
zedarvates Aug 30, 2026
6beffaf
test(game-fixture): add fixtures/storycore-game/coinfall-chronicle/go…
zedarvates Aug 30, 2026
129ae26
test(game-fixture): add fixtures/storycore-game/coinfall-chronicle/go…
zedarvates Aug 30, 2026
ce1abc6
ci: make scoped PR44 patch resilient
zedarvates Aug 30, 2026
7f44e7d
ci: rerun scoped PR44 security patch
zedarvates Aug 30, 2026
7f4100d
chore(ci): remove failed one-shot PR44 patch workflow
zedarvates Aug 30, 2026
6094fde
chore(ci): remove redundant one-shot PR44 patch workflow v2
zedarvates Aug 30, 2026
05fed06
ci: apply validated PR44 security patch v3
zedarvates Aug 30, 2026
cd10272
fix(game-bridge): harden CLI workspace paths
github-actions[bot] Aug 30, 2026
900e687
ci: remove one-shot PR44 security patch
zedarvates Aug 30, 2026
f6c1706
fix(game-bridge): close final symlink path boundary
zedarvates Aug 30, 2026
8c834d9
test(game-bridge): expose all CLI path regressions
zedarvates Aug 30, 2026
7de191c
test(game-bridge): isolate exception invocations for Sonar
zedarvates Aug 30, 2026
d0e2d03
docs(game-bridge): explain no-follow output protection
zedarvates Aug 30, 2026
0b76c86
docs(harbour): reconcile Anna draft-install guidance
zedarvates Aug 30, 2026
e384c7c
fix(harbour): confine marketplace logo renderer paths
zedarvates Aug 30, 2026
0d8d1de
fix(harbour): correct marketplace renderer imports
zedarvates Aug 30, 2026
6118b20
fix(harbour): confine marketplace logo validation path
zedarvates Aug 30, 2026
5df61e2
test(harbour): lock marketplace logo file contract
zedarvates Aug 30, 2026
ab63ce5
docs(harbour): record bounded Sonar security remediation
zedarvates Aug 30, 2026
9e80b54
docs(harbour): record suspected upstream Sonar autoscan failure
zedarvates Aug 30, 2026
6100dd9
chore(license): align package metadata with MIT
zedarvates Aug 30, 2026
09ef8fe
chore(license): align root lockfile metadata with MIT
zedarvates Aug 30, 2026
4334cf5
docs(harbour): close Sonar gate after clean analysis
zedarvates Aug 30, 2026
b4ae96a
perf(video-validation): cache semantic score separately from defect v…
zedarvates Aug 30, 2026
a5e74f5
test(video-validation): verify semantic score cache and non-finite fa…
zedarvates Aug 30, 2026
00abcea
fix(video-routing): reject contradictory subject counts
zedarvates Aug 30, 2026
33d8346
test(video-routing): cover contradictory counts and non-finite scores
zedarvates Aug 30, 2026
7f2e61e
ci: retrigger Sonar analysis for PR42
zedarvates Aug 30, 2026
49f2140
ci: remove temporary Sonar retry marker
zedarvates Aug 30, 2026
875a2dc
docs(harbour): record post-repair Gemma corpus
zedarvates Aug 31, 2026
ebf525a
docs(harbour): reject insufficient JSON punctuation recovery
zedarvates Aug 31, 2026
e076230
docs(harbour): map Anna structured-output boundary
zedarvates Sep 1, 2026
595d6f8
ci(video-validation): add targeted semantic prevalidator gate
zedarvates Sep 1, 2026
c28afbf
ci(video-validation): run one-shot semantic proof
zedarvates Sep 1, 2026
2f29c33
ci(video-validation): avoid broken submodule checkout
zedarvates Sep 1, 2026
309090f
ci(video-validation): rerun proof without checkout
zedarvates Sep 1, 2026
f6c9274
ci(video-validation): minimize one-shot semantic proof
zedarvates Sep 1, 2026
1a01b01
ci(video-validation): remove one-shot proof workflow
zedarvates Sep 1, 2026
e4ee835
ci: add minimal repository checkout proof
zedarvates Sep 2, 2026
a3dc48a
fix(ci): remove stale GemReward gitlink
zedarvates Sep 2, 2026
88bd01e
chore(deps): update undici and js-yaml security patches
dependabot[bot] Sep 3, 2026
65debe8
chore(deps-dev): bump the npm_and_yarn group across 4 directories wit…
dependabot[bot] Sep 3, 2026
c9c3fc7
docs(harbour): refresh Anna CLI 0.1.51 boundaries
zedarvates Sep 5, 2026
4146f43
docs(harbour): record Anna support escalation
zedarvates Sep 5, 2026
17e0134
Merge pull request #51 from zedarvates/dependabot/npm_and_yarn/npm_an…
zedarvates Sep 8, 2026
6f04c47
chore(deps): bump the npm_and_yarn group across 3 directories with 3 …
dependabot[bot] Sep 8, 2026
32dd839
docs(roadmap): plan structural storyboards and physical consistency
zedarvates Sep 10, 2026
5b6c83b
Merge pull request #52 from zedarvates/dependabot/npm_and_yarn/npm_an…
zedarvates Sep 12, 2026
0046d93
chore(deps): bump the npm_and_yarn group across 2 directories with 3 …
dependabot[bot] Sep 12, 2026
215fe13
fix(deps): update sharp lockfile to 0.35.4
zedarvates Sep 12, 2026
739b4c5
fix(deps): keep security updates on aligned Vitest 4.1.11
zedarvates Sep 12, 2026
8e0c662
docs(audio): define provider-neutral music planning layer
zedarvates Sep 13, 2026
ef37f79
feat(audio): add MusicPlan v1 interchange schema
zedarvates Sep 13, 2026
c026a4e
feat(audio): add model-free MusicPlan invariant validator
zedarvates Sep 13, 2026
da11709
test(audio): add full MusicPlan fixture
zedarvates Sep 13, 2026
f7dbfc0
test(audio): add guided MusicPlan fixture
zedarvates Sep 13, 2026
f9754b7
test(audio): add free MusicPlan fixture
zedarvates Sep 13, 2026
d492369
test(audio): validate MusicPlan invariants and licence boundary
zedarvates Sep 13, 2026
e9aa207
ci(audio): add isolated MusicPlan contract proof
zedarvates Sep 13, 2026
18a54be
feat(audio): add deterministic mock music provider contract
zedarvates Sep 13, 2026
8d8b86b
test(audio): prove explicit provider degradation contract
zedarvates Sep 13, 2026
ce7d71b
ci(audio): cover mock provider contract
zedarvates Sep 13, 2026
1151149
docs(audio): record mock provider proof boundary
zedarvates Sep 13, 2026
6c37dc3
ci(audio): include MusicPlan contract documentation in proof scope
zedarvates Sep 13, 2026
115ee32
fix(audio): compose JSON Schema validation and recursive execution de…
zedarvates Sep 13, 2026
1e41f9b
test(audio): cover schema and nested execution degradation
zedarvates Sep 13, 2026
d3b9bfe
ci(audio): validate Draft 2020-12 MusicPlan contract
zedarvates Sep 13, 2026
197f36b
feat(audio): add portable provider handoff envelope
zedarvates Sep 13, 2026
5cbaad5
test(audio): prove portable handoff stays non-activating
zedarvates Sep 13, 2026
079e063
test(audio): add deterministic MusicPlan mutation probe
zedarvates Sep 13, 2026
ea6867e
ci(audio): run controlled MusicPlan negative mutation probe
zedarvates Sep 13, 2026
401abcc
docs(audio): align MusicPlan proof and handoff status
zedarvates Sep 13, 2026
189d3d1
fix(ci): run MusicPlan mutation probe as a module
zedarvates Sep 13, 2026
d7af6f5
test(audio): add private holdout evaluator protocol
zedarvates Sep 13, 2026
385a2ea
ci(audio): verify private holdout evaluator protocol
zedarvates Sep 13, 2026
552a39f
fix(asset-creator): prepare Trellis templates before image upload
zedarvates Sep 13, 2026
d5bdfc5
fix(asset-creator): handle ComfyUI timeouts and terminal status
zedarvates Sep 17, 2026
1b8074e
Merge pull request #47 from zedarvates/codex/align-npm-license-mit
zedarvates Sep 21, 2026
aead4f3
Merge pull request #60 from zedarvates/fix/asset-creator-comfyui-wait
zedarvates Sep 21, 2026
6207147
Merge pull request #58 from zedarvates/fix/asset-creator-preflight-be…
zedarvates Sep 21, 2026
77507f6
Merge pull request #57 from zedarvates/feature/music-planning-contrac…
zedarvates Sep 21, 2026
4a422c5
Merge pull request #56 from zedarvates/fix/sharp-security-463
zedarvates Sep 21, 2026
271b1ef
Merge pull request #55 from zedarvates/dependabot/npm_and_yarn/npm_an…
zedarvates Sep 21, 2026
4ef2436
Merge pull request #54 from zedarvates/feature/scientific-transfer-20…
zedarvates Sep 21, 2026
830e28a
Merge pull request #49 from zedarvates/fix/remove-stale-gemreward-git…
zedarvates Sep 21, 2026
0cc9845
Merge pull request #44 from zedarvates/codex/storycore-game-contract-…
zedarvates Sep 21, 2026
4d237ea
Merge pull request #43 from zedarvates/codex/multi-subject-video-router
zedarvates Sep 21, 2026
37eb2f7
Merge pull request #37 from zedarvates/agent/storycore-harbour-bootstrap
zedarvates Sep 21, 2026
8bc44a4
merge main into codex/semantic-video-prevalidator: keep main exports,…
zedarvates Sep 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions .github/workflows/music-plan-contract.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: MusicPlan Contract

on:
pull_request:
branches: [main]
paths:
- "schemas/music-plan-v1.schema.json"
- "src/music_plan.py"
- "src/music_provider.py"
- "scripts/music_plan_mutation_probe.py"
- "scripts/music_plan_holdout_evaluator.py"
- "tests/test_music_plan.py"
- "tests/fixtures/music_plan/**"
- "docs/music-planning-layer-v1.md"
- ".github/workflows/music-plan-contract.yml"

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.12"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install focused validation dependencies
run: python -m pip install 'pytest>=8,<10' 'jsonschema>=4.23,<5'
- name: Compile model-free contracts
run: python -m py_compile src/music_plan.py src/music_provider.py scripts/music_plan_mutation_probe.py scripts/music_plan_holdout_evaluator.py
- name: Run MusicPlan contract tests
run: python -m pytest -q tests/test_music_plan.py
- name: Run controlled negative mutation probe
run: python -m scripts.music_plan_mutation_probe
- name: Verify private holdout evaluator protocol
run: |
python - <<'PY'
import json
import subprocess
import sys
from pathlib import Path

plan = json.loads(Path('tests/fixtures/music_plan/full.json').read_text(encoding='utf-8'))
request = {"id": "public-protocol-smoke", "input": {"plan": plan, "expected_valid": True}}
r = subprocess.run(
[sys.executable, '-m', 'scripts.music_plan_holdout_evaluator'],
input=json.dumps(request), text=True, capture_output=True, check=True,
)
response = json.loads(r.stdout)
assert response == {"passed": True}, response
print('holdout evaluator protocol OK')
PY
- name: Verify Draft 2020-12 schema and reference fixtures
run: |
python - <<'PY'
import json
from pathlib import Path
from jsonschema import Draft202012Validator

schema_path = Path('schemas/music-plan-v1.schema.json')
schema = json.loads(schema_path.read_text(encoding='utf-8'))
Draft202012Validator.check_schema(schema)
validator = Draft202012Validator(schema)
for path in sorted(Path('tests/fixtures/music_plan').glob('*.json')):
data = json.loads(path.read_text(encoding='utf-8'))
validator.validate(data)
print(f'OK {path}')
PY
19 changes: 19 additions & 0 deletions .github/workflows/repository-checkout-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Repository Checkout CI

on:
pull_request:
paths:
- 'GemReward-Service-Repo'
- '.gitmodules'
- '.github/workflows/repository-checkout-ci.yml'
workflow_dispatch:

permissions:
contents: read

jobs:
checkout:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
36 changes: 36 additions & 0 deletions .github/workflows/semantic-prevalidator-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Semantic Prevalidator CI

on:
pull_request:
paths:
- 'src/video_validation/**'
- 'tests/test_semantic_prevalidator.py'
- '.github/workflows/semantic-prevalidator-ci.yml'
workflow_dispatch:

permissions:
contents: read

jobs:
semantic-prevalidator:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Materialize exact PR commit without git submodule cleanup
env:
REPOSITORY: ${{ github.repository }}
SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
set -euo pipefail
curl --fail --location --silent --show-error \
"https://codeload.github.com/${REPOSITORY}/tar.gz/${SHA}" \
| tar -xz --strip-components=1
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install targeted test dependency
run: python -m pip install --disable-pip-version-check pytest
- name: Compile targeted module
run: python -m compileall -q src/video_validation tests/test_semantic_prevalidator.py
- name: Run semantic prevalidator tests
run: python -m pytest -q tests/test_semantic_prevalidator.py
30 changes: 29 additions & 1 deletion FUTURE_ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,32 @@ A dynamic-residency optimization graduates only if it improves at least one usef

---
**Maintained by:** StoryCore-Engine Team
**Last Updated:** August 22, 2026
**Last Updated:** August 22, 2026

## 6. Scientific transfer: structural drawing and physical consistency (2026-09-10)

**Planned.** This work follows existing resource admission and render stability
gates; it does not enable a new generation workflow.

- [ ] Define a versioned storyboard input carrying strokes, contours, junctions, perspective constraints, coordinate frames, stable identities and provenance.
- [ ] Reuse Human Skills practice outputs and CogniARC structural critique; distinguish practiced trajectories from fitted reference curves.
- [ ] Compare unchanged, random-correction and targeted-correction storyboards on held-out compositions with equal action/render budgets.
- [ ] Measure junction/outline preservation, proportions, camera consistency and identity drift separately from visual style.
- [ ] Test bounded brush-style controls after structural quality passes, using [Procedural Brush Synthesis](https://users.cg.tuwien.ac.at/zsolnai/gfx/procedural-brush-synthesis-paper/) and [DiffVG](https://people.csail.mit.edu/tzumao/diffvg/) as individually sourced methods.
- [ ] Add offline physical-consistency fixtures for motion and contact only after numerical reference validation; compare persistent/constant-velocity predictions before introducing a learned predictor.

**First implementation:** a tiny synthetic storyboard fixture and validator for
strokes, frames and identities, reusing existing project schemas where possible.
No external assets, model weights or generation services are required for that
contract experiment.

**Acceptance:** reproducible improvement on reserved compositions, intact
identities and camera/geometry constraints, recorded failures and measured
resource use on stated hardware. Reference curve fitting alone is not evidence
of learned drawing skill; a physically plausible-looking clip is not a physics
validation.

Physical prerequisite:
[CogniARC's initial particle-neighbour reference and limits](https://github.com/zedarvates/cogniarc/blob/a4aac4a5f42e546c4a4ad777c508e4a1b0f0f136/experiments/particle_graph/README.md).
That implementation is separate from StoryCore and is not a calibrated water
simulator or a generation integration.
1 change: 0 additions & 1 deletion GemReward-Service-Repo
Submodule GemReward-Service-Repo deleted from 9219f1
107 changes: 107 additions & 0 deletions addons/official/storycore_asset_creator/COMFYUI_CLIENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Suivi des tâches ComfyUI

Le client Python existant reste le point d'accès HTTP de l'Asset Creator.
Cette correction n'ajoute aucun service externe, modèle ou abonnement.

## Deux défauts reproduits

Sur le commit `5b6c83bd26f60f7eb5e4da53f958f2d3b06edb4a`, avec des réponses
simulées et les sockets interdites :

- Une entrée d'historique contenant `status_str="error"`, `completed=false`
et des sorties partielles était renvoyée comme un résultat réussi.
- L'appel HTTP à `/history/{prompt_id}` ne recevait aucun `timeout`.
La lecture du client montre la même omission pour les autres appels,
sauf `/system_stats`.

## Comportement du client

| Situation | Résultat |
|---|---|
| `status.status_str == "success"` et `status.completed is True` | Retourne le dictionnaire `outputs`, même vide. |
| `status.status_str == "error"` | Lève `RuntimeError`, même avec des fichiers intermédiaires. |
| Ancien champ `error` au premier niveau | Lève `RuntimeError`. |
| Historique absent, statut inconnu ou incomplet | Continue le suivi jusqu'à son expiration. |
| Budget de suivi écoulé | `ComfyUIWaitTimeout`, avec `reason="wait_deadline"`. |
| `requests.exceptions.Timeout` pendant un GET de suivi | `ComfyUIWaitTimeout`, avec `reason="http_timeout"` et cause conservée. |
| Autre erreur HTTP ou réseau | Exception Requests transmise à l'appelant. |

`ComfyUIWaitTimeout` hérite de `TimeoutError` et expose `prompt_id`.
Le client ne supprime pas la tâche, ne l'annule pas et ne la soumet pas à
nouveau quand le suivi expire. Une expiration ne prouve pas que la tâche a
échoué ou qu'elle tourne encore ; son état doit être relu sur le serveur.

## Deux délais distincts

- `request_timeout=30.0` : délai Requests appliqué à tous les appels HTTP.
Le contrôle de disponibilité garde un plafond de 5 secondes.
- `wait_for_result(..., timeout=300.0, poll_interval=2.0)` : budget du suivi
et intervalle entre lectures. Le budget utilise une horloge monotone.
Avant chaque GET, le délai HTTP est limité au budget restant ; les pauses
sont également limitées. Le budget est revérifié au retour des GET et
après le callback avant de dormir.

Ces trois paramètres doivent être finis et strictement positifs.
`get_history` et `get_queue_status` acceptent aussi un `timeout` nommé pour
réduire leur délai HTTP, sans dépasser celui du client.

Le délai Requests concerne la connexion et l'inactivité de lecture. Il
ne garantit **pas** une durée totale stricte : plusieurs adresses réseau,
une réponse qui arrive lentement ou un callback bloquant peuvent dépasser
le budget. Aucun thread n'est abandonné pour simuler une telle garantie.
Voir la [documentation officielle Requests sur les délais](https://requests.readthedocs.io/en/latest/user/advanced/#timeouts).

## Reprendre le suivi

```python
from addons.official.storycore_asset_creator.src.comfyui_client import (
ComfyUIClient,
ComfyUIWaitTimeout,
)

client = ComfyUIClient.from_project_config(request_timeout=30.0)
# prompt_id est l'identifiant déjà renvoyé par queue_workflow et sauvegardé.
try:
outputs = client.wait_for_result(prompt_id, timeout=300.0)
except ComfyUIWaitTimeout as error:
prompt_id_a_reprendre = error.prompt_id
# Plus tard : client.wait_for_result(prompt_id_a_reprendre, timeout=300.0)
```

L'appelant doit sauvegarder l'identifiant dès l'acceptation. Cette correction
ne crée pas de stockage persistant de tâches et ne raccorde pas encore la
reprise à une interface MCP, CLI ou Blender.

Si le POST `/prompt` expire avant de renvoyer un identifiant, l'acceptation
reste incertaine. Le client laisse remonter l'exception Requests et n'ajoute
aucune relance automatique. Il faut vérifier la file du serveur avant de
décider d'une nouvelle soumission.

Les réponses des téléchargements sont fermées même en cas d'erreur.
Un téléchargement interrompu peut toujours laisser un fichier partiel :
la correction ne rend pas l'écriture atomique.

## Contrat et vérification

Contrat lu dans ComfyUI au commit
[`387f98aa2822f684b8597959a52a467d88cc4806`](https://github.com/Comfy-Org/ComfyUI/commit/387f98aa2822f684b8597959a52a467d88cc4806) :
[`execution.py`](https://github.com/Comfy-Org/ComfyUI/blob/387f98aa2822f684b8597959a52a467d88cc4806/execution.py#L1316-L1340)
décrit le statut enregistré ;
[`main.py`](https://github.com/Comfy-Org/ComfyUI/blob/387f98aa2822f684b8597959a52a467d88cc4806/main.py#L367-L372)
le renseigne à la fin du traitement. Le client ne déduit pas la réussite
de la seule présence d'un fichier.

Depuis la racine du dépôt, avec `requests` installé :

```bash
python -m unittest discover -s tests/asset_creator -p test_comfyui_client.py -v
```

Les 18 tests utilisent des réponses HTTP simulées et une horloge contrôlée.
La création de sockets y est interdite. Ils couvrent les statuts terminaux,
les sorties partielles, les délais, la reprise et les ressources HTTP.
Vérification locale effectuée avec Python 3.12.14 et Requests 2.34.2.

Il ne s'agit pas d'un test sur un serveur ComfyUI, Blender ou un GPU.
Les recettes Trellis2 locales, leurs extensions et le format API réellement
soumis restent à vérifier dans l'environnement d'exécution.
35 changes: 33 additions & 2 deletions addons/official/storycore_asset_creator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ Le port ComfyUI **n'est jamais supposé** — il varie selon l'édition install
3. Variables d'environnement ← STORYCORE_COMFYUI_HOST / STORYCORE_COMFYUI_PORT
```

### Délais et reprise du suivi

Le client distingue le délai HTTP du budget d'attente de la génération.
Une expiration du suivi conserve l'identifiant du prompt ; elle ne l'annule
pas. Voir [le contrat du client et les tests](COMFYUI_CLIENT.md).

### Override via variables d'environnement

```bash
Expand Down Expand Up @@ -91,12 +97,37 @@ workflows/
trellis2_lowvram.json ← workflow Low VRAM (recommandé)
trellis2_standard.json ← workflow qualité standard
trellis2_lowpoly.json ← workflow low poly
trellis2_trunk_only.json ← workflow tronc seul (inclus)
trellis2_trunk_only.json ← workflow tronc seul (à fournir)
```

> Les workflows `PixelArtistry_Trellis2_*.json` de votre dossier `Downloads/3s/`
> doivent être copiés ici et renommés selon la convention ci-dessus.

Ces quatre fichiers ne sont pas inclus dans l'arbre du dépôt examiné pour cette
correction. Un nom de preset déclaré ne garantit pas qu'une recette est installée.

Le pipeline prépare désormais la recette **avant tout appel client et tout upload**.
Une image source absente, un preset inconnu, un fichier JSON absent ou illisible,
une structure d'éditeur incompatible ou un nœud d'image non modifiable provoquent
une erreur locale. Un preset inconnu ne sélectionne plus silencieusement `lowvram`.
Le template préparé est conservé en mémoire ; après upload, seul son nom d'image
est remplacé par celui renvoyé par ComfyUI, sans relecture de la recette sur disque.

**Portée de cette validation :** le chargeur manipule encore les champs d'éditeur
`nodes` / `widgets_values`. Cette correction ne convertit pas le template au format
API de `/prompt` et ne prouve pas que le graphe est exécutable. La conversion, la
disponibilité des nœuds/modèles, les délais HTTP et un essai réel restent à vérifier
à partir des workflows effectivement utilisés dans Asset Factory / ComfyUI.

Tests locaux sur recettes synthétiques, depuis la racine du dépôt :

```bash
python -m unittest discover -s tests/asset_creator -v
```

Ils ne nécessitent ni Blender, ni serveur ComfyUI, ni GPU. Voir leur
[portée précise](../../../tests/asset_creator/README.md).

### 3. Installation de l'addon

```
Expand Down Expand Up @@ -181,7 +212,7 @@ storycore_asset_creator/
├── trellis2_lowvram.json ← Workflow ComfyUI (à copier)
├── trellis2_standard.json ← Workflow ComfyUI (à copier)
├── trellis2_lowpoly.json ← Workflow ComfyUI (à copier)
└── trellis2_trunk_only.json ← Workflow tronc seul (placeholder inclus)
└── trellis2_trunk_only.json ← Workflow tronc seul (à copier)
```

---
Expand Down
Loading
Loading