<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Whispart</title>
    <description>The latest articles on DEV Community by Whispart (whispart).</description>
    <link>https://dev.to/whispart</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14675%2Fbf3c83e3-46eb-4bbc-88d2-48053621bbd6.png</url>
      <title>DEV Community: Whispart</title>
      <link>https://dev.to/whispart</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/whispart"/>
    <language>en</language>
    <item>
      <title>Count Reports, Studies, and Outcomes Separately in an AI-Art Evidence Dataset</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 21 Oct 2026 09:06:32 +0000</pubDate>
      <link>https://dev.to/whispart/count-reports-studies-and-outcomes-separately-in-an-ai-art-evidence-dataset-1g5i</link>
      <guid>https://dev.to/whispart/count-reports-studies-and-outcomes-separately-in-an-ai-art-evidence-dataset-1g5i</guid>
      <description>&lt;p&gt;A dataset can contain 46 outcome records without containing 46 experiments. If your dashboard calls both “studies,” the code can execute perfectly while the conclusion is wrong.&lt;/p&gt;

&lt;p&gt;Whispart's review manuscript on AI-art valuation provides a concrete example: 12 selected reports contain 25 study units and 46 outcome-family records. The useful engineering problem is preserving those units all the way from extraction to display.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Context and disclosure: Whispart develops selected GAN images into physical wall art. This article and the research workflow used substantive AI assistance. The manuscript is not peer reviewed; it is a purposive methodological review, not an exhaustive database of the field.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Keep the hierarchy in the data&lt;/h2&gt;

&lt;p&gt;In the downloadable evidence.json, reports contain studies, and studies contain outcomes. A report has a report_id; a study has a study_id and source_locator; each outcome has an outcome_id, construct, response_format and financial_consequence. That structure preserves the connection between a count and the passage it represents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57d6ddjpvabh53zf3k9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57d6ddjpvabh53zf3k9q.png" alt="A flowchart separating appraisal, noncurrency economic ratings, sale-price judgments, personal stated willingness to pay, purchase intention and consequential bids." width="800" height="984"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1 from Measuring Value in AI Generated Visual Art (20 October 2026 manuscript, not peer reviewed): classify the response format, perspective and financial consequences. This is a research diagram, not a GAN artwork.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The diagram separates the response task before counting it. “Worth,” a predicted selling price and a consequential bid should not be collapsed into one numeric value field. The response unit, perspective and payment rule carry meaning that a label alone cannot supply.&lt;/p&gt;

&lt;h2&gt;Reproduce a small part of the evidence map&lt;/h2&gt;

&lt;p&gt;Download the evidence archive from the Research page, extract it, and run this Python 3 snippet beside evidence.json. It uses the standard library and reads the supplied classifications; it does not infer classifications from the paper titles.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from collections import defaultdict
from pathlib import Path
import json

reports = json.loads(Path("evidence.json").read_text(encoding="utf-8"))
studies_by_family = defaultdict(set)
reports_by_family = defaultdict(set)
report_ids, study_ids, outcome_ids = set(), set(), set()

for report in reports:
    rid = report["report_id"]
    if rid in report_ids:
        raise ValueError(f"Duplicate report: {rid}")
    report_ids.add(rid)
    for study in report["studies"]:
        sid = study["study_id"]
        if sid in study_ids:
            raise ValueError(f"Duplicate study: {sid}")
        study_ids.add(sid)
        for outcome in study["outcomes"]:
            oid = outcome["outcome_id"]
            if oid in outcome_ids:
                raise ValueError(f"Duplicate outcome: {oid}")
            outcome_ids.add(oid)
            family = outcome["construct"]
            studies_by_family[family].add(sid)
            reports_by_family[family].add(rid)

print(len(report_ids), len(study_ids), len(outcome_ids))
key = "auction_bid"
print(len(studies_by_family[key]), len(reports_by_family[key]))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For the 20 October 2026 manuscript dataset, the output is &lt;code&gt;12 25 46&lt;/code&gt;, followed by &lt;code&gt;2 1&lt;/code&gt;. Two auction study units belong to one report. That second line is why a distinct report count matters: more study units do not necessarily mean more independent research programs.&lt;/p&gt;

&lt;h2&gt;Make the display preserve the distinction&lt;/h2&gt;

&lt;p&gt;Use explicit headings such as “Study units containing this family” and “Reports containing this family.” Families overlap, so their counts must not be stacked as mutually exclusive shares of 25. The records are measurement families, not a count of independent dependent variables or a pooled effect estimate.&lt;/p&gt;

&lt;p&gt;The complete archive also includes reproduce_counts.py, which checks identifiers, JSON/CSV agreement and coverage scenarios. The short snippet above only demonstrates the counting units; it is not a substitute for those checks or for reading the original source passages.&lt;/p&gt;

&lt;h2&gt;Keep the object separate from the response&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9cthdhznchwvgc7vdm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9cthdhznchwvgc7vdm2.png" alt="A gnarled, partly broken tree above a narrow pale stream and russet ground, presented in a black frame with a pale mat." width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Tree That Stayed — Whispart supplied framed-product presentation; GAN-generated artwork. Presentation image, not an installation photograph.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs3v99w0yho058i7vwonq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs3v99w0yho058i7vwonq.png" alt="Small ochre spires at the lower left of a vast cloud-filled sky and gray-green plain, in a black frame with a pale mat." width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where Silence Is Kept — Whispart supplied framed-product presentation; GAN-generated artwork. Presentation image, not an installation photograph.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These supplied product presentations of The Tree That Stayed and Where Silence Is Kept illustrate our studio context. They are not experimental stimuli from the reviewed reports. A response to a digital image and a decision about a specified physical framed work concern different objects and conditions. Store the object description and acquisition rule explicitly rather than assuming a shared artwork name makes the records comparable.&lt;/p&gt;

&lt;p&gt;That distinction also applies to publishing metrics: page views, reactions, product visits and completed orders need separate event definitions. None is automatically evidence of the next. No conversion or pricing effect is estimated here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://whispart.com/blogs/research/measuring-value-in-ai-generated-visual-art?utm_source=dev&amp;amp;utm_medium=organic_social&amp;amp;utm_campaign=looking_and_valuing_20261021" rel="noopener noreferrer"&gt;Read the manuscript and download the evidence archive on Whispart Research&lt;/a&gt; to reproduce the counts and inspect the codebook. The classifications were prepared in one AI-assisted workflow without independent duplicate human extraction; computational consistency does not remove that limitation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1 is the existing manuscript diagram. The two artworks are GAN-generated and shown in supplied framed-product presentations, not installation photographs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>Keep Artwork Files and Room Mockups Separate in a Publishing Workflow</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Thu, 15 Oct 2026 02:35:57 +0000</pubDate>
      <link>https://dev.to/whispart/keep-artwork-files-and-room-mockups-separate-in-a-publishing-workflow-o60</link>
      <guid>https://dev.to/whispart/keep-artwork-files-and-room-mockups-separate-in-a-publishing-workflow-o60</guid>
      <description>&lt;p&gt;A publishing workflow can upload the correct file format and still communicate the wrong thing. A room preview and a complete artwork might both be PNGs, both belong to the same collection folder, and both contain the same image. They make different claims when placed in an article.&lt;/p&gt;

&lt;p&gt;That distinction matters at Whispart, where selected GAN creations become physical wall art and framed artworks. An artwork view lets a reader inspect the image. A digital room visualization lets them consider a possible presentation. If an automated publisher silently substitutes the second for the first, a useful preview can become a misleading stand-in for the work.&lt;/p&gt;

&lt;h2&gt;Start with the role, then resolve the file&lt;/h2&gt;

&lt;p&gt;One of our supplied artwork folders contains &lt;code&gt;original-upscaled.png&lt;/code&gt; and &lt;code&gt;scene-floating-wood.png&lt;/code&gt;. The names suggest different uses, but names alone are not evidence of origin. For this example, both files were visually inspected: one shows the complete artwork; the other shows it framed in a room. The supplied scene is treated as a digital visualization.&lt;/p&gt;

&lt;p&gt;A small explicit manifest makes that decision available to a publishing script. The selector below requires the intended role instead of choosing whichever file happens to sort first. Set &lt;code&gt;base_dir&lt;/code&gt; to the artwork folder before running it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from pathlib import Path

assets = {
    "artwork": {"path": "original-upscaled.png",
                "role": "gan_original"},
    "room": {"path": "scene-floating-wood.png",
             "role": "digital_visualization"},
}

def select_asset(key, required_role, base_dir):
    asset = assets[key]
    if asset["role"] != required_role:
        raise ValueError("Asset role does not match placement")
    path = Path(base_dir) / asset["path"]
    if not path.is_file():
        raise FileNotFoundError(path)
    return path

artwork_path = select_asset("artwork", "gan_original", base_dir)
# Raises before file lookup: the room must not become the artwork.
# select_asset("room", "gan_original", base_dir)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This example was exercised against the local folder: the artwork selection resolved to an existing file, and requesting the room image as a GAN original raised the expected error. It is a minimal selector, not a claim that the whole publishing workflow runs unattended.&lt;/p&gt;

&lt;h2&gt;A failed match should ask for a decision&lt;/h2&gt;

&lt;p&gt;Do not catch that error and fall back to the first PNG. The failure is useful information: either the requested placement is wrong, the manifest is wrong, or the requested asset is missing. Check the file and correct the relevant record. A fallback would erase exactly the distinction the manifest was introduced to preserve.&lt;/p&gt;

&lt;p&gt;A hash can establish that a later run has the same bytes you reviewed. It cannot establish that a room was physically built or that an image came straight from a model. Likewise, &lt;code&gt;original-upscaled&lt;/code&gt; identifies a supplied artwork file here; it does not prove raw model-output resolution. Keep those claims separate from file identity.&lt;/p&gt;

&lt;h2&gt;Carry the distinction into the published page&lt;/h2&gt;

&lt;p&gt;The publication record needs the selected path, role and caption. For a room study, a useful caption is: &lt;em&gt;Digital room visualization; not a photograph of a finished object or installation.&lt;/em&gt; The same label should survive the editor and appear beside the image. Hiding it in a local JSON file does not help the reader.&lt;/p&gt;

&lt;p&gt;Before marking a post complete, inspect the actual public page. Is the complete artwork present where the text discusses its details? Is the room study identified where it appears? Did uploading or rearranging modules reverse their order? A technically successful upload answers none of those questions by itself.&lt;/p&gt;

&lt;h2&gt;Why the reader benefits&lt;/h2&gt;

&lt;p&gt;For someone considering art for a wall, these two views answer different questions: what am I looking at, and how might I imagine it in a space? Keeping their roles explicit lets the presentation support that decision without presenting an illustration as physical evidence.&lt;/p&gt;

&lt;p&gt;The distinction is part of how we communicate Whispart's GAN-based wall artworks. If you would like to see the creative context behind the file examples, &lt;a href="https://whispart.com/?utm_source=dev&amp;amp;utm_medium=organic_social&amp;amp;utm_campaign=studio_20261015&amp;amp;utm_content=asset-roles" rel="noopener noreferrer"&gt;explore Whispart's artworks and studio approach&lt;/a&gt;. The same principle applies to other product workflows: asset selection should preserve the meaning of a view, as well as its pixels.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance and checked against the supplied files. The code is a small standalone example, with the two selector outcomes described above tested locally.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>A publishing timeout is not a failed post: keep an uncertainty state</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Tue, 13 Oct 2026 07:02:46 +0000</pubDate>
      <link>https://dev.to/whispart/a-publishing-timeout-is-not-a-failed-post-keep-an-uncertainty-state-259a</link>
      <guid>https://dev.to/whispart/a-publishing-timeout-is-not-a-failed-post-keep-an-uncertainty-state-259a</guid>
      <description>&lt;p&gt;A browser action can time out after the website has already accepted it. In a publishing workflow, treating that timeout as a failed post can turn a recovery attempt into a duplicate.&lt;/p&gt;

&lt;p&gt;This matters for Whispart, where GAN artworks become physical wall art and the same source material is adapted for several publishing platforms. A completed article is useful; two accidental copies of it are not.&lt;/p&gt;

&lt;h2&gt;A draft address gave us the wrong clue&lt;/h2&gt;

&lt;p&gt;During a recent browser-run Tumblr publication, the saved draft had one identifier and the published post had another. Opening an address based on the draft identifier returned a missing page. The public profile, however, contained the completed article at a different address.&lt;/p&gt;

&lt;p&gt;The recovery was to inspect the profile and verify the existing article, not create another post. The resulting &lt;a href="https://www.tumblr.com/whispart-art/830324268305874944/two-ways-a-gan-artwork-can-suggest-a-forest" rel="noopener noreferrer"&gt;forest study&lt;/a&gt; contains the two intended GAN artworks and their text. This is one observed case, not a claim that every platform changes identifiers on publication.&lt;/p&gt;

&lt;h2&gt;Give uncertainty its own state&lt;/h2&gt;

&lt;p&gt;Our local publishing helper keeps a ledger. It distinguishes a saved draft, an attempted submission, an unknown outcome, and a verified public article. Before the final browser action, it records &lt;code&gt;submitting&lt;/code&gt;. If the run stops there, the next run sees an unresolved attempt rather than an empty queue.&lt;/p&gt;

&lt;p&gt;When the result is unclear, &lt;code&gt;unknown&lt;/code&gt; blocks automatic resubmission. Recovery has two paths: find and verify the existing public article, or inspect both the published list and the saved draft before recording that a retry is appropriate. Merely waiting longer is not evidence that the first submission failed.&lt;/p&gt;

&lt;h2&gt;Keep content identity separate from a run&lt;/h2&gt;

&lt;p&gt;A fresh run should not create a fresh identity for the same article. The helper checks a stable content identifier, a normalized title, a body-text hash, and, for newer editorial jobs, a claim key within the same platform and account.&lt;/p&gt;

&lt;p&gt;These checks catch known repeats; they are not a semantic originality detector. Two substantially identical articles can have different titles and hashes. Editorial comparison is still needed, especially when an existing artwork supports a new article.&lt;/p&gt;

&lt;p&gt;The helper also fingerprints the prepared text, tags and image metadata. If the local source changes after a draft is saved, that mismatch requires reconciliation with the remote draft. Changing the job name to escape the warning would discard the very connection recovery needs.&lt;/p&gt;

&lt;h2&gt;Verify the result outside the editor&lt;/h2&gt;

&lt;p&gt;A saved message proves less than a published article. Before recording success, the browser workflow checks the actual public permalink, author, complete body, loaded images, captions and intended links. The script validates the resulting evidence record; it does not independently see the browser or prove that an agent's observations are true.&lt;/p&gt;

&lt;p&gt;This does not guarantee exactly-once delivery across a website we do not control. It provides a practical stopping point: when publication is uncertain, inspect before retrying.&lt;/p&gt;

&lt;p&gt;For the artwork side of this workflow, &lt;a href="https://whispart.com/?utm_source=dev&amp;amp;utm_medium=organic_social&amp;amp;utm_campaign=browser_recovery_20261013" rel="noopener noreferrer"&gt;Whispart develops selected GAN creations into physical wall art and framed artworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI disclosure: this article was written by an AI agent from the local workflow implementation and recorded publishing observations. It describes a limited working process, not a benchmark or a guarantee about third-party platforms.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
    </item>
    <item>
      <title>We looked through thousands of GAN images. Choosing one was the hard part.</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:29:04 +0000</pubDate>
      <link>https://dev.to/whispart/we-looked-through-thousands-of-gan-images-choosing-one-was-the-hard-part-1o4</link>
      <guid>https://dev.to/whispart/we-looked-through-thousands-of-gan-images-choosing-one-was-the-hard-part-1o4</guid>
      <description>&lt;p&gt;The model had finished generating. That did not mean we had a finished artwork. In Whispart's studio workflow, it meant we had a much more difficult question: &lt;strong&gt;which image would still be interesting after the first two seconds?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We make images with a GAN model we call &lt;em&gt;Mnemosyne&lt;/em&gt;. Our founder describes a working pattern with two very different kinds of looking. During training, the team reviews sample grids at saved checkpoints; after choosing a promising model state, it explores a much larger batch of outputs. Those numbers are approximate studio recollections, not a public benchmark or a recipe that every GAN project should copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first question: when does more training stop helping the art?
&lt;/h2&gt;

&lt;p&gt;In the founder's account, a model state may be saved at roughly 100-kimg intervals. Here, &lt;em&gt;kimg&lt;/em&gt; measures thousands of real images shown to the discriminator during training (&lt;a href="https://github.com/NVlabs/stylegan2-ada-pytorch/blob/main/README.md" rel="noopener noreferrer"&gt;NVIDIA's StyleGAN2-ADA documentation&lt;/a&gt;). The studio uses about 50–100 fixed-seed examples to watch how the visual field changes. Fixed seeds make a comparison across checkpoints more meaningful: you can see what changes in the same starting positions rather than confusing a different sample with a different model.&lt;/p&gt;

&lt;p&gt;But the comparison is aesthetic as well as technical. A later state can be more resolved while losing the surprising, half-formed relationships we value. That does &lt;strong&gt;not&lt;/strong&gt; mean less training is universally better, or that a specific kimg value guarantees good art. For us it means the checkpoint is a choice, not a score that always goes up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second question: what survives a large batch?
&lt;/h2&gt;

&lt;p&gt;Once a state looks promising, the studio may generate on the order of 10,000 candidate images. In the founder's description, two teammates first reduce that field to roughly 1,000 images that feel distinctive, compositionally alive, or worth imagining on a wall. The founder then makes a second selection of roughly 100. These are working estimates, not audited counts for the individual image below.&lt;/p&gt;

&lt;p&gt;The first pass asks, “Is there something here?” The next asks, “Does it keep happening when I look again?” A clean thumbnail can fail the second question. A visually unstable image can pass because its composition leaves room for discovery.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgw7yntk6mots9i3wqbob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgw7yntk6mots9i3wqbob.png" alt="Unnamed Heir, a selected Whispart artwork: a pale seated figure emerges against a dark, unresolved background." width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Unnamed Heir&lt;/em&gt; is one selected Whispart work. The pale figure reads quickly. The dark ground and shifting edges take longer. The title offers a narrative opening without telling you whose heir this is or what she will do next. We are showing it as an example of the kind of image that rewards a second look, not as proof of an exact checkpoint or candidate count.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we would want a review tool to preserve
&lt;/h2&gt;

&lt;p&gt;If you build generative tools, here is the practical lesson from our process: the interface should help a human compare and return, not simply reward the output that wins the first glance. Keep checkpoint and seed identities attached to images. Make the full composition easy to open from a grid. Give “hold” its own state so an undecided image is not silently treated as a rejection.&lt;/p&gt;

&lt;p&gt;And keep the final decision separate from generation. A model can produce a compelling possibility. People still decide what to keep, name, test in material form, and release. The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart process journal&lt;/a&gt; shows how those stages fit together.&lt;/p&gt;

&lt;p&gt;What do you use to tell a generative system's most &lt;em&gt;interesting&lt;/em&gt; outputs from its most immediately polished ones?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted with an AI writing assistant using the founder's account and the studio's public process material, then checked against those sources. The figures above are approximate descriptions of a working pattern, not a claim about the provenance of the pictured artwork.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>creativecoding</category>
      <category>design</category>
    </item>
    <item>
      <title>An honest wall-art preview needs two sizes</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:50:15 +0000</pubDate>
      <link>https://dev.to/whispart/an-honest-wall-art-preview-needs-two-sizes-240h</link>
      <guid>https://dev.to/whispart/an-honest-wall-art-preview-needs-two-sizes-240h</guid>
      <description>&lt;p&gt;A wall-art preview can show the right image at the wrong scale. One common source of error is treating the artwork's image area and its framed outer dimensions as the same rectangle.&lt;/p&gt;

&lt;p&gt;This matters to studios such as Whispart, where a selected GAN image is developed into a framed physical work. The frame, surrounding wall and viewing distance are part of the presentation. A preview should make those decisions visible enough for a viewer to reason about them.&lt;/p&gt;

&lt;p&gt;Here is a small geometry model for a front-facing, schematic preview. All dimensions below are illustrative, not specifications for a Whispart product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store the outer dimensions explicitly
&lt;/h2&gt;

&lt;p&gt;Suppose the visible image is 50 × 50 cm. A hypothetical frame adds 2 cm on each side, with no mat or gap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;outer width  = 50 + 2 + 2 = 54 cm
outer height = 50 + 2 + 2 = 54 cm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the same design includes a mat, a float gap or a different overlap, that formula changes. A production product page should use confirmed outer dimensions rather than deriving them from an attractive border drawn in CSS.&lt;/p&gt;

&lt;p&gt;For a 240 cm-wide wall represented by a 720 px canvas, the scale is 3 px per cm. The image area is 150 px wide; the complete framed object is 162 px wide. Placing the frame outside an element that already represents the outer size would count it twice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Real dimension in this example&lt;/th&gt;
&lt;th&gt;Preview dimension&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wall width&lt;/td&gt;
&lt;td&gt;240 cm&lt;/td&gt;
&lt;td&gt;720 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image width&lt;/td&gt;
&lt;td&gt;50 cm&lt;/td&gt;
&lt;td&gt;150 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frame face, each side&lt;/td&gt;
&lt;td&gt;2 cm&lt;/td&gt;
&lt;td&gt;6 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete framed width&lt;/td&gt;
&lt;td&gt;54 cm&lt;/td&gt;
&lt;td&gt;162 px&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Preserve the artwork's aspect ratio
&lt;/h2&gt;

&lt;p&gt;For a schematic component, keep the image and the surrounding frame separate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;figure&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"work"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"artwork.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Complete artwork preview"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Example only: 3 screen pixels represent 1 cm. */&lt;/span&gt;
&lt;span class="nc"&gt;.work&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;162px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#6f5947&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.work&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the square source image in this example, the content is 150 × 150 px and the outer object is 162 × 162 px. A non-square source keeps its own ratio; this snippet does not force it into a square opening.&lt;/p&gt;

&lt;p&gt;The colored border is a schematic frame, not a photograph or material simulation. If a real frame overlaps the image, show the resulting visible area explicitly. Do not let &lt;code&gt;object-fit: cover&lt;/code&gt; silently decide which part of the artwork disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say how the scale was established
&lt;/h2&gt;

&lt;p&gt;A measured wall elevation gives a defensible scale for this simple model. An arbitrary room photograph does not. A sofa of unknown size is not a reliable measuring instrument, and perspective changes the apparent scale across a photograph.&lt;/p&gt;

&lt;p&gt;When dimensions are unknown, call the image a styling illustration. When a preview is based on measurements, show the dimensions used and the limits of the model. A flat elevation does not predict a surface's texture, reflections or appearance in evening light.&lt;/p&gt;

&lt;p&gt;Before deciding on a size, a viewer can mark the proposed &lt;em&gt;outer&lt;/em&gt; rectangle on the wall with a suitable removable paper template, then look from the doorway and the usual seated position. This provides a physical scale check without pretending to reproduce the artwork's material presence.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart process journal&lt;/a&gt; treats framed-room visualizations as decision aids and physical proofing as a separate step. That is a useful boundary for preview design: help someone judge placement and proportion, while identifying which qualities the preview cannot demonstrate.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted and checked by an AI assistant using Whispart's public process documentation. The component and measurements are teaching examples, not a deployed Whispart feature or a specification for an available artwork.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>Print preflight for generative art: pixels, crop and physical proof</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:37:16 +0000</pubDate>
      <link>https://dev.to/whispart/print-preflight-for-generative-art-pixels-crop-and-physical-proof-21nh</link>
      <guid>https://dev.to/whispart/print-preflight-for-generative-art-pixels-crop-and-physical-proof-21nh</guid>
      <description>&lt;p&gt;An image export can pass every file check and still fail as a physical artwork. For anyone building a generative-art export tool, separating those two kinds of approval makes the workflow easier to understand.&lt;/p&gt;

&lt;p&gt;Whispart develops GAN-based images and gives selected works a physical form. Its process includes human curation, writing, material proofing and a release decision. The checklist here translates that published approach into practical preflight questions; it does not describe an existing automated Whispart print service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculate resolution at the intended size
&lt;/h2&gt;

&lt;p&gt;Pixel dimensions describe a file. Physical dimensions describe an object. The relationship is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effective PPI = pixels along an axis / (print size in cm / 2.54)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an illustrative 4096 × 4096-pixel image:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Square print size&lt;/th&gt;
&lt;th&gt;Effective PPI, rounded&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;40 × 40 cm&lt;/td&gt;
&lt;td&gt;260&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 × 50 cm&lt;/td&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60 × 60 cm&lt;/td&gt;
&lt;td&gt;173&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are arithmetic examples, not Whispart product specifications or pass/fail thresholds. A print provider should specify the file requirements for the actual process, material and intended viewing conditions.&lt;/p&gt;

&lt;p&gt;If the image is cropped, calculate from the pixels that remain. If it is enlarged computationally, record both the original dimensions and the delivered dimensions. A larger pixel count does not by itself establish that the enlarged image contains convincing detail.&lt;/p&gt;

&lt;p&gt;Changing only a file's resolution metadata does not add pixels. A useful export interface should therefore show the intended physical size beside the dimensions, rather than celebrating a “300 PPI” label in isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the front image from the edge treatment
&lt;/h2&gt;

&lt;p&gt;A stretched canvas introduces a second geometry problem: what appears on the front, and what is reserved for the sides or finishing process?&lt;/p&gt;

&lt;p&gt;Keep the approved complete image separate from any production derivative. Ask the fabricator for the actual allowance and edge treatment before exporting. Do not assume that every canvas depth or frame uses the same dimensions.&lt;/p&gt;

&lt;p&gt;A review should make any crop visible. If a face sits close to the edge, a production allowance can change the composition even when the center looks identical. A preview that shows only the front rectangle can conceal that problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give each check a truthful result
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What software can report&lt;/th&gt;
&lt;th&gt;What still needs inspection&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File opens&lt;/td&gt;
&lt;td&gt;Decoding succeeded; dimensions read&lt;/td&gt;
&lt;td&gt;Whether the image is the intended version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size calculation&lt;/td&gt;
&lt;td&gt;Effective PPI for the selected crop and size&lt;/td&gt;
&lt;td&gt;Whether the print is convincing at the intended distance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crop preview&lt;/td&gt;
&lt;td&gt;Which pixels remain on the front&lt;/td&gt;
&lt;td&gt;Whether the altered composition is acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Color preparation&lt;/td&gt;
&lt;td&gt;The file's declared profile and export settings&lt;/td&gt;
&lt;td&gt;The result on the actual material under real light&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production proof&lt;/td&gt;
&lt;td&gt;A proof record has been attached&lt;/td&gt;
&lt;td&gt;Whether the proof deserves approval&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;“Check completed” and “approved” should be separate states. An export tool can flag missing information without pretending to judge an artwork.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrdr19fkfnj52corzq9d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrdr19fkfnj52corzq9d.jpg" alt="A hand inspecting the textured surface of an unframed printed image in a Whispart studio process photograph" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Studio process photograph supplied by Whispart. It illustrates material inspection; it does not identify a particular GAN release or document a controlled print comparison.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Close the loop with the physical object
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart journal's account of physical proofing&lt;/a&gt; distinguishes room visualizations from physical evidence. That distinction is especially useful when a website makes an artwork look complete before it has been printed.&lt;/p&gt;

&lt;p&gt;Attach the inspected proof to the exact file version, intended size, material and date. Record a concrete observation—such as a distracting edge or lost separation in a dark area—and the next action. If the file changes, do not silently carry the old approval forward.&lt;/p&gt;

&lt;p&gt;For a practice that authorizes one physical release of a selected image, the decision to release deserves its own record. A successful export is an input to that decision.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted and checked by an AI assistant using the studio's public documentation. Numerical examples are illustrative; no specific printer, color accuracy or durability result is claimed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
    </item>
    <item>
      <title>Designing a contact sheet for GAN art review</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:19:15 +0000</pubDate>
      <link>https://dev.to/whispart/designing-a-contact-sheet-for-gan-art-review-4pij</link>
      <guid>https://dev.to/whispart/designing-a-contact-sheet-for-gan-art-review-4pij</guid>
      <description>&lt;p&gt;A gallery of generated images has two different jobs: letting someone see the range of a model, and helping them decide which candidates deserve a closer look. A beautiful grid can do the first while quietly making the second harder.&lt;/p&gt;

&lt;p&gt;This note comes from Whispart, a studio developing and curating GAN-based images for physical artworks. Our published process separates generated candidates from selected images and finished releases. The interface below is a design proposal based on that distinction, not a claim that Whispart has deployed a particular review application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the comparison before adding a score
&lt;/h2&gt;

&lt;p&gt;Begin with a stable contact sheet. Give each candidate a persistent identifier, preserve its complete composition, and keep the initial order recoverable. Avoid a masonry layout for the primary comparison: a tall tile occupies more screen space than a square one, which can influence what receives attention.&lt;/p&gt;

&lt;p&gt;Equal-sized containers are useful, but equal-sized &lt;em&gt;crops&lt;/em&gt; are a different decision. Use &lt;code&gt;object-fit: contain&lt;/code&gt; for the review thumbnail so that the interface does not silently remove an edge or a figure. A detail crop can be a separate, clearly labeled view.&lt;/p&gt;

&lt;p&gt;Let the reviewer toggle between three views:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;View&lt;/th&gt;
&lt;th&gt;Question it supports&lt;/th&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Complete contact sheet&lt;/td&gt;
&lt;td&gt;Is there meaningful variation across this batch?&lt;/td&gt;
&lt;td&gt;Small details are difficult to judge.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single candidate, complete image&lt;/td&gt;
&lt;td&gt;Does the composition hold together without its neighbors?&lt;/td&gt;
&lt;td&gt;One image cannot demonstrate the range of a system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detail at a stated zoom&lt;/td&gt;
&lt;td&gt;Is that mark deliberate-looking ambiguity or a distracting artifact?&lt;/td&gt;
&lt;td&gt;Enlarged detail cannot decide the whole composition.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A high-resolution image should load when requested; the initial sheet can use smaller derivatives. Keep the same candidate identifier attached to both. A thumbnail and its full-size file must never drift apart because filenames were sorted differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make “undecided” a real state
&lt;/h2&gt;

&lt;p&gt;An unchecked image has not necessarily been rejected. A reviewer may not have reached it, may need a larger view, or may be postponing a decision until a series becomes clearer.&lt;/p&gt;

&lt;p&gt;For a small tool, an illustrative record could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"candidate_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"study-017"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"review_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"observation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The pale area competes with the figure at thumbnail size."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Inspect the complete image on its own."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-09T04:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is fictional example data. Its useful feature is the separation of observation from action. “Bad image” does not tell the next reviewer what to inspect. A bounded visual observation does.&lt;/p&gt;

&lt;p&gt;Keep &lt;code&gt;unreviewed&lt;/code&gt;, &lt;code&gt;hold&lt;/code&gt;, &lt;code&gt;shortlisted&lt;/code&gt;, and &lt;code&gt;excluded&lt;/code&gt; distinct. Store a change history if multiple people can alter a decision. Shortlisting should not automatically authorize printing or publication; those are later decisions with different evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the studio's preferences legible
&lt;/h2&gt;

&lt;p&gt;Whispart's approach values emotional tension, ambiguity and images that continue to hold attention. A default “sharpness” score would therefore be a poor substitute for the studio's judgment. Blur may matter to the image; a technically clean output may still be uninteresting.&lt;/p&gt;

&lt;p&gt;For another practice, graphic clarity might be essential. The interface should let the reviewer state that preference instead of smuggling it into a universal quality number. Notes about visual structure, repetition and unresolved questions are more useful here than an unexplained score out of ten.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart process journal&lt;/a&gt; provides the concrete workflow behind this proposal: a visual field becomes candidates, then human selection, writing and material proofing determine what can become a physical work. A contact sheet supports the selection stage. It cannot supply all of the later decisions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted and checked by an AI assistant using Whispart's public studio documentation. The interface and example record are proposals, not reported production software or research results.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
    </item>
    <item>
      <title>A seed is not a provenance record: documenting generative art outputs</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Tue, 08 Sep 2026 04:03:35 +0000</pubDate>
      <link>https://dev.to/whispart/a-seed-is-not-a-provenance-record-documenting-generative-art-outputs-25f4</link>
      <guid>https://dev.to/whispart/a-seed-is-not-a-provenance-record-documenting-generative-art-outputs-25f4</guid>
      <description>&lt;p&gt;A seed is useful when you want to revisit a generated image. It is much less useful when someone asks which checkpoint produced the image, whether the displayed file was cropped, or which candidate eventually became a physical work.&lt;/p&gt;

&lt;p&gt;Those questions need a small chain of records: &lt;strong&gt;run → output → selected image → production file → physical proof&lt;/strong&gt;. You can keep that chain in JSON files and a folder of evidence before you need a database.&lt;/p&gt;

&lt;p&gt;This article proposes a lightweight record format for people building generative art workflows. The example is fictional and is not an export of Whispart's internal production system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the run and the image different identities
&lt;/h2&gt;

&lt;p&gt;Treat a run as the configuration used to generate a set of candidates. Give each candidate its own identity, even if it shares a seed with an image from an earlier experiment.&lt;/p&gt;

&lt;p&gt;For the run, preserve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact checkpoint file, with a checksum to identify its bytes.&lt;/li&gt;
&lt;li&gt;The generation code revision and resolved configuration, including default values.&lt;/li&gt;
&lt;li&gt;The software environment and relevant hardware information.&lt;/li&gt;
&lt;li&gt;A dataset version reference, when you control the training process, with its source-review records stored separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each output, record the run ID, sampling inputs and the actual exported file. Depending on the implementation, sampling inputs can include a seed, a saved latent vector, conditioning inputs or additional noise settings. Record what the particular generator consumes; don't assume a seed captures all of it.&lt;/p&gt;

&lt;p&gt;Even a carefully recorded configuration is not a promise of identical pixels everywhere. &lt;a href="https://docs.pytorch.org/docs/2.14/notes/randomness.html" rel="noopener noreferrer"&gt;PyTorch's reproducibility documentation&lt;/a&gt; explains that results can differ across releases, platforms and CPU/GPU execution. Keeping the original output file gives you a reference when a later rerun differs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Record what happened after generation
&lt;/h2&gt;

&lt;p&gt;Suppose a fictional studio selects &lt;code&gt;candidate-0042&lt;/code&gt;, crops it for presentation and later exports a separate file for printing. If all three images are called &lt;code&gt;final.png&lt;/code&gt;, the history becomes difficult to reconstruct.&lt;/p&gt;

&lt;p&gt;Instead, preserve the original candidate and record each derived file with its parent and the operation performed. A crop changes the boundary of an image; an upscale changes its pixel dimensions. Neither operation should silently replace the original record.&lt;/p&gt;

&lt;p&gt;Selection is a separate event. Record which candidate was selected, by whom, when, and why. A short, specific note is more useful than a generic quality score: for example, "Keep the uncropped image for review; the narrow crop removes the secondary figure."&lt;/p&gt;

&lt;p&gt;This separation matters when generated images become physical objects. &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart's illustrated GAN process&lt;/a&gt; distinguishes a model, an output, a selected image and an authorized physical release. It also distinguishes presentation mockups from physical proofing evidence. The record format below applies that distinction to file management; it does not imply that the studio uses this particular schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small example you can adapt
&lt;/h2&gt;

&lt;p&gt;The following is an &lt;strong&gt;illustrative record with unresolved fields&lt;/strong&gt;, not a completed production record. Paths and IDs are invented. Replace them with actual files and computed checksums before relying on the record.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"example_only"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"run"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo-run-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkpoint_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"models/demo-checkpoint.pkl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkpoint_sha256"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code_revision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"configuration_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runs/demo-run-01/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"environment_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runs/demo-run-01/environment.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dataset_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"candidate-0042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"run_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo-run-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sampling_inputs_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runs/demo-run-01/inputs-0042.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"outputs/candidate-0042.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sha256"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"presentation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"presentation-0042-a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parent_output_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"candidate-0042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"presentations/candidate-0042-crop.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sha256"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"selection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"selected_asset_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reviewer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reviewed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"production"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source_asset_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"print_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"print_file_sha256"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"proof_photo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"proof_result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_reviewed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"release_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that the presentation crop exists while selection is still pending. Making a mockup does not automatically approve that crop for production.&lt;/p&gt;

&lt;p&gt;Here is a concrete way to use the example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compare the original output with the presentation crop. If the original is selected, set &lt;code&gt;selected_asset_id&lt;/code&gt; to &lt;code&gt;candidate-0042&lt;/code&gt;; if the crop is selected, use &lt;code&gt;presentation-0042-a&lt;/code&gt;. Save the reviewer, time and actual reason.&lt;/li&gt;
&lt;li&gt;Export the print file from the selected asset. Record that asset's ID as &lt;code&gt;production.source_asset_id&lt;/code&gt;, and compute the checksum of the exported print file.&lt;/li&gt;
&lt;li&gt;When a physical proof is made, attach a photograph of that specific proof and record the review result. If it fails, preserve the failed attempt and create a new production attempt rather than overwriting it.&lt;/li&gt;
&lt;li&gt;Assign a release ID only when the studio's release decision is complete. Keep any edition policy in a separate, explicit record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A room visualization can help you assess scale, but it belongs with presentation material. It cannot fill the missing &lt;code&gt;proof_photo&lt;/code&gt; field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the relationships before you trust the record
&lt;/h2&gt;

&lt;p&gt;Start with a few checks that catch ordinary mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does every referenced file exist, and does its current checksum match the saved value?&lt;/li&gt;
&lt;li&gt;Does each derived asset point to the actual parent used to create it?&lt;/li&gt;
&lt;li&gt;Does the production file trace back to the selected asset?&lt;/li&gt;
&lt;li&gt;Does the proof evidence identify the same production attempt?&lt;/li&gt;
&lt;li&gt;Are unresolved fields still visibly unresolved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A checksum helps detect a changed file. It does not establish who created it, whether a source was appropriate to use, or when an event occurred. Keep source-review notes and dated decision records alongside the files, with version history or another audit trail appropriate to your needs.&lt;/p&gt;

&lt;p&gt;If you retain only one thing from an exploratory session, keep the actual output and its run reference together. That makes the next decision—regenerate, compare, select or prepare for print—possible without reconstructing the session from memory.&lt;/p&gt;




&lt;p&gt;Published by Whispart Studio. This article was generated by an AI agent using the linked source material. The example schema is proposed guidance, not a claim about a deployed studio system.&lt;/p&gt;

</description>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
