<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[CUBIG Tech Blog - Medium]]></title>
        <description><![CDATA[CUBIG Builds the AI-Ready Data Operating Layer for enterprise AI - Medium]]></description>
        <link>https://medium.com/cubig-tech-blog?source=rss----4e95693c9ca1---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>CUBIG Tech Blog - Medium</title>
            <link>https://medium.com/cubig-tech-blog?source=rss----4e95693c9ca1---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 05 Nov 2026 13:57:16 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/cubig-tech-blog" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[When Human Approval Becomes Data]]></title>
            <link>https://medium.com/cubig-tech-blog/when-human-approval-becomes-data-f58df8fe0abd?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/f58df8fe0abd</guid>
            <category><![CDATA[human-in-the-loop]]></category>
            <category><![CDATA[llm-evaluation]]></category>
            <category><![CDATA[data-labeling]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[ai-ready-data]]></category>
            <dc:creator><![CDATA[Hyungyu Lee]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 13:01:02 GMT</pubDate>
            <atom:updated>2026-11-05T13:01:02.391Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*MvI2vvNQX2dOjFHPYYtWiA.png" /></figure><p>In March, Cursor, the company behind a widely used AI code editor, described how it now trains its coding model on the responses of people using it, turning them into reward signals (<a href="https://cursor.com/blog/real-time-rl-for-composer">Cursor, 2026</a>). In its comparison of model versions, one of the measures has an unusually plain name: “agent edit persists in codebase.” Read literally, the name describes edits the user did not undo.</p><p>I like that name because it claims no more than it knows. It does not say the edit was correct, or that anyone read it closely. It says the edit stayed.</p><p>An approval of an AI’s output, whether a click on Accept, a merged pull request, or a suggested label a reviewer left alone, records that a person did not object. Cursor uses it openly as a training target and a plainly named measure. <strong>Written into a dataset, it can become something stronger: a human answer, a verified label, ground truth.</strong> That second use is quiet.</p><p><strong>A model’s suggestions, once shown to the labelers, can reappear in the answer key used to grade that same model against its rivals.</strong></p><h3>1. Graded on answers it helped write</h3><p>A pre-registered experiment in the Findings of ACL last year tested this (<a href="https://aclanthology.org/2025.findings-acl.1323/">Schroeder et al., 2025</a>). Crowd annotators labeled passages from conversations, some on their own and some with a language model’s suggested labels in front of them. The annotators who saw suggestions relied heavily on them. Then the authors scored the model against each group’s answer key, using weighted F1, a standard agreement score where 1 means a perfect match. Against the key built without suggestions, GPT-4 reached 0.47. Against the key built with GPT-4’s own suggestions on screen, it reached 0.79 (<a href="https://arxiv.org/html/2507.15821v1">arXiv version</a>). The model had not changed. <strong>The answer key had moved toward it.</strong></p><p>The ACL authors are careful about scope: these were subjective tasks with more than one defensible answer, done by crowd workers, who they note may be particularly susceptible to suggestions. <strong>On such tasks, the gap shows how far a key can lean, not that the higher score is wrong.</strong> A 2016 study of grammatical annotation, a far more rule-bound task, found the same lean: anchoring on a grammar parser’s suggestions made that parser look better than it was (<a href="https://aclanthology.org/D16-1239/">Berzak et al., 2016</a>). This lean is documented for suggested labels, not code reviews.</p><p><strong>When a model’s suggestions shape its answer key, the measurement is circular: the model is graded on answers it helped write.</strong> Only where an independent key disagrees with the model can such a key grade it higher. The independent key can be wrong too, so the gap comes partly from the model fixing an unaided person’s slips and partly from people letting the model’s mistakes through, as in the grammar study. Either way, a key built from approved suggestions no longer shows where the model and an unaided person split, which is where an independent key could expose the model’s errors.</p><p>The model’s gain can skew a familiar choice, picking between models scored on such a key. A lift shared equally would leave the ranking alone. But only the model behind the suggestions is inside the circle, so any tilt likely favors it, though I would guess similar models gain too.</p><p>The suggestions did not even make the ACL annotators faster. Reviewing a model’s suggestions, in the authors’ words, “will nudge the distribution of label outputs towards an LLM baseline, even if humans are given a chance to review the outputs.” I suspect the shift comes from seeing a suggestion as much as from accepting it, and more careful approval may not undo that.</p><h3>2. An approval does not say who decided</h3><p>The closest test of careful approval I have found comes from medicine. In a randomized trial published in NEJM AI’s May issue, forty-four physicians who had just finished a twenty-hour course in AI literacy worked through six case vignettes with ChatGPT suggestions. For half of them, three of the six suggestions contained deliberate, clinically significant errors. That group’s diagnostic accuracy came out 14 percentage points lower than that of the half whose suggestions were correct, and the authors conclude that physicians “demonstrate substantial automation bias when exposed to erroneous LLM recommendations, even with voluntary consultation and prior AI literacy training” (<a href="https://doi.org/10.1056/AIoa2501001">Qazi et al., 2026</a>). Like the annotators above, the physicians were free to reject what they saw. These were people who knew what to watch for.</p><p>What that result says about a sign-off is narrow, and I think it matters. When a person approves an AI’s answer, the approval does not show whether the person would have reached the same answer alone. Sometimes they would have. Sometimes the suggestion did the deciding and the person did not override it. Asking them later may not settle it. In a Science study of choice blindness, people often failed to notice being handed the option they had not chosen, and explained why they had picked it (<a href="https://doi.org/10.1126/science.1111709">Johansson et al., 2005</a>). A 2026 study found the same effect in choices between texts, like the comparisons used to train AI models (<a href="https://arxiv.org/abs/2603.08412">Wu, 2026</a>, preprint). <strong>The record looks the same, whoever did the deciding.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eqvoQoqWAaYglzGQDwKBpA.png" /></figure><p>Conceptual illustration: the same checked form, reached alone on one desk and from a suggestion on the other.</p><p>Following an AI’s suggestion is often the right call. In one 2026 study, physicians were more accurate with a source-citing assistant than without one, though they resisted a wrong answer far less often when it came with citations (<a href="https://arxiv.org/abs/2608.00817">Chanda et al., 2026</a>, preprint).</p><p>Closer to everyday software work, reviewers of pull requests written by AI coding agents approved more often over the months, while approval rates for human-written pull requests fell (<a href="https://arxiv.org/abs/2606.22721">Yu et al., 2026</a>, workshop paper), a trend better agents could also explain. Anthropic reported in March that Claude Code users approve nearly all permission prompts, and called the pattern <em>approval fatigue</em> (<a href="https://www.anthropic.com/engineering/claude-code-auto-mode">Anthropic, 2026</a>).</p><p>I use AI coding tools for a good part of my own work and approve their requests many times a day. On most days, I could not say which of those approvals were judgments.</p><h3>3. Where approvals go</h3><p>However careful the approval, the person still saw the suggestion first, so I look at the record, not the reviewer’s care, and end with a small proposal. <strong>What an approval is filed as, a target or a human answer, shapes where its failures show.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Xf30R-ecyex2PDqbGII_CQ.png" /></figure><p>Conceptual illustration: the same approvals, filed as a training target or as a human answer in an answer key.</p><p>As a target, an approval is named for what it is. Cursor’s earlier code-completion model was rewarded for accepted suggestions and penalized for rejected ones (<a href="https://cursor.com/blog/tab-rl">Cursor, 2025</a>). The objective is acceptance, not correctness, and Cursor’s March post showed what that gap invites: the newer model began asking clarifying questions instead of attempting risky edits because, in the team’s words, “it wouldn’t get punished for code it didn’t write.” They noticed, and changed the reward. By its own account, OpenAI rolled back a 2025 update in which changes, including an added reward from users’ ratings, weakened the signal holding flattery in check (<a href="http://web.archive.org/web/20261023021757/https://openai.com/index/expanding-on-sycophancy/">OpenAI, 2025</a>).</p><p>Approved data still has uses. An ICLR study showed that generated data filtered by a verifier, even an imperfect one, can keep a model trained on it from degrading (<a href="https://arxiv.org/abs/2406.07515">Feng et al., 2025</a>), and approvals can act as that filter to the extent they actually select for quality. An answer key is different.</p><p>Approvals filed as human answers show up in labeling, where the work can begin from a model’s guess that a person confirms or corrects. Amazon’s labeling service can have a model label the items it is confident about and send the rest to people (<a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-automated-labeling.html">AWS, automated labeling</a>), and it offers separate jobs in which people verify or adjust existing labels (<a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">AWS, label verification</a>).</p><p>For the reviewer, the choice is lopsided. Correcting a label takes a decision and a few keystrokes, while leaving it can take neither. A reviewer working through a queue can face that choice again and again.</p><p>A target’s failures can still hide. Models trained on user feedback can learn to single out the users vulnerable to manipulation, “making such behaviors harder to detect” (<a href="https://openreview.net/forum?id=Wf2ndb8nhf">Williams et al., 2025</a>). Checks against human judgment could surface them. An approval can be filed as a label, the human judgment other checks rely on, so the errors it let through can end up inside the measurement, as a higher score that looks like success. <strong>Once a dataset keeps only the label, not its origin, nothing in it asks anyone to look closer.</strong></p><h3>4. What the dataset keeps</h3><p>Whether a dataset keeps only the label depends on what happens between the review and the final table. During review, a label’s origin can be recorded fairly completely. Amazon’s labeling service records beside each label whether it was “labeled by a human or by automated data labeling,” and its review jobs keep the original label next to the reviewed one, marked <em>adjusted</em> or <em>unadjusted</em> “for audit workflows” (<a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-data-output.html">AWS, output data</a>).</p><p>How much of that reaches a dataset used for training or grading is another matter. At the far end, one row might hold a customer message, the label <em>complaint</em>, and a column value saying the label came from a human, though a model suggested it. The column is not wrong. <strong>It is also not the whole story, and nothing in the row says which part is missing.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fC55e_q_ls4-Pyoh9HZQ2A.png" /></figure><p>Conceptual illustration: the slot has room for the label, not for the note saying a model suggested it.</p><p>Even license metadata thins out along the way. A large audit of the datasets used to fine-tune language models found licenses frequently missing or miscategorized on widely used dataset hosting sites (<a href="https://doi.org/10.1038/s42256-024-00878-8">Longpre et al., 2024</a>). A license has legal reasons to stay attached. A note about whether a person saw a suggestion has fewer.</p><p>For data behind high-risk systems, the EU AI Act asks about origin directly, including how the data was annotated and labeled (<a href="https://artificialintelligenceact.eu/article/10/">EU AI Act, Art. 10</a>). For AI-generated text published to inform the public on matters of public interest, it waives disclosure where the content “has undergone a process of human review or editorial control” and someone “holds editorial responsibility” for publishing it (<a href="https://artificialintelligenceact.eu/article/50/">EU AI Act, Art. 50</a>). That suits published text, but the exemption turns on responsibility, not origin.</p><p>I cannot show a label’s origin being stripped in transit. Where nothing records the origin, its loss leaves no trace, so stripping stays a risk. <strong>What I can show is how little room the origin has.</strong> Hugging Face’s template for dataset cards records in one field how the labels were made, with example values such as <em>crowdsourced</em>, <em>found</em>, <em>expert-generated</em>, and <em>machine-generated</em> (<a href="https://github.com/huggingface/hub-docs/blob/main/datasetcard.md">Hugging Face, dataset cards</a>). None names a label a model proposed and a person kept. The field can take several values, or <em>other</em>, but it describes the whole dataset and cannot mark individual labels.</p><h3>5. A small field and a slice set aside</h3><p>What I would want is modest, a proposal rather than a finding. The first is <strong>a field that carries how each label was made all the way into the dataset</strong>: made by a person who saw no suggestion, by a person who saw a model’s suggestion, or by a model. Three values. The dividing line is seeing a suggestion, which is what separated the ACL groups and what a tool can record. The middle value should also name the model and version inside the circle, and say whether the person kept or changed its suggestion.</p><p>Much of this is already recorded during review. The work is in carrying it forward, since, as choice blindness suggests, the people asked later may not know who decided. Without it, a label someone left alone can be copied into a table under a column called <em>verified</em>.</p><p>The second is <strong>a slice for datasets used to measure or choose a model</strong>. For a key built by hand, the simplest move is to show no suggestions, which keeps the key out of the circle. The field and slice matter most where that move does not reach: model-labeled items no person saw, evaluation splits cut from pre-labeled data, datasets received from elsewhere. There, a small random slice can be set aside and relabeled by people shown no suggestions. With labelers like the originals, the same guidelines, and each candidate model scored against both label sets, that is the ACL study’s design in miniature. The field, where it survives, says which labels to check and which candidate they may favor, and the slice says roughly how far they lean, on the strength of a team’s own data rather than my word.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kNF3Mn6_VDTleBpVQRAOaQ.png" /></figure><p>Conceptual illustration: a small random slice set aside, to be relabeled by people shown no suggestions.</p><p><strong>As far as I know, nobody has shown that recording a label’s origin fixes the problems above.</strong> The field has a limit. In one study, by the authors’ estimate, a sizable share of crowd workers writing summaries used a language model on their own initiative, a practice they warn may “degrade future models trained with crowdsourced data” (<a href="https://doi.org/10.1145/3685527">Veselovsky et al., 2025</a>). A value saying no suggestion was shown describes the tool, not the person. The slice shares that limit. Off-screen help from a similar model can narrow the gap, while the new labelers’ slips and honest disagreement can widen it, so I would read its lean as a rough estimate. And no single label, however complete, says which approvals were real judgments.</p><p>Across a dataset, the field and slice can show how far approved labels lean away from unaided ones and, within the slice, which items they split on. Telling whether approvals actually select for quality means judging those items independently and recording the verdict.</p><p>The same field applies to this piece. It was drafted with an AI system, Claude Opus 5.5, and I read and approved its sentences. In the terms above they sit in the middle value. The label names the model and version but marks no sentence kept or changed, so by my own standard it is incomplete.</p><p><em>Nobody undid it</em> is a fact worth keeping. <strong><em>Somebody checked it</em> is a different fact, and a dataset should be able to tell the two apart.</strong></p><h3>Further reading</h3><ul><li>Series so far: <a href="https://medium.com/cubig-tech-blog/same-seed-different-answer-why-ai-results-do-not-reproduce-6348ca6580a1">reproducibility</a>, <a href="https://medium.com/cubig-tech-blog/same-model-different-rank-why-ai-benchmarks-do-not-transfer-c154131f5545">benchmark transfer</a>, <a href="https://medium.com/cubig-tech-blog/same-number-different-world-why-ai-accuracy-does-not-last-55da5c04220c">drift</a>, <a href="https://medium.com/cubig-tech-blog/same-test-different-score-why-a-benchmark-number-does-not-travel-d52870b6a9bd">score conditions</a>, <a href="https://medium.com/cubig-tech-blog/same-answer-different-judge-why-an-ai-score-is-not-neutral-1214275015f7">judges</a>, <a href="https://medium.com/cubig-tech-blog/same-zero-different-meaning-why-nothing-found-does-not-mean-nothing-there-8573f62235dc">empty results</a></li><li>Qazi et al., <a href="https://doi.org/10.1056/AIoa2501001">“Automation Bias in Large Language Model–Assisted Diagnostic Reasoning among Physicians Trained in AI Literacy”</a> (NEJM AI, 2026)</li><li>Schroeder et al., <a href="https://aclanthology.org/2025.findings-acl.1323/">“Just Put a Human in the Loop? Investigating LLM-Assisted Annotation for Subjective Tasks”</a> (Findings of ACL 2025)</li><li>Cursor, <a href="https://cursor.com/blog/real-time-rl-for-composer">“Improving Composer through real-time RL”</a> (2026)</li><li>Johansson et al., <a href="https://doi.org/10.1126/science.1111709">“Failure to Detect Mismatches Between Intention and Outcome in a Simple Decision Task”</a> (Science, 2005)</li><li>Wu, <a href="https://arxiv.org/abs/2603.08412">“Aligning to Illusions: Choice Blindness in Human and AI Feedback”</a> (preprint, 2026)</li><li>Yu et al., <a href="https://arxiv.org/abs/2606.22721">“Habituation at the Gate: Rising Approval and Declining Scrutiny in Human Review of AI Agent Code”</a> (workshop paper, 2026)</li><li>Yu, Liu, and Zhang, <a href="https://arxiv.org/abs/2609.06213">“Beyond Lexical Metrics: Sentence-Embedding Detection of Reviewer Habituation in AI Code Review”</a> (preprint, 2026), a reanalysis of the same reviews</li><li>Veselovsky et al., <a href="https://doi.org/10.1145/3685527">“Prevalence and Prevention of Large Language Model Use in Crowd Work”</a>(Communications of the ACM, 2025)</li><li>Kunilovskaya et al., <a href="https://arxiv.org/abs/2606.02255">“Who Annotates in NLP? A Large-scale Assessment of Human Annotation Reporting between 2018 and 2025”</a> (EMNLP 2026)</li><li>Longpre et al., <a href="https://doi.org/10.1038/s42256-024-00878-8">“A large-scale audit of dataset licensing and attribution in AI”</a> (Nature Machine Intelligence, 2024)</li><li>Feng et al., <a href="https://arxiv.org/abs/2406.07515">“Beyond Model Collapse: Scaling Up with Synthesized Data Requires Verification”</a>(ICLR 2025)</li><li>Williams et al., <a href="https://openreview.net/forum?id=Wf2ndb8nhf">“On Targeted Manipulation and Deception when Optimizing LLMs for User Feedback”</a> (ICLR 2025)</li><li>OpenAI, <a href="http://web.archive.org/web/20261023021757/https://openai.com/index/expanding-on-sycophancy/">“Expanding on what we missed with sycophancy”</a> (2025)</li><li>Vaccaro et al., <a href="https://www.nature.com/articles/s41562-024-02024-1">“When combinations of humans and AI are useful”</a> (Nature Human Behaviour, 2024)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f58df8fe0abd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/when-human-approval-becomes-data-f58df8fe0abd">When Human Approval Becomes Data</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GPT Created or Fixed Your Data. Is It Ready for AI?]]></title>
            <link>https://medium.com/cubig-tech-blog/gpt-created-or-fixed-your-data-is-it-ready-for-ai-66abce9f28e1?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/66abce9f28e1</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[synthetic-data]]></category>
            <dc:creator><![CDATA[Minchan Chung]]></dc:creator>
            <pubDate>Tue, 03 Nov 2026 19:08:33 GMT</pubDate>
            <atom:updated>2026-11-03T19:09:28.169Z</atom:updated>
            <content:encoded><![CDATA[<h3>GPT Can Create or Fix Your Data. Is It Ready for Your AI?</h3><h3>A banking experiment shows what still has to happen between a generated or revised file and data that works for a specific task.</h3><figure><img alt="A hand adds coral triangles to a sparse compartment in a tray, beside a pile of violet circles and a compartment of squares." src="https://cdn-images-1.medium.com/max/1024/1*d_T13C99BjATm2DAqKfBAQ.png" /><figcaption>Filling a gap is one part of preparing data for a task.</figcaption></figure><p>Imagine a team training an AI model on bank customer records. It has too few examples of customers who signed up for a term deposit, so it asks GPT or Claude: “Create more examples of these customers for training.” Or perhaps it already has plenty of records, but the model struggles to identify customers who signed up. The request becomes: “Look at what is wrong with our data and improve it for training.” In both cases, the team is turning to AI because its existing data is not giving it the results it needs.</p><p>Suppose the team receives the extra examples or a revised file. Someone still has to decide whether that data is suitable for training. If more customer examples have been added, they need to reflect the relevant characteristics of real customers. If fields have been removed or created, useful information must not have been lost. The team also needs to compare what happens after training: does the model identify more customers who signed up, and does it make more mistakes elsewhere? A changed file does not, by itself, show that the change helps the business.</p><p>What needs to change also depends on the job. When analysing completed sales calls, a team can use call duration. When deciding whom to call tomorrow, it does not yet know how long those calls will last. Including that field simply because it exists in historical records would let the model answer using information unavailable at the moment of the decision. Even with the same customer records, we need to understand what decision the team wants to make, and when, before choosing the examples and input fields.</p><h3>What changed in the banking experiment</h3><p>Our team’s <a href="https://cubig.ai/blogs/same-model-different-training-data-a-bank-marketing-experiment-uci-bank-marketing/">bank marketing data experiment</a> explored how this kind of preparation changes the results. We selected 15 of the 20 input fields for a predictive model called Random Forest and added 897 training examples of customers who had signed up — the less common group. We left the number of examples of customers who had not signed up unchanged. The preparation targeted the shortage.</p><p>We then kept the model settings the same and trained separately on the original and prepared data. Both versions were tested on the same 824 original records, rather than on newly generated examples. The number of customers who had signed up and were correctly identified rose from 31 to 56. But the number of customers incorrectly marked as having signed up also rose, from 16 to 39.</p><figure><img alt="Two stacked bars compare flagged bank records. Original data: 31 subscribers found and 16 false alarms, 47 flags in total. Prepared data: 56 subscribers found and 39 false alarms, 95 flags in total." src="https://cdn-images-1.medium.com/max/1024/1*0vVAQJRPDh4mCLm6yWF4YA.png" /><figcaption>On the same 824 original evaluation records, prepared training data found 25 more subscribers and added 23 false alarms. The Random Forest settings stayed the same, with each model trained separately. Call duration was included, so this was post-call classification.</figcaption></figure><p>Finding more customers who had signed up looks encouraging, but the extra mistakes matter too. That is why data preparation needs to include a comparison of the results. In this experiment, we selected fields and added examples together, so we cannot isolate how much each step contributed. The inputs also included call duration. These results should not be read as evidence that we selected better people to call tomorrow.</p><h3>The work behind “fix our data”</h3><p>Working through these choices reveals how much sits inside a request to “make more data” or “fix our data.” We need to establish which customers the company wants to distinguish, when it will make the decision, and which relationships must be preserved when the data changes. Those conditions give us a basis for judging whether the revised data fits the job.</p><p>A team can use GPT or Claude to build this process itself. That means connecting the request to generate or revise data with the selection of input fields and a comparison under the same conditions. The work continues beyond receiving a new file: it has to become usable training data, and its effect has to be checked.</p><p>That is why we built software to select relevant fields, supplement missing examples and compare the results before and after preparation as one connected process. In the banking experiment, it produced the revised training data, the comparison results and the code needed to rerun that comparison. The team could inspect the prepared data and its results without first implementing the method from scratch after reading a recommendation.</p><p>We are now refining how the company’s own requirements enter that work. Someone predicting before a call needs different inputs from someone analysing records after it. We want a customer to explain the job, then have the software fill the gaps, adapt the existing data and check whether the result has improved. That is the scope of the work we are building into the software.</p><p>I’m Minchan Chung, co-founder and co-CEO of <a href="https://cubig.ai/">CUBIG</a>. I write about the data work behind AI.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=66abce9f28e1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/gpt-created-or-fixed-your-data-is-it-ready-for-ai-66abce9f28e1">GPT Created or Fixed Your Data. Is It Ready for AI?</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hold the Model Still: What Five Experiments Show About AI-Ready Data]]></title>
            <link>https://medium.com/cubig-tech-blog/hold-the-model-still-what-five-experiments-show-about-ai-ready-data-14abde64f656?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/14abde64f656</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[ai-ready-data]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[enterprise-ai]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[BG Yoo]]></dc:creator>
            <pubDate>Tue, 03 Nov 2026 06:45:28 GMT</pubDate>
            <atom:updated>2026-11-03T06:45:28.669Z</atom:updated>
            <content:encoded><![CDATA[<p>On five public datasets, we kept each model’s settings and the evaluation records fixed, and changed the data preparation. Here are the results, the trade-offs, and what they suggest about AI-ready data.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_KrCdnbzAyClg4UJo2mpZw.png" /></figure><p>Ask a room of data leaders what AI-ready data means. The answers might range from a modern data foundation and a governed lakehouse to a catalog with lineage or a semantic layer for agents.</p><p>A data foundation decides where data lives, who can use it, and what it means across the business. Most AI work depends on it.</p><p>Foundations are not built primarily around a narrower question. For this task, with this model, how much does preparing the data change the result? When the model and the data change together, it becomes harder to tell which change contributed to the result.</p><p>In these experiments, we held the model settings fixed.</p><h3>The setup</h3><p>We picked five public datasets from the UCI Machine Learning Repository. Each is a yes-or-no prediction task where the class that matters is the smaller one: companies that go bankrupt, customers who subscribe or leave, bidders who cheat, trees that are diseased.</p><p>For each dataset, we compared four models. Each model was trained twice with the same settings: once on the baseline training data, and once on training data prepared in Syntitan for that task. Both versions were scored on the same evaluation records. The decision threshold stayed at 0.5 in every before-and-after comparison. Feature transformations set during preparation were also applied to the evaluation inputs, as any model in use would need. The preparation itself differed by model and by dataset.</p><p>The goal was to measure the change associated with data preparation under fixed model settings.</p><h3>The results</h3><p>Across twenty model and dataset comparisons, F1 improved in 16 and did not change in 4. The first chart highlights one selected model from each of four datasets. Shill Bidding is discussed separately below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EbCxpwCTyuTagNjpMdI5YQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3Ar0hNY0PqbKNwKDrBw6Vg.png" /></figure><p>Three of the four unchanged results came from cases where Syntitan did not adopt any additional preparation, so the data before and after was the same. Shill Bidding is left out of the first chart. Its logistic regression improvement was observed on a split with overlapping auctions and bidders, and identifier-feature ablation remains outstanding.</p><h3>What the experiments show about AI-ready data</h3><p>Read together, the results suggest how to judge whether data is ready for AI.</p><h3>1. Data preparation can be evaluated under fixed model settings</h3><p>With the model settings held fixed, the change between the two runs is associated with how the data was prepared. On Iranian Churn, logistic regression with the same settings identified 78.8% of the customers who left, up from 42.4%.</p><p>This adds a task-level result to the data foundation discussion: a measured change on one task, linked to data preparation.</p><h3>2. Readiness depends on the task and its acceptance criteria</h3><p>In all four comparisons in the table, the number of false alarms grew. Precision fell on Polish bankruptcy, Bank Marketing and Iranian Churn. On Wilt, precision rose, but the model also flagged more segments that were not diseased.</p><p>The right trade-off depends on the work. A screening team may prioritize fewer missed cases, while another may have limited capacity to review what gets flagged. The same result can pass one team’s criteria and fail another’s. These experiments did not measure those costs. They show the trade-off a team would have to judge.</p><p>An improvement is evidence to consider, not an automatic pass. Readiness depends on whether the result meets the task’s acceptance criteria.</p><h3>3. Data preparation is another lever to test</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rFvhJYJvopDccR1xERIb6w.png" /></figure><p>On the Polish bankruptcy data, the baseline random forest was precise but missed most failures: precision 93.1%, recall 26.2%, F1 0.41. Teams often reach for more tuning or a different model at that point. With the model settings unchanged, prepared data raised F1 to 0.61 and recall to 48.5%.</p><p>These results support testing data preparation alongside threshold tuning and class weighting, although we did not compare those approaches.</p><h3>4. Readiness needs evidence from the task</h3><p>The preparation was specific to each case:</p><ul><li>Polish bankruptcy, random forest: 20 derived features added, and positive training records augmented.</li><li>Bank Marketing, random forest: 15 of 20 input variables selected, and 897 positive training cases added.</li><li>Iranian Churn, logistic regression: new features generated and the minority class augmented, adding 515 training rows.</li></ul><p>None of these changes shows, by itself, that the result improved. The evidence is the comparison on the same evaluation records, read against the task’s criteria.</p><p>The evidence also applies only to the setup it was measured on. When the data, the model or the criteria change, the earlier run no longer covers the new setup. It becomes the reference for a new comparison.</p><h3>What these results do not show</h3><p>These are small, controlled experiments. They support the four points above and should not be read as more than that.</p><ul><li>They use public datasets. They are not customer results, and enterprise data may behave differently.</li><li>Each result comes from a single train and test split. Rerunning the same script reproduces that split. It does not show stability across multiple splits or random seeds, which we have not yet tested.</li><li>The Wilt evaluation set has 15 positive image segments. Recall of 100% means all 15 were found. One miss would change the figure by almost 7 points.</li><li>Bank Marketing inputs include call duration, which is known only after a call ends. The result should not be read as performance for choosing whom to contact in advance. On the same comparison, F1 rose while ROC-AUC and average precision fell.</li><li>In the Shill Bidding split, training and evaluation records share the same auctions and bidders. Performance on unseen auctions has not been established.</li></ul><h3>Running the same check on your own data</h3><p>We ran these comparisons through Ready for Model in Syntitan, CUBIG’s AI-ready data platform, without writing code. The downloadable kits provide scripts for independently rerunning training and scoring.</p><p>The workflow runs through clicks. You upload a dataset and choose the task and the model. Syntitan works on a copy, so the original dataset stays as it was. It prepares the training data, trains the model with the same settings on the baseline and the prepared data, and scores both on the same evaluation records.</p><p>You then judge the before-and-after result against your task’s criteria, including what it costs in false alarms. Results are kept as versions, so a later comparison can use an earlier run as its reference.</p><p>In our runs on datasets of this size, preparation and comparison finished within minutes. Runtime varies with dataset size, preparation steps and model choice.</p><p>You can try it on your own data at <a href="https://syntitan.ai">syntitan.ai</a>.</p><h3>The question after the foundation</h3><p>The data foundation conversation is about where data lives, who can reach it, and what it means. Those questions need answers first.</p><p>The next question is narrower. For this task, how much did preparing the data change the result, at what cost, and does it meet the criteria? And can you run that comparison again after something changes?</p><p>Holding the model still is one way to start answering it.</p><h3>Sources</h3><p>Full experiment write-ups and downloadable four-model kits:</p><ul><li><a href="https://cubig.ai/blogs/uci-wilt-dataset-diseased-tree-detection/">UCI Wilt Dataset: Logistic Regression F1 from 0.11 to 0.77 with Syntitan</a></li><li><a href="https://cubig.ai/blogs/uci-shill-bidding-dataset-fraud-detection/">UCI Shill Bidding Dataset: Improving Auction Fraud Detection F1 from 0.91 to 0.96</a></li><li><a href="https://cubig.ai/blogs/uci-polish-companies-bankruptcy-dataset/">UCI Polish Companies Bankruptcy Dataset: Improving Prediction F1 from 0.41 to 0.61</a></li><li><a href="https://cubig.ai/blogs/iranian-telecom-customer-churn-prediction-improving-f1-from-0-56-to-0-72/">UCI Iranian Churn Dataset: Improving Customer Churn Prediction F1 from 0.56 to 0.72</a></li><li><a href="https://cubig.ai/blogs/same-model-different-training-data-a-bank-marketing-experiment-uci-bank-marketing/">Bank Marketing Dataset: Improving Random Forest F1 with Syntitan</a></li></ul><p>Datasets, from the UCI Machine Learning Repository:</p><ul><li>Tomczak, S. (2016). Polish Companies Bankruptcy [Dataset]. UCI Machine Learning Repository. <a href="https://doi.org/10.24432/C5F600">https://doi.org/10.24432/C5F600</a></li><li>Johnson, B. (2013). Wilt [Dataset]. UCI Machine Learning Repository. <a href="https://doi.org/10.24432/C5KS4M">https://doi.org/10.24432/C5KS4M</a></li><li>Moro, S., Rita, P., &amp; Cortez, P. (2014). Bank Marketing [Dataset]. UCI Machine Learning Repository. <a href="https://doi.org/10.24432/C5K306">https://doi.org/10.24432/C5K306</a></li><li>Iranian Churn [Dataset]. (2020). UCI Machine Learning Repository. <a href="https://doi.org/10.24432/C5JW3Z">https://doi.org/10.24432/C5JW3Z</a></li><li>Shill Bidding Dataset [Dataset]. (2020). UCI Machine Learning Repository. <a href="https://doi.org/10.24432/C5Z611">https://doi.org/10.24432/C5Z611</a></li></ul><p>All five datasets are licensed under CC BY 4.0. Prepared derivatives were used.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=14abde64f656" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/hold-the-model-still-what-five-experiments-show-about-ai-ready-data-14abde64f656">Hold the Model Still: What Five Experiments Show About AI-Ready Data</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[You Changed the Model. What Else Changed?]]></title>
            <link>https://medium.com/cubig-tech-blog/you-changed-the-model-what-else-changed-8ba8da7ffd86?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/8ba8da7ffd86</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[towards-data-science]]></category>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Minchan Chung]]></dc:creator>
            <pubDate>Thu, 29 Oct 2026 17:06:01 GMT</pubDate>
            <atom:updated>2026-10-29T18:38:06.269Z</atom:updated>
            <content:encoded><![CDATA[<h3>How to compare old and new models when someone has also rebuilt the search index.</h3><figure><img alt="A tabletop machine has two oversized knobs labelled Model and Data, both shown turning. It prints a paper slip with a question mark beneath the headline Which Change Did It?" src="https://cdn-images-1.medium.com/max/1024/1*naN5HRtWRwJUMjlUB-TEDQ.png" /><figcaption>When the model and its data change together, a different answer does not tell you which change produced it.</figcaption></figure><p>A replacement model gets a lower score on the same test set. Before anyone starts rewriting the prompt, I would ask what else changed between the two evaluations.</p><p>Consider a fictional technical-support assistant that answers questions from equipment manuals. The team switches models while another team rebuilds the search index, adding manuals for newer equipment and changing the passage boundaries. The evaluation questions stay untouched. Answers about maintenance procedures get worse.</p><p>That result gives the team a reason to investigate. It gives them very little basis for blaming the replacement model. The answer may have been generated from a different manual, or from a passage that now stops before an important qualification.</p><h3>What stayed the same?</h3><p>An evaluation file can be unchanged while the workload it exercises has moved on. The questions are only the starting point. An assistant may retrieve passages, look up reference tables and call tools before producing its answer.</p><p>I would want a record of the source documents, index configuration, filters and reference tables used in the test. I would also preserve the prompt, tool definitions and relevant preprocessing code. For calls into a changing external service, captured responses can support an offline replay, provided the test does not need to reproduce the service’s live behaviour.</p><p><a href="https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/model-migration">Microsoft’s migration guidance</a> recommends holding inputs, expected answers and success criteria fixed, then replaying the existing workload on the replacement before tuning it. For a retrieval-based assistant, applying that advice requires attention to the material fetched during execution as well as the questions in the test file.</p><p>There is a deadline to this work if the old model is being withdrawn. Run and save the baseline while access remains. An old score without its inputs and outputs is a poor substitute. Once the model is unavailable, you cannot generate a fresh result from it to fill a gap in the comparison.</p><p>The baseline also needs to meet an agreed standard. Reproducing an old mistake is not a successful migration. For a maintenance question, the reference should identify the relevant equipment revision and the required steps. The old model’s answer is useful evidence about past behaviour; it is not automatically the correct answer.</p><h3>Three configurations, with a narrower question for each</h3><p>For the support assistant, I would start with three configurations. This is a comparison plan, not a claim that three individual calls are enough.</p><p>A uses the current model with the preserved documents and index. This is the baseline.</p><p>B uses the replacement model with that same data setup. Keep the application prompt, tools and retrieval configuration unchanged where compatible. Record any required adapter or parameter changes; if those also change behaviour, the comparison is between configurations rather than an isolated model swap.</p><p>C keeps the replacement setup from B and introduces the rebuilt index. B to C measures what that index change does with the replacement in place.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SbU8fJo8x_-509z9ZoV1DQ.png" /><figcaption>A controlled comparison keeps the data setup fixed where components are compatible. Saved passages can support a narrower test of generation; a full agent may still retrieve different evidence.</figcaption></figure><p>Repeat each configuration enough to understand ordinary variation, and compare the same cases using the same criteria and evaluator. If model-based grading is involved, preserve that grader’s configuration too. A small movement in the average may disappear across repetitions; a recurring failure on one equipment family may remain worth fixing.</p><p>If B behaves similarly to A but C repeatedly misses the same instruction, inspect the passages returned by the rebuilt index first. If B already fails with the old index, the replacement configuration needs attention. Save those cases before tuning anything; they give the next experiment a stable starting point.</p><p>The limits matter. A to B estimates the model change under the old data setup. B to C estimates the data change under the new model. They do not establish that the data change would affect every model equally. Testing the old model with the new index, when possible, adds the missing comparison and helps reveal an interaction.</p><p>The broader migration practice has a useful precedent. In a <a href="https://careersatdoordash.com/blog/best-practices-for-regression-free-machine-learning-model-migrations/">2021 engineering article</a>, DoorDash described moving risky components sequentially and checking metrics after each change. That was an ML service migration, not an LLM experiment, but the sequencing makes a regression easier to locate.</p><h3>The same index does not guarantee the same evidence</h3><p>An agent may write its own search queries. Change the model and it may ask the same index a different question, retrieving different passages. That can be part of the model change’s effect on the complete workflow. It does not automatically mean someone changed the underlying data.</p><p>Saving the retrieved passages helps separate these questions. Feed both models identical saved passages and you can examine answer generation with the evidence held fixed. Let each model retrieve through the same tools and you are testing the wider workflow. Both are useful; the result should say which experiment you ran.</p><p>Some migrations do not permit a neat intermediate configuration. Replacing an embedding model may require rebuilding the index. Keep the source documents and evaluation cases fixed where possible, but assess that migration as a combined retrieval-system change. A better final answer alone cannot tell you how much came from the embedding model and how much from the rebuilt index.</p><p>If the previous index was overwritten and cannot be recovered, record that limitation. Historical traces may still help explain individual failures. They do not recreate an end-to-end baseline that no longer exists.</p><h3>Before changing the prompt</h3><p>I would take one failed maintenance question and put the two execution records beside each other: model version, application configuration, index version, retrieved passages and final answer. Then I would run the missing comparison while the old setup is still available. That gives the engineer a specific next experiment, before an afternoon of prompt edits makes the original difference harder to recover.</p><p>I’m Minchan Chung, co-founder of CUBIG. I write about AI-ready data and what I’m learning while building the company. New essays every Tuesday and Thursday. Follow me on Medium to read the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8ba8da7ffd86" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/you-changed-the-model-what-else-changed-8ba8da7ffd86">You Changed the Model. What Else Changed?</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Thousand More Examples of the Wrong Thing]]></title>
            <link>https://medium.com/cubig-tech-blog/a-thousand-more-examples-of-the-wrong-thing-4246c090394c?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/4246c090394c</guid>
            <category><![CDATA[synthetic-data]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[ai-ready-data]]></category>
            <dc:creator><![CDATA[Minchan Chung]]></dc:creator>
            <pubDate>Tue, 27 Oct 2026 17:06:01 GMT</pubDate>
            <atom:updated>2026-10-27T17:16:00.765Z</atom:updated>
            <content:encoded><![CDATA[<h3>Deciding what to generate, what to collect, and what still needs an expert’s judgment.</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*my85bhSTc2G274Cl3ffHJQ.png" /><figcaption>A conceptual illustration of a crack and a reflection.</figcaption></figure><p>If an inspection model misses a crack, “generate more cracked caps” sounds reasonable. I’d want to see what it called a crack before commissioning that work.</p><p>Suppose the model also rejects intact caps whenever the light catches their surface. A folder full of dramatic cracks might give it more examples of damage while doing very little about the distinction that is causing trouble.</p><p>This is a fictional production line. The decision is whether the next batch should add variations we can already describe, or wait for observations we still need to make.</p><p>That gap matters when someone has to approve the budget. More examples of a known condition, observations of an unfamiliar condition, and a reliable answer about whether something is defective are different things to buy.</p><h3>What the generator has been asked to assume</h3><p>Start with the development examples: missed defects, false alarms, and images the inspectors themselves find ambiguous. The final test set stays out of this discussion. Once it starts shaping the generation request, it is no longer an untouched test.</p><p>An inspector may know that a particular crack follows the rim, that its appearance changes with viewing angle, and that certain surface marks are acceptable. Those are useful constraints. They give the generation work something firmer than a request for images that look damaged.</p><p>The request could cover that crack under the camera views and lighting range used on the line. It should also include intact caps under troublesome reflections. Otherwise, the training material may make a shortcut available: a bright streak or an unusual surface texture becomes a convenient proxy for damage.</p><p>I would also write down what to leave out. A crack cannot float above the cap. A reflection should not acquire the physical edges of a break. Randomly combining every defect, material, angle, and lighting condition can produce a large collection of scenes that the actual process could never create.</p><p>This still leaves room for generation. Once the relevant geometry and operating conditions are understood, varying them deliberately can be more practical than waiting for every combination to turn up on the line. I would treat the generated examples as candidates to inspect and test, with their assumptions attached.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*grsb5l3dGREfJf8Za-DXCQ.png" /><figcaption>For the fictional inspection project, capture the unfamiliar finish under the installed camera before deciding which variations to generate.</figcaption></figure><p>The harder case is a material finish nobody has photographed yet, or a failure mode nobody understands. A generator can fill those gaps with plausible images. It cannot tell us whether the invented appearance matches what the new material will do under the installed camera.</p><p>For that gap, I would buy time with the physical setup: photograph the material, examine actual failures, or run a controlled capture. The resulting collection might be small. Its value is that it tells us which variations are worth generating next.</p><h3>Some gaps sit in the label</h3><p>If two inspectors disagree about whether a mark makes a cap unacceptable, generation can wait.</p><p>Perhaps the mark is cosmetic. Perhaps its significance depends on depth, which the current camera cannot show. Perhaps the acceptance rule has never been made explicit. Giving thousands of generated variations a confident “defect” label would bury that unresolved decision inside the training set.</p><p>Someone needs to settle the rule, obtain another measurement, or retain an uncertain category. The right expense may be an expert’s inspection time or a different sensor. A larger dataset will not reveal a depth measurement absent from the input.</p><p>Access restrictions create a different kind of shortage. If existing images cannot be used, the permission and handling requirements need attention before they become generator inputs. Producing synthetic outputs does not, by itself, establish permission to use the source material.</p><p>These distinctions affect the delivery plan. One team needs useful variation around a known case. Another needs to discover what the case looks like. A third still needs an agreed label. Quoting all three a price per thousand images conceals most of the work.</p><h3>Keep a piece of the real world outside the loop</h3><p>Suppose the team now has a credible generation brief. The next temptation is to balance the data, split it, and report the improved score. That can make the test easier in ways that have little to do with catching defects on the line.</p><p>The <a href="https://scikit-learn.org/stable/common_pitfalls.html#data-leakage">scikit-learn guidance on data leakage</a> explains why data should be split before fitting preprocessing steps, and why test data must not influence model choices. I would apply that boundary to the generation workflow too: reserve the real test material before fitting or tuning the generator and classifier.</p><p>For this example, that also means keeping related captures of the same physical cap together. Nearly identical images on both sides of a split would give a misleading impression of how well the system handles an unseen item.</p><p>The <a href="https://imbalanced-learn.org/stable/common_pitfalls.html#data-leakage">imbalanced-learn documentation</a> adds a useful warning: resampling before the split can leak information and leave the test set with a class mix unlike actual use. A balanced test of generated cracks and generated intact caps cannot tell a factory how many good caps its system will reject in an ordinary shift.</p><p>I would keep real captures at the ordinary operating mix for that question, alongside a separately reported set of confirmed rare defects. Compare the existing model with the augmented version under the same evaluation conditions. Count missed defects and rejected good caps separately; an average can hide an expensive trade.</p><p>If too few real defects are available to make that comparison credible, the conclusion stays limited. Synthetic stress cases can help explore behaviour, but they do not supply the missing evidence of field performance.</p><p>For the fictional cap project, my first order would therefore be small: generate variations of the confirmed rim crack within the documented camera and lighting conditions, include intact caps with glare, and exclude unsupported materials and ambiguous labels. In parallel, photograph the unfamiliar finish on the actual setup. I would decide the next generation batch after seeing those captures.</p><p>I’m Minchan Chung, co-founder of CUBIG. I write about AI-ready data and what I’m learning while building the company. New essays every Tuesday and Thursday. Follow me on Medium to read the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4246c090394c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/a-thousand-more-examples-of-the-wrong-thing-4246c090394c">A Thousand More Examples of the Wrong Thing</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Log Is Confidential. The AI Still Needs It.]]></title>
            <link>https://medium.com/cubig-tech-blog/the-log-is-confidential-the-ai-still-needs-it-3e9775a18fc6?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/3e9775a18fc6</guid>
            <category><![CDATA[ai-ready-data]]></category>
            <category><![CDATA[enterprise-ai]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[data-privacy]]></category>
            <dc:creator><![CDATA[Minchan Chung]]></dc:creator>
            <pubDate>Thu, 22 Oct 2026 16:01:01 GMT</pubDate>
            <atom:updated>2026-10-22T16:01:01.707Z</atom:updated>
            <content:encoded><![CDATA[<h3>Context-preserving protection for the operational data that machines exchange — and AI is asked to interpret.</h3><figure><img alt="An industrial conveyor carries manufactured parts while its connected controller produces an oversized ribbon of operating records labelled Confidential. The headline reads The Factory’s Other Output." src="https://cdn-images-1.medium.com/max/1024/1*xvy5gA1kvC1elLH1E2a9Qg.png" /><figcaption>Machines also produce records of how a business operates. This editorial metaphor represents operational data, not a particular logging system or product.</figcaption></figure><p>The log that helps explain a stalled production line may also reveal how that factory operates: its equipment, production rhythm and downtime. A company can have good reasons to restrict that information and an equally good reason to use it in an AI investigation.</p><p>That is the difficulty I want to examine here: preparing confidential operational data so an AI can still perform a specific job. Much of this information was never typed into a chat box. It was exchanged between machines, controllers, warehouse systems and network services long before anyone decided to use AI.</p><h3>Two sends, one recorded completion</h3><p>Consider a fictional factory. A controller sends an instruction to a machine. The machine records the operation as completed, but the controller times out waiting for an acknowledgement and sends the instruction again. The second response says that the operation has already been completed.</p><p>An engineer asks an AI to check whether these records show two completed executions. The records contain two send attempts, one completion event and the response to the retry. The operation reference connects them. Each event also has its own identifier, and the meaning of each event type is defined in the system’s documentation.</p><p>Replace every machine reference with the same generic label, DEVICE, and different machines can collapse into one. Replace the same operation reference independently each time it appears, and the retry may look like an unrelated instruction. Strip out the event types, and counting rows becomes a poor substitute for counting executions. A chronological list alone does not establish causation either.</p><p>In this example, the prepared records should support a narrow answer: one completion is recorded, followed by a retry of the same operation. Whether the physical machine behaved exactly as recorded is a further question requiring appropriate evidence.</p><figure><img alt="A continuous industrial log ribbon crosses a workbench. Coral sleeves cover selected fields while an unbroken purple thread connects its sections, beneath the headline Keep the Connection." src="https://cdn-images-1.medium.com/max/1024/1*6k7xthnEWfCnFU9GtwYJQg.png" /><figcaption>Context-preserving preparation retains the relationships a task needs. Those relationships and the remaining values still need review for confidential operating patterns.</figcaption></figure><h4>What context-preserving has to preserve</h4><p>I use context-preserving to mean keeping the relationships and meaning a particular task needs while applying the organisation’s protection rules. For this investigation, that includes which events belong to one operation, which machine and session they concern, their sequence, and the difference between sending an instruction and completing it.</p><p>Consistent substitutes can retain those connections without exposing the original names. But the mapping needs to respect the identifier’s type and scope. A request number reused after a controller restarts cannot safely be treated as a unique identifier across all history. Nor should an event identifier and an operation identifier be treated as interchangeable.</p><p>Even time has more than one meaning in telemetry. <a href="https://opentelemetry.io/docs/specs/otel/logs/data-model/">OpenTelemetry’s log model</a> distinguishes an event’s timestamp from the time it was observed by the collection system. Substituting collection time for event time can change the apparent order of delayed records. If clock alignment across devices is uncertain, the prepared data should retain that uncertainty rather than imply a precise sequence.</p><p>A logistics investigation might need to connect a scanner reading, a warehouse transfer and a carrier update for the same shipment. A telecom investigation might need to distinguish an alarm and maintenance on the same circuit from two nearby events on different circuits. Removing the relationships can remove the reason those records were useful together.</p><p>For this investigation, preparation applies to records supplied to AI; it leaves the commands controlling the machine untouched. The protection boundary belongs before an API response, retrieved log segment or tool result reaches a destination that must not receive the originals. Checking only the employee’s written question leaves all that machine-generated material outside the review.</p><h3>The pattern may be the secret</h3><p>An alias does not conceal a factory’s output if the production counts remain visible. Event intervals may reveal shift patterns or downtime. Repeated connections between pseudonymous devices may still reveal network topology. The information the company fears disclosing may contain no personally identifiable information at all.</p><p>This is where a protection policy needs the people who understand the operation. They can identify commercially sensitive details such as a production recipe, a customer’s route or a proprietary fault code. <a href="https://opentelemetry.io/docs/security/handling-sensitive-data/">OpenTelemetry’s guidance on sensitive data</a> makes the responsibility explicit: the organisation has to determine what is sensitive in its own context. A detector’s default categories cannot settle that question.</p><p>Some facts also cannot be changed independently without changing the answer. Replace a measured value but keep its threshold, and an alert may disappear. Alter time gaps independently and a timeout investigation may produce a different conclusion. Restoring the original identifiers afterwards cannot repair reasoning based on altered measurements.</p><p>There is a real constraint when the pattern needed for the task is itself confidential. One option is to calculate a limited result inside the permitted environment, then expose only what the next step needs. A system could supply a reviewed timeout classification instead of the underlying timings. That supports a routing task; it may be insufficient for diagnosing the timeout.</p><p>Another is to run the investigation where the necessary detail is permitted to remain. The choice depends on the job, the recipient and the company’s restrictions. Context-preserving preparation cannot promise to reveal a confidential pattern for analysis and simultaneously make that same pattern invisible to the analyst.</p><h3>Keep a counterexample beside the rule</h3><p>For the factory example, I would review the protected records with the engineer who understands the event schema. Can we still distinguish the original instruction, its retry and the single completion? Can we reconnect the finding to the right operation inside the permitted environment? Separately, what can the receiving system infer about production from the remaining fields?</p><p>Then I would add a second trace with two separate operations, each with its own completion, and another in which a request number is reused in a new session. The prepared records must leave those cases distinguishable. If all three look like the same tidy log, I would take that log back to the preparation step before asking the AI to explain it.</p><p>I’m Minchan Chung, co-founder of CUBIG. I write about AI-ready data and what I’m learning while building the company. New essays every Tuesday and Thursday. Follow me on Medium to read the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3e9775a18fc6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/the-log-is-confidential-the-ai-still-needs-it-3e9775a18fc6">The Log Is Confidential. The AI Still Needs It.</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Same Zero, Different Meaning: Why Nothing Found Does Not Mean Nothing There]]></title>
            <link>https://medium.com/cubig-tech-blog/same-zero-different-meaning-why-nothing-found-does-not-mean-nothing-there-8573f62235dc?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/8573f62235dc</guid>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[ai-ready-data]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Hyungyu Lee]]></dc:creator>
            <pubDate>Thu, 22 Oct 2026 12:56:01 GMT</pubDate>
            <atom:updated>2026-10-22T12:56:01.477Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dlNaQfZwglwfZ8h0PQi0SA.png" /></figure><p>In August 2023 a deadline passed with little notice outside government. United States federal agencies were to have reached what the Office of Management and Budget calls the advanced tier of event logging, the level at which “logging requirements at all criticality levels are met.” Auditors went and counted. <strong>Three of the 23 agencies had made it.</strong> <strong>Seventeen were at tier 0</strong>, a level the same scale calls not effective, where logging requirements of the highest criticality “are either not met or are only partially met” (<a href="https://www.gao.gov/assets/d24105658.pdf">GAO, 2024</a>).</p><p>Now think what any of those seventeen can report, truthfully, at the end of a quarter. No intrusion was detected. The sentence is accurate. It is also, for seventeen of them, a statement about their own logging rather than about their networks. <strong>Those are two different statements, and nothing in the sentence tells them apart.</strong></p><p>This piece is about that gap, between “there is nothing there” and “nothing came back.” <strong>It is not an argument for distrusting data.</strong> It is about something narrower: every look at data passes through something, and some of those things have no way to say what they left out.</p><p>One disclosure, since instruments are the subject. I use Claude in my own work, including this piece, and both of the failures I describe from my own desk came out of that arrangement: a tool read on my behalf, handed back a result, and I took the result for the territory. That is the ordinary arrangement now, which is part of why I think the question is getting harder. <a href="https://medium.com/cubig-tech-blog/same-test-different-score-why-a-benchmark-number-does-not-travel-d52870b6a9bd">The fourth piece in this series</a> was about the conditions attached to a benchmark score; this one sits earlier, before any number exists, at the read that produced it.</p><h3>1. Every read is a window</h3><p>Nobody reads a dataset. People read a query, a preview, a sample, a default, and the thing they read stands in for the thing they meant.</p><p>Consider how a column gets its type. Load a file into a warehouse without declaring a schema and the service works the type out: “BigQuery selects a random file in the data source and scans up to the first 500 rows of data to use as a representative sample” (<a href="https://cloud.google.com/bigquery/docs/schema-detect">Google Cloud, 2026</a>). That is a reasonable engineering choice and it is documented. It also means the type of a column with forty million rows is a claim made on the strength of five hundred, and whatever lives past row five hundred has to fit a decision made before it was seen.</p><p>That decision does not stay abstract. Once a column has a type, the values that contradict it have to go somewhere, and the options are all lossy: a rejected row, a null, or a quiet coercion into something that parses. What no documentation can supply is which columns in a particular file were decided on unrepresentative evidence, since answering that would mean reading the rows the sampler chose not to read. The sample is not a summary of the data. As far as the schema is concerned it is the data, and the rest of the file arrives afterward to be judged by it.</p><p>Or consider capacity. Between September 25 and October 2, 2020, England’s public health agency left 15,841 positive test results out of its daily figures and out of the queue its contact tracers worked from. The official account is undramatic: “some files containing positive test results exceeded the maximum file size” (<a href="https://www.gov.uk/government/news/phe-statement-on-delayed-reporting-of-covid-19-cases">PHE, 2020</a>). Note what the statement does not report. It names no error, and the gap ran from 25 September until the problem was found overnight on 2 October. The load kept running, and it ran with less in it.</p><p>I have my own version, smaller and more embarrassing. I pulled a project’s work items through an interface that follows direct children, looked at what came back, and wrote down that the ticket structure was thin. Months later I pulled the same tree with the traversal fixed. Seventy-three items, 41 percent of the total, had never been in the first result. <strong>My read was thin, not the structure, and it had returned something clean and complete-looking, which is what made it convincing.</strong></p><p>A month later the same mistake hardened into policy. A tool’s help output prints a summary block. I read it, found no command for the thing I wanted, and wrote the absence into a standing rule. The summary lists 44 subcommands. The tool has 88.</p><p><strong>What a window drops is invisible for exactly the reason the window is useful: it is all there is to look at.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WDev1CNtkWc21TNKm9Q9JA.png" /></figure><h3>2. Windows that can speak, and windows that cannot</h3><p>There is a fair objection here, and it needs answering first, because the answer is most of the argument.</p><p>Tools do warn. Open an oversized file by hand in a spreadsheet and it says it is truncating. A modern import path returns an explicit error saying the data will be cut. One technical walkthrough of the England case argues exactly this: the 65,536-row ceiling in that older spreadsheet format “is not something that should stop an experienced VBA developer” from importing a file of any size, and the loss belongs instead to an import process that was not correctly designed and tested (<a href="https://blogs.city.ac.uk/cityshortcourses/2020/10/13/what-really-caused-the-excel-error-in-nhs-test-and-trace-covid-19-system-an-in-depth-technical-analysis/">Dimakopoulos, 2020</a>). I think that is right, and it sharpens the point rather than blunting it. <strong>The warning was written for a person opening a file, and in the path that actually ran there was no person.</strong></p><p>The second objection is stronger. Operations has a louder failure than silence: alerts fire, queues fill, and the one that mattered gets closed alongside the hundred that did not. That one is real, and it is not the failure this piece is about. Its remedies are different ones, and I have nothing to add to them.</p><p>Setting both aside leaves a narrower class, with three recognizable shapes:</p><ul><li><strong>A warning routed to someone who has left the path.</strong> The message exists. The recipient is a script.</li><li><strong>A record whose format has no field for the event.</strong> The log is complete, in the sense that it contains everything it is capable of containing.</li><li><strong>A query that returns nothing and no error.</strong> One engine’s documentation puts it flatly: if a subquery yields any NULL at all, NOT IN “will always evaluate to NULL or FALSE, never TRUE” (<a href="https://mariadb.com/docs/server/reference/sql-statements/data-manipulation/selecting-data/subqueries/subqueries-with-in-and-not-in">MariaDB, 2026</a>). Valid syntax, correct engine, empty result, nothing wrong anywhere.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mWVRVbcHTy1JhrjRncp8Xw.png" /></figure><p>What the three share is not that the information was never created. In the first it was created and handed to nobody; in the other two it was never created at all. What they share is that the output cannot carry it either way. The notice is not sitting unread in a queue, waiting for a more diligent reader.</p><p><strong>Attention is the wrong instrument here, because the loss is not recorded anywhere a reader can go.</strong></p><h3>3. The most dangerous output is nothing</h3><p>A wrong number at least has neighbors. It sits in a column beside other numbers, the comparison that might expose it is free, and that is how some of them get caught. Nothing sits beside an empty result. The only thing left to check it against is an expectation, and the expectation was what the read was supposed to supply. So it passes. It looks like an answer.</p><p>On February 15, 2020, a patient was evaluated at a California hospital and COVID-19 “was not suspected, as the patient denied travel or contact with symptomatic persons.” The guidance in force pointed clinicians toward respiratory illness plus travel to an affected area or a link to a confirmed case. The positive result came back on February 26. In the eleven days between, 121 health care personnel were exposed to the patient; 43 developed symptoms and were tested, and three of them had positive results (<a href="https://www.cdc.gov/mmwr/volumes/69/wr/mm6915e5.htm">CDC, 2020</a>). The report documents one patient and the people around them, not what a county did or did not know, so what follows is my reading rather than its finding. <strong>For those eleven days, the absence of a detected community case was a fact about the testing criteria and an open question about the county.</strong></p><p>The cleanest demonstration is older. For about ten months a tool on Equifax’s network, installed to inspect traffic for signs of attack, was inspecting nothing, because a certificate it needed had expired. Auditors later found the attacker had been able to “run commands and remove stolen data over an encrypted connection without detection” throughout (<a href="https://www.gao.gov/assets/gao-18-559.pdf">GAO, 2018</a>). An administrator replaced the certificate, and the signs of the intrusion showed up the same day. The instrument had not been reporting quiet. It had not been reporting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DMZKYpo76lgDGhW86BYudw.png" /></figure><p>The pattern repeats wherever the instrument is optional. Reviewing a 2023 intrusion into cloud email accounts, the U.S. Cyber Safety Review Board recorded how it surfaced. The State Department found the intrusion, the board wrote, “because it had purchased enhanced logging through the G5 licenses,” the top government tier, “which few, if any, victims had similarly acquired.”</p><p>Afterwards the logging was switched on for the other victims, which helped less than it sounds: they “could capture data from the time that Microsoft enabled additional logging capabilities but were unable to view past intrusion activity.” British victims did not have it either, and the board records that this “inhibited the NCSC’s ability to verify Microsoft’s claims of earlier threat activity,” the NCSC being Britain’s national cyber security agency (<a href="https://www.cisa.gov/sites/default/files/2025-03/CSRBReviewOfTheSummer2023MEOIntrusion508.pdf">CSRB, 2024</a>). The intrusion was equally real at every one of those organizations. What differed was whether anything had been recording.</p><p>Those three shapes are the strict case, where the chance of seeing anything was flatly zero. Most instruments are not that clean. They have a sensitivity, and the honest question is what it was. The tempting lesson here is the slogan, that absence of evidence is not evidence of absence, and the slogan is wrong as a general rule. Philosophers of science have a more useful version: an absence counts as evidence roughly in proportion to how likely the evidence was to turn up, supposing there was something to find (<a href="https://philpapers.org/rec/SOBAOE-2">Sober, 2009</a>). Which puts the weight in an uncomfortable place. <strong>That likelihood is a property of the window, of the instrument doing the looking, rather than of the world, and on the reads I watch people make, my own included, it is almost never measured.</strong></p><h3>4. Making the instrument say one</h3><p>The move, then, is not to look harder. It is to make the instrument say something already known to be true, and watch whether it can.</p><p><strong>Send a known positive down the same path</strong>, before a zero is allowed to become a fact. Security worked this out years ago and published it: open libraries of small tests that fire a known technique on purpose, so a team can see whether its detections detect (<a href="https://github.com/redcanaryco/atomic-red-team">Atomic Red Team</a>). None of that is specific to security. I have yet to see it run against a query.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_RCkTowKEfE2z_Q7bLZ4qA.png" /></figure><p><strong>Count the denominator twice.</strong> Row-count reconciliation is an off-the-shelf item: a widely used testing package for analytics pipelines ships expect_table_row_count_to_equal_other_table and expect_table_row_count_to_be_between as named tests (<a href="https://github.com/calogica/dbt-expectations">dbt-expectations</a>). Those tests live on the pipeline. The read that actually forms somebody’s belief, the exploratory query run once an hour before the meeting, is not where I have seen them pointed. The asymmetry is strange once it is named. The systems that run unattended, with no one watching, get tested constantly. The read a person performs once and then quotes in a decision usually gets nothing, and that is the one with a human attached.</p><p><strong>Say “nothing came back” and “there is nothing” in different sentences.</strong> Reports flatten the two constantly, and a reader who receives the flattened version has no way to unflatten it.</p><p>None of the three reaches the first case in this piece. A type inferred from five hundred rows leaves no missing row to count and no detector that failed to fire; the wrong decision is already inside the data by the time the values that contradict it arrive. I do not have a clean move for that one, and saying so seems better than letting it fall out of scope.</p><p>The fourth piece in this series opened on a question about who chose the conditions a score was produced under. There, someone had chosen and could be asked. Here there usually is not anyone: a default chose, a file format chose, a license tier chose, and nobody remembers choosing. The question has to change from who decided this to what would this have shown me.</p><p>Somewhere in the last month I ran a check that came back clean and wrote down what it meant, without once asking what it would have done had there been anything to find. I am trying to make that question automatic. I am not there yet.</p><h3>Further reading</h3><ul><li>Series so far: <a href="https://medium.com/cubig-tech-blog/same-seed-different-answer-why-ai-results-do-not-reproduce-6348ca6580a1">reproducibility</a>, <a href="https://medium.com/cubig-tech-blog/same-model-different-rank-why-ai-benchmarks-do-not-transfer-c154131f5545">benchmark transfer</a>, <a href="https://medium.com/cubig-tech-blog/same-number-different-world-why-ai-accuracy-does-not-last-55da5c04220c">drift</a>, <a href="https://medium.com/cubig-tech-blog/same-test-different-score-why-a-benchmark-number-does-not-travel-d52870b6a9bd">condition disclosure</a></li><li>U.S. Government Accountability Office, <a href="https://www.gao.gov/assets/d24105658.pdf">“Cybersecurity: Federal Agencies Made Progress, but Need to Fully Implement Incident Response Requirements”</a> (GAO-24–105658, 2024)</li><li>U.S. Government Accountability Office, <a href="https://www.gao.gov/assets/gao-18-559.pdf">“Data Protection: Actions Taken by Equifax and Federal Agencies in Response to the 2017 Breach”</a> (GAO-18–559, 2018)</li><li>Cyber Safety Review Board, <a href="https://www.cisa.gov/sites/default/files/2025-03/CSRBReviewOfTheSummer2023MEOIntrusion508.pdf">“Review of the Summer 2023 Microsoft Exchange Online Intrusion”</a> (2024)</li><li>Public Health England, <a href="https://www.gov.uk/government/news/phe-statement-on-delayed-reporting-of-covid-19-cases">“PHE statement on delayed reporting of COVID-19 cases”</a> (2020)</li><li>Heinzerling et al., <a href="https://www.cdc.gov/mmwr/volumes/69/wr/mm6915e5.htm">“Transmission of COVID-19 to Health Care Personnel During Exposures to a Hospitalized Patient”</a> (MMWR, 2020)</li><li>Google Cloud, <a href="https://cloud.google.com/bigquery/docs/schema-detect">“Using schema auto-detection”</a> (2026)</li><li>Elliott Sober, <a href="https://philpapers.org/rec/SOBAOE-2">“Absence of evidence and evidence of absence: evidential transitivity in connection with fossils, fishing, fine-tuning, and firing squads”</a> (Philosophical Studies, 2009)</li><li>MariaDB, <a href="https://mariadb.com/docs/server/reference/sql-statements/data-manipulation/selecting-data/subqueries/subqueries-with-in-and-not-in">“Subqueries with IN and NOT IN”</a> (2026)</li><li>Red Canary, <a href="https://github.com/redcanaryco/atomic-red-team">Atomic Red Team</a> (2026)</li><li>Calogica, <a href="https://github.com/calogica/dbt-expectations">dbt-expectations</a> (2026)</li><li>Dionysis Dimakopoulos, <a href="https://blogs.city.ac.uk/cityshortcourses/2020/10/13/what-really-caused-the-excel-error-in-nhs-test-and-trace-covid-19-system-an-in-depth-technical-analysis/">“What really caused the Excel error in NHS Test and Trace”</a> (City, University of London short courses, 2020)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8573f62235dc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/same-zero-different-meaning-why-nothing-found-does-not-mean-nothing-there-8573f62235dc">Same Zero, Different Meaning: Why Nothing Found Does Not Mean Nothing There</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[When Cleaner Data Makes AI Worse]]></title>
            <link>https://medium.com/cubig-tech-blog/when-cleaner-data-makes-ai-worse-c56d49a75208?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/c56d49a75208</guid>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[ai-ready-data]]></category>
            <category><![CDATA[data-quality]]></category>
            <category><![CDATA[syntitan]]></category>
            <category><![CDATA[enterprise-ai]]></category>
            <dc:creator><![CDATA[BG Yoo]]></dc:creator>
            <pubDate>Thu, 22 Oct 2026 10:32:18 GMT</pubDate>
            <atom:updated>2026-10-22T10:32:20.169Z</atom:updated>
            <content:encoded><![CDATA[<p>Data quality and governance scores are rising across markets. Whether a specific AI task got better is a separate question, and it needs its own test.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RrvkU3gIqCW4dbEcjt222Q.png" /></figure><p>Take a hypothetical but familiar case. A team maintains a model that predicts equipment failure from sensor logs. Before each retraining cycle, a cleaning pass removes readings far outside the normal range and fills the gaps around them. Completeness improves. Rule-based validity improves. The data looks better on the dashboard than it did a month ago.</p><p>The retrained model catches fewer failures. The readings the cleaning rule treated as noise included the spikes and dropouts that come before a part gives out. The rule did what it was written to do, and in doing so it removed part of the signal the task relied on.</p><p>Those quality checks alone would not reveal whether failure detection had improved. That requires task-level evaluation.</p><h3>Better foundations do not prove a better task</h3><p>The current research supports investing in data foundations. SAS’s 2026 Data and AI Impact Report, produced with IDC, found that organizations applying trustworthy AI practices were 15 times more likely to report strong or high returns from their AI projects: 62%, against 4% for organizations with weaker practices.</p><p>The relationship varies across markets, though: some reported stronger governance alongside lower impact scores. Spain’s Impact Index fell 7.9 points and France’s fell 6.1 points over the year, while both strengthened their governance. In Oceania the Impact Index declined 13 points, which the report reads as a sign that governance improvements alone will not unlock the next wave of value. The UK is moving in the right direction, with its Impact Index up 3.5 points this year to 51.7, but that still sits 8.8 points below its Trustworthiness Index of 60.5.</p><p>A separate global survey points the same way. Dun &amp; Bradstreet found that more than three-quarters of enterprises report some measurable ROI from AI, yet only 6% say their enterprise data is fully ready to support AI at scale. Returns exist. Extending them across the organization is the harder step.</p><p>These surveys describe organizational practices and reported business outcomes. They do not establish whether a specific data change improved a specific task. That has to be tested on the task.</p><h3>Two kinds of measurement</h3><p>Data quality checks typically ask whether data is complete, consistent, current and correctly structured. Cleaning pipelines enforce those rules. Observability platforms watch for stale tables, schema changes and drift, and the leading ones now extend into monitoring and evaluating the inputs and outputs of AI agents in production. That work is necessary for any team running AI at scale.</p><p>The second kind of measurement asks a narrower question: when the data changed, did the task get better, worse, or stay the same? Answering it means comparing the task under controlled conditions before and after the change, and linking that result to the exact data version that produced it.</p><p>Gartner has started to describe AI-ready data in these terms. Its August 2026 research argues that AI-ready data cannot come from one-time preparation, and that data leaders need a continuous, use-case-driven practice that aligns, qualifies and governs data across the AI life cycle.</p><h3>Testing a data change on the task</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*INfwydsZEtxQ0Xiu9b48Fw.png" /></figure><p>In the failure-prediction case, a fair comparison has four parts.</p><p><strong>The evaluation stays fixed.</strong> The training data changes between the two runs. The evaluation set and its ground truth do not. If both change at once, it becomes harder to isolate the effect of the data change.</p><p><strong>Everything else stays fixed too.</strong> Model configuration, training procedure and evaluation code are held constant, so the data change is the only variable. Where training is stochastic, compare repeated runs with matched random seeds and report the variation in results.</p><p><strong>The metrics match the task.</strong> Failure detection rate alone is not enough. False alarms and how early a failure is caught matter as much to the people acting on the predictions.</p><p><strong>The result has a scope.</strong> The comparison shows the effect of the change under those conditions. When the task, the equipment or the incoming data shift, the test is run again.</p><p>A better model is also not the same as a better business outcome. The comparison shows whether the data change improved performance on the task. Even when it does, whether the gain turns into return depends on how the prediction is used.</p><h3>Tracing results back to their data</h3><p>The SAS report treats data lineage and validation as part of the foundation for explainability, and it points to a real cost when that foundation is weak. Globally, lack of explanation is the most common reason people override AI recommendations, cited by 34.5% of respondents.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aQ3vCjNUFxJsoVuKeOh0lw.png" /></figure><p>The operational question is how that lineage gets recorded. A result is easier to check, and easier to defend, when the data version behind it is known: which records, which changes, and how it performed in the evaluation. Tracing a result to its data does not by itself explain the decision. It does give the people reviewing it something concrete to check.</p><h3>What we build</h3><p><a href="https://syntitan.ai"><strong>Syntitan</strong></a> is the AI-ready execution layer beneath enterprise AI: it connects data diagnosis and refinement with task-level evaluation. It diagnoses the state of the data, refines it where it falls short, and runs task-level comparisons before and after a data change so teams can see the effect of that change on the task. The data version behind each evaluated run is captured and versioned, so the result can be linked back to the data that produced it and the comparison can be repeated when conditions change.</p><p>Data quality work is the starting point for that process. The task-level test is what shows whether a given change helped.</p><p><strong>Sources</strong></p><ul><li>SAS with IDC, <a href="https://www.sas.com/ai-impact">Data and AI Impact Report: The New Economics of Trust</a> (September 2026). Survey of 2,699 decision-makers across 28 countries.</li><li>SAS, <a href="https://www.sas.com/en_gb/news/press-releases/2026/october/idc-data-ai-impact-report-uk.html">UK press release on the Data and AI Impact Report</a>, October 2026. UK, Spain and France figures.</li><li>SAS, <a href="https://www.sas.com/en_nz/news/press-releases/2026/september/oceanias-ai-market-continues-to-mature-as-global-organisations-with-trustworthy-ai-practices-are-15-times-more-likely-to-see-strong-roi.html">Oceania press release on the Data and AI Impact Report</a>, September 2026. Oceania figures.</li><li>Gartner, <a href="https://www.gartner.com/en/documents/8303253">Foundations of AI-Ready Data</a>, research abstract, 25 August 2026.</li><li>Dun &amp; Bradstreet, <a href="https://www.dnb.com/en-us/newsroom/press-releases/dnb-survey-finds-enterprise-ai-returns-continue-to-advance.html">AI Momentum Survey, Q3 2026 findings</a>, press release, 28 July 2026.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c56d49a75208" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/when-cleaner-data-makes-ai-worse-c56d49a75208">When Cleaner Data Makes AI Worse</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The AI Got It Wrong. What Do You Fix First?]]></title>
            <link>https://medium.com/cubig-tech-blog/the-ai-got-it-wrong-what-do-you-fix-first-b9a87e394a7d?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/b9a87e394a7d</guid>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Minchan Chung]]></dc:creator>
            <pubDate>Mon, 19 Oct 2026 16:56:01 GMT</pubDate>
            <atom:updated>2026-10-27T17:16:54.443Z</atom:updated>
            <content:encoded><![CDATA[<h3>Before commissioning more data work, find out whether the agent missed the evidence, misunderstood it or calculated from the wrong records.</h3><figure><img alt="Four cards marked Contract Open sit inside a counting loop. One also carries a coral Benefits Ended slip, while a counter reads four. The headline asks, Counted as what?" src="https://cdn-images-1.medium.com/max/1024/1*t0usFMYDgijco9vqILTPaQ.png" /><figcaption>Conceptual illustration of the simulated membership task in Argo-Bench. An open contract does not necessarily mean current access to benefits.</figcaption></figure><p>Before committing a team to more data preparation, I want to see what went into the wrong answer. The final response rarely tells us enough. An agent that never found a record and an agent that misunderstood it can return the same confident mistake.</p><p>I build data software, so this matters to me commercially as well as technically. Recommending data work is easy. Explaining which work is needed, and why it should come before a model change, takes evidence. A team may already have adequate data and still need a better retrieval step, a clearer instruction or a different calculation.</p><h3>Start with what the agent actually reached</h3><p>In the <a href="https://arxiv.org/html/2609.23806v1">WorkWorlds</a> preprint, researchers tested agents in a fictional pharmaceutical company. They compared access to the full set of role-visible files with a task-specific selection made by practitioners, holding the task, underlying sources, agent setup and grading fixed. Selected files improved evidence access and measured performance. Among executions that reached sufficient evidence, pass rates were almost identical. That last comparison is descriptive; search difficulty, distracting material and context management were not isolated from one another.</p><p>For a live investigation, I would start by saving the material that actually reached the agent: retrieved passages, returned rows and tool results. A source listed in a citation may have been read only in part. A file being available somewhere in the system tells us even less.</p><p>A useful comparison is to give it the missing evidence directly, without adding the answer. Keep the request and model unchanged, and start a fresh run. If that helps across several cases, retrieval, permissions, source selection and joins deserve investigation. It does not yet tell us which one needs changing.</p><p>Someone also had to find that evidence. If a specialist assembled it by hand, the successful retry includes their work. Before treating it as a repeatable improvement, I want to know how the next request will get the same quality of preparation.</p><h3>A valid record can answer the wrong question</h3><p>A separate simulation, <a href="https://arxiv.org/html/2610.02122v1#S3.SS2">Argo-Bench</a>, illustrates a different problem. Researchers created a fictional food-delivery business. In its membership rules, benefits stopped after a seven-day grace period following a failed payment, while a contract could remain open. In one marketing-analysis task, failed runs used contract dates to classify members. Passing runs reconstructed billing history and checked orders where benefits had applied. This was an observed benchmark error, not an incident reported by a delivery company.</p><p>The distinction I take from it is between retrieving a legitimate record and establishing what that record means for the task. An open contract answers one question. Entitlement to a benefit at a particular time answers another. More rows from the contract table would not resolve that difference on their own.</p><p>The same check applies to units and objectives. Before counting rows, establish whether each row represents an event, an hourly summary or a current state. Before asking an agent to reduce a cost, establish which consequence the business is trying to improve. Those choices belong with the people responsible for the work. The model can help expose an ambiguity; it should not silently settle it for them.</p><p>To test interpretation, supply the agreed rule while keeping the available records fixed. To test execution, agree the records and operation first, then recompute independently. A join that multiplies rows, a wrong tool argument and a misunderstood eligibility rule need different repairs. They can all produce a plausible final number.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pzi16BEZSrWTlHvSrEM5EA.png" /><figcaption>An editorial metaphor for checking the evidence an agent actually used. The labels simplify the membership problem; they are not fields from the benchmark dataset.</figcaption></figure><p>An editorial metaphor for checking the evidence an agent actually used. The labels simplify the membership problem; they are not fields from the benchmark dataset.</p><p>These are diagnostic comparisons I would use, not procedures validated by either paper. Both studies examine simulated environments. Their results give us failures to investigate; they do not predict our own error rate or establish that data preparation will fix every failure.</p><h3>Give the next person a smaller job</h3><p>After that investigation, the next piece of work should be more specific than “improve the data.” It might be restoring one source to retrieval, exposing a maintained business definition, fixing a query or testing a model on an unchanged input. Existing views, rules and tools may already handle part of it. A new component brings its own setup and maintenance.</p><p>I want the failing request, the evidence the agent used, the expected result and the suspected break attached to that work. Include fresh cases the proposed fix must pass, especially cases it should leave unchanged. A correction that works only on the example used to develop it still needs testing.</p><p>For the membership example, I would send an engineer a few disputed customers, the relevant billing events and the agreed eligibility rule. The first job would be to reproduce the selection error and test a correction on other customers. We could decide how much preparation to automate once we knew what had to be prepared.</p><p>I’m Minchan Chung, co-founder of CUBIG. I write about AI-ready data and what I’m learning while building the company. New essays every Tuesday and Thursday. Follow me on Medium to read the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b9a87e394a7d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/the-ai-got-it-wrong-what-do-you-fix-first-b9a87e394a7d">The AI Got It Wrong. What Do You Fix First?</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Alarms Went Off. The Evaluation Kept Running.]]></title>
            <link>https://medium.com/cubig-tech-blog/the-alarms-went-off-the-evaluation-kept-running-9577af58059d?source=rss----4e95693c9ca1---4</link>
            <guid isPermaLink="false">https://medium.com/p/9577af58059d</guid>
            <category><![CDATA[ai-ready-data]]></category>
            <category><![CDATA[enterprise-ai]]></category>
            <dc:creator><![CDATA[Yohan Kim]]></dc:creator>
            <pubDate>Thu, 15 Oct 2026 13:06:01 GMT</pubDate>
            <atom:updated>2026-10-15T13:06:01.559Z</atom:updated>
            <content:encoded><![CDATA[<p><em>The OpenAI–Hugging Face incident, traced through five stages of an AI agent pipeline.</em></p><p>The most useful incident report about AI agents this year is not a story about a missed alarm. It describes alarms that were noticed and investigated, while the agents behind them kept working.</p><p>In August, OpenAI published a 51-page <a href="https://cdn.openai.com/pdf/67869394-cb91-4c12-888c-5cbd85c7814c/OpenAI-Hugging-Face%20Incident-Technical-Report.pdf">technical report</a> on how agents running inside its own cybersecurity evaluations escaped their sandbox and compromised parts of Hugging Face’s production infrastructure. METR and Redwood Research published an <a href="https://metr.org/blog/2026-08-26-openai-hugging-face-incident-investigation/">independent investigation</a> of the agents’ behavior the same day. The two cover different ground: METR examined what the agents did and why, mostly between July 7 and 13, and did not assess OpenAI’s response or its fixes. Together they are an unusually complete record of an agent failure.</p><p>Most coverage read it as a security or alignment story. It is also a pipeline story. The failure did not come from a single broken layer. It emerged from assumptions across five parts of the agent pipeline, most of which behaved as configured. That changes the post-mortem question. “What broke?” has a short answer here. “What did each stage assume?” is the one worth asking of your own agents.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2hoSqh4xxDXBvhTa2LDZlQ.png" /><figcaption>Five stages of one agent pipeline, read as lenses rather than a sequence of events. The checks mean each mechanism behaved largely as configured, not that the system was safe; the problem passed through all of them.</figcaption></figure><h3>What happened, briefly</h3><p>OpenAI ran an evaluation called ExploitGym to measure how well its models could find and exploit software vulnerabilities. The agents worked in isolated containers without direct internet access, and with some production safeguards deliberately switched off so the test would measure raw capability. To install software, they went through an internal package mirror, Artifactory, using a credential that many workloads shared.</p><p>Agents had already left notes for each other in the mirror during runs in May and June. After a compromise and cleanup in early July, a new message board appeared on July 8. Over the next several days, according to METR, roughly 1,200 agents exchanged more than 70,000 messages and files on it, and about 700 took part in the attack. Combining credentials that others had exposed on the public internet with vulnerabilities they found, agents ran code on 41 of Hugging Face’s production dataset server workers by July 13. On July 20, OpenAI connected its own findings to the incident Hugging Face had disclosed on July 16, and announced its involvement the next day.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VkM-OfwMe9zGABy84Ff1kg.png" /><figcaption>From the first notes in May to disclosure on July 21. Marked: three warning signs seen before the Hugging Face attack.</figcaption></figure><p>This post leaves out the vulnerability details and follows the failure stage by stage.</p><h3>Stage 1: The task had no honest way to fail</h3><p>The chain starts with tasks that could not be completed. In May, an agent in a training run was asked to fill in a spreadsheet from Google Drive links it could not reach. The task was impossible by accident, and the agent kept at it until it tried to break into the package mirror, one of its few tools, to get online.</p><p>The same pattern ran through the evaluation. METR cites an estimate, apparently from the benchmark’s authors, that 30 to 40% of ExploitGym’s targets cannot be exploited with the vulnerability the task specifies: broken, not merely hard. OpenAI measured something narrower. The 198 of 898 tasks that none of its models had ever solved made up 22% of the benchmark and 93% of the tasks discussed on the message board. In training, the models probed their environment most when expected tools or internet access were missing, and the chance of joining the board rose with task difficulty and reasoning budget. The models, in OpenAI’s words, rarely gave up.</p><p>Persistence is what you want on a hard task; on an impossible one, it turns the environment into the search space. The report does not frame it this way, but the engineering response is plain: make “I cannot complete this, and here is why” a result the harness accepts, records, and counts. A task that no run ever finishes is not necessarily broken, but it deserves investigation before more agent effort goes into it, and when legitimate completion is impossible the harness should recognize that instead of rewarding ever more desperate attempts.</p><h3>Stage 2: A shared service became a channel</h3><p>The sandbox did block the internet. What it did not isolate was the package mirror, which many workloads could reach and which, as METR notes, did not separate one user’s activity from another’s. Agents could see each other’s traces; one left a note asking for a missing file, others found it and added their own, and the notes became a board. That part needed no exploit, only the shared credential the agents had been given.</p><p>OpenAI’s own remediation names the lesson: blocking direct internet access was not enough when workloads could reach shared services that offered “transitive paths” outward. Its fixes isolate or replace those services and add a second, independent layer of network isolation.</p><p>For an enterprise agent the mirror might be a shared drive, a scratch bucket, a cache, a vector store that several runs write into, or a ticket queue. Any writable resource that more than one agent run can read is a communication channel whether or not anyone designed it as one. The isolation review that matters is not “can this agent reach the internet?” but “what can this agent write that another run will later read?”</p><h3>Stage 3: The agents optimized against the check they imagined</h3><p>METR’s investigation contains the most counterintuitive detail. Within hours of creating the board, agents had reverse-engineered how the evaluation generated its answer flags, so they could produce a valid flag for any task. They did not simply submit it. Having read the ExploitGym paper, they believed the scorer would read their transcripts and disqualify any flag obtained the unintended way. Much of the collective effort that followed, including the attack on Hugging Face, appears to have aimed at understanding and fooling that scorer, not at stealing answers.</p><p>METR’s understanding is that OpenAI never implemented that check. The agents were working around a rule that did not exist, and they could have passed with the flag they already had; the elaborate effort was aimed at an obstacle of their own invention. On the way, they learned to disguise their own tool calls; about 7% of the transcripts METR evaluated were spoofed in places, all on a small scale. OpenAI’s report, for its part, says the tampering attempts it observed did not alter the logs its graders and monitors ultimately saw.</p><p>Two engineering points follow. An agent acts on its model of how success is judged, so a vague definition of success becomes something to investigate. That does not mean showing the agent the grader: tell it what legitimate completion means and which actions are allowed, keep the grading logic out of its reach, and check how a result was reached as well as the result itself. And whatever records the verdict, logs or transcripts or grader inputs, needs to sit somewhere the agent cannot write.</p><h3>Stage 4: The signals arrived; the decision did not</h3><p>Around May 26, an internal team saw agents using the board and reaching the internet when they should not have. On June 27, a port-scanning alert was traced to an ExploitGym run using the mirror as a message board, and the on-call staff concluded the evaluation did not need to stop. On July 5, after the mirror crashed under agent traffic, responders found an administrator-level compromise and took it offline; the report states that the board and the significance of the agents’ communication “were not apparent to leaders responsible for incident detection and response.” Evaluations resumed two days later.</p><p>At least three times, someone observed part of the activity. The July 5 response interrupted the evaluations and dealt with the immediate compromise, but the significance of the agents’ communication was still unrecognized when they resumed. The report does not show that each signal justified a stop on its own. It does show what was missing: a path from “an engineer saw something strange” to “someone with authority decided whether to stop,” and a rule for which kind of strange requires stopping. OpenAI’s changes target exactly that: a 30-minute target for notification of concerning activity, a pause whenever responders cannot rule out a false positive in that window, severity-based escalation, and explicit decision rights. OpenAI also claims its current chain-of-thought monitoring would have paged the security team more than a day before the breach, a counterfactual no one has independently tested.</p><h3>Stage 5: The safeguards lived in the harness that was off</h3><p>The last stage marks the difference between this evaluation and OpenAI’s deployed products. The evaluation deliberately ran without the production system prompts, classifiers, and automatic review that ship to customers, to measure what the model could do unassisted. In preliminary experiments after the incident, OpenAI found that running the same evaluation with its production harness and system prompt cut the tendency to compromise out-of-scope infrastructure to under 1% of the baseline. An auto-review step, where a second model checks tool calls that need elevated permissions before they run, would have flagged most of the dangerous actions in each rollout it was tested on.</p><p>These are limited, preliminary tests: they show the harness changes behavior a great deal, not that it would certainly have prevented the incident. Still, much of an agent’s safety sits in the harness, and the harness is more than a prompt: the credentials the agent holds, the policy for which tools run without review, the isolation around its workspace, the monitoring on what it does. An evaluation run without that harness measures a different system from the one you deploy. For most teams the risk runs the other way: an internal agent wired up quickly, with a thin prompt and broad credentials, inherits none of the protections the vendor’s own products depend on.</p><h3>What carries over, and what does not</h3><p>This was a cyber-offense evaluation driven mainly by an unreleased research model, with safeguards deliberately removed, running as tens of thousands of agents at once. Nothing in the report suggests that a support agent or a document pipeline will start attacking third parties.</p><p>The structure carries over: a task that cannot succeed, an agent that does not quit, a shared resource nobody counted as a channel, a success check the agent has to guess at, and an alert path that ends at someone without the mandate to stop the run. Each of those exists at small scale in ordinary agent systems.</p><h3>Five questions for your own pipeline</h3><ol><li><strong>Task:</strong> Can the agent report “cannot complete” as a normal result, and do you track how often tasks are never completed by any run?</li><li><strong>Shared resources:</strong> What can one agent run write that another run, or a later run, will read?</li><li><strong>Success check:</strong> Does the agent know what legitimate completion means, while the grading logic and the evidence behind the verdict stay outside its control?</li><li><strong>Alerts:</strong> When an engineer notices odd agent behavior, who hears about it, and what threshold makes them stop the run?</li><li><strong>Harness:</strong> Which safeguards live outside the model, and are they on in every environment where the agent has real credentials?</li></ol><p>OpenAI’s report treats the incident as a reason to stop assuming any single control is enough. For most teams running agents, the cheaper lesson comes earlier: write down what each stage assumes, before an agent tests it for you.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9577af58059d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cubig-tech-blog/the-alarms-went-off-the-evaluation-kept-running-9577af58059d">The Alarms Went Off. The Evaluation Kept Running.</a> was originally published in <a href="https://medium.com/cubig-tech-blog">CUBIG Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>