| """Emit the prompt pack's worked example FROM the showcase workflow. |
| |
| Typing the example out by hand would give the pack a third copy of the same |
| plan, free to drift from the one that is actually validated. This reads the |
| shipped workflow, so the example and the example workflow are the same bytes. |
| """ |
| import io |
| import json |
| import os |
|
|
| HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| WF = os.path.join(HERE, "workflows", "HandTieClips_Showcase.json") |
| OUT = os.path.join(HERE, "prompt_pack", "EXAMPLE_6_HOP.md") |
|
|
| wf = json.load(io.open(WF, encoding="utf-8")) |
| |
| |
| CHAIN_TYPES = ("HandTieClips", "HandTieClips") |
| chain = next(n for n in wf["nodes"] if n["type"] in CHAIN_TYPES) |
| names = [i["name"] for i in chain["inputs"] if i.get("widget")] |
| names.insert(names.index("seed") + 1, "control_after_generate") |
| wv = dict(zip(names, chain["widgets_values"])) |
|
|
| shot = json.loads(wv["shot_plan"]) |
| ref = json.loads(wv["ref_plan"]) |
|
|
| |
| rows = [] |
| for i, s in enumerate(shot["shots"], start=1): |
| active = [r["tag"] for r in ref["refs"] |
| if r.get("shots") is None or i in r["shots"]] |
| rows.append("| %d | %s | %s |" % ( |
| i, s["id"], ", ".join("@" + t for t in active) or "**none**")) |
|
|
| body = """# Worked example: six hops, three pictures |
| |
| This is the plan inside `workflows/HandTieClips_Showcase.json`, reproduced here so |
| it can be shown to a model as an example of the shape and the reasoning. It is |
| generated from that workflow, so the two cannot drift apart. |
| |
| The scene: a cook in a kitchen speaks a line, crosses the room, leaves through a |
| doorway into a hallway the register has no picture of, speaks again there, and |
| comes back. |
| |
| ## What each hop is for |
| |
| | hop | id | references active | |
| |---|---|---| |
| %s |
| |
| Three things in that table are the whole point: |
| |
| - **Hop 3** carries the kitchen while she is leaving it, and hop 4 does not. |
| The hallway is a space no reference describes, so the model must invent it — |
| and a kitchen plate riding hop 4 would drag her back into the kitchen. |
| - **Hop 4** re-asserts the face. Entering an unseen space is where identity |
| drift starts, and re-asserting there is cheaper than recovering on 5 and 6. |
| - **Hop 5 has no references at all.** Identity, wardrobe and voice ride on the |
| frame pin plus `subjects.1.locked` and `.context` alone. If she is still the |
| same person in the same apron with the same voice, the register works. |
| |
| Note also that the dialogue lands on hops 1 and 5 — the establishing shot and |
| the one with no pictures — and that both use single quotes. |
| |
| ## shot_plan |
| |
| ```json |
| %s |
| ``` |
| |
| ## ref_plan |
| |
| ```json |
| %s |
| ``` |
| """ % ("\n".join(rows), |
| json.dumps(shot, indent=2, ensure_ascii=False), |
| json.dumps(ref, indent=2, ensure_ascii=False)) |
|
|
| io.open(OUT, "w", encoding="utf-8", newline="\n").write(body) |
| print("wrote %s (%d bytes)" % (OUT, len(body))) |
| non_ascii = [c for c in body if ord(c) > 127] |
| print("non-ASCII in output:", sorted(set(non_ascii)) or "none") |
|
|