<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Omid Farhang</title>
    <description>The latest articles on DEV Community by Omid Farhang (@omidfarhang).</description>
    <link>https://dev.to/omidfarhang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F206853%2Fb3d05c99-f05b-4334-8d93-97d8c2e1ef4d.jpg</url>
      <title>DEV Community: Omid Farhang</title>
      <link>https://dev.to/omidfarhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omidfarhang"/>
    <language>en</language>
    <item>
      <title>One AI Chat Is Not a Research Workspace</title>
      <dc:creator>Omid Farhang</dc:creator>
      <pubDate>Fri, 28 Aug 2026 22:03:23 +0000</pubDate>
      <link>https://dev.to/omidfarhang/one-ai-chat-is-not-a-research-workspace-18ae</link>
      <guid>https://dev.to/omidfarhang/one-ai-chat-is-not-a-research-workspace-18ae</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://omid.dev/2026/08/29/one-ai-chat-is-not-a-research-workspace/" rel="noopener noreferrer"&gt;omid.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was deep in a research thread that was not going to become a weekend post.&lt;/p&gt;

&lt;p&gt;The topic started small: juniors asking an AI to format code that Prettier already owns, or to invent a debounce helper the repo already has. It got larger fast. Sometimes the person is not a developer at all — they have an idea, they paste a warning into ChatGPT, the "build" goes green, and they never learn that the message was ESLint. The software can become more sophisticated than the operator's mental model. That is a different problem than "juniors are lazy," and it is too big to finish in one sitting.&lt;/p&gt;

&lt;p&gt;Then the conversation itself became the bottleneck. Scrollback got expensive. Earlier distinctions went fuzzy. I caught myself asking the model to remember what we had already decided, which is a bad use of a thinking partner.&lt;/p&gt;

&lt;p&gt;The useful question was not "which model has a longer context window?"&lt;/p&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where do the notes live so this can become an article — or a playbook — months from now?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not in that chat. Not in the next chat either.&lt;/p&gt;

&lt;h2&gt;
  
  
  A conversation is a scratchpad
&lt;/h2&gt;

&lt;p&gt;Chat is excellent at &lt;em&gt;moving&lt;/em&gt; an idea. It is a poor place to &lt;em&gt;keep&lt;/em&gt; one.&lt;/p&gt;

&lt;p&gt;A long ChatGPT, Claude, Gemini, or Cursor thread will fail a research project in boring, predictable ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is linear.&lt;/strong&gt; Real research branches. You will contradict yourself on Tuesday and be right on Thursday. A transcript cannot hold both versions without turning into sludge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It wants to be helpful.&lt;/strong&gt; The model will synthesize, smooth, and close. That is the opposite of what early research needs. Early research needs loose ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It has no honest memory.&lt;/strong&gt; "Remember what we discussed?" is a prompt, not a filing system. Context windows fill. Summaries drop the awkward examples you actually needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You cannot search or diff it.&lt;/strong&gt; Six weeks later you will not know whether a sentence was an observation, a guess, or a line the model invented to sound complete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You do not own it.&lt;/strong&gt; Export formats change. Projects get renamed. The vendor's "memory" is not your archive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I already argued that &lt;a href="https://omid.dev/2026/06/29/how-to-stretch-cursor-pro-with-a-split-ai-workflow/" rel="noopener noreferrer"&gt;Cursor should not be the place you debate architecture&lt;/a&gt;. The same split applies one layer up. The chat is not the knowledge base. The chat is a tool you point &lt;em&gt;at&lt;/em&gt; a knowledge base.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Keep a workspace where ideas can be messy, contradictory, duplicated, and only gradually organized. Do not spend your energy deciding where a thought belongs before you have captured it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds sloppy. It is the point. Organization is a later pass, the same way a clean API is a later pass over a spike. If you file every thought into the "right" folder on arrival, you will stop writing thoughts down.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually wanted
&lt;/h2&gt;

&lt;p&gt;I wanted a place with four properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ugly is allowed.&lt;/strong&gt; An inbox that does not judge you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contradiction is allowed.&lt;/strong&gt; Two notes can disagree in public. That disagreement is data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplication is allowed.&lt;/strong&gt; If the same idea shows up four times in different words, that is a signal, not a mess to tidy on day one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI can read the files.&lt;/strong&gt; Not "paste the last twenty messages." The actual notes, on disk, in a repo, the way I already work on code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jupyter can be that for &lt;em&gt;executable&lt;/em&gt; thinking — I wrote about a &lt;a href="https://omid.dev/2025/12/28/personal-knowledge-engine-jupyter-llm/" rel="noopener noreferrer"&gt;personal knowledge engine&lt;/a&gt; in that shape. This problem was different. Most of the material was not code to run. It was observations, half-formed concepts, examples, and arguments I was not ready to defend. Markdown in Git is the boring tool that fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  A repo that is allowed to be ugly
&lt;/h2&gt;

&lt;p&gt;Something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;research-workspace/
├── README.md
├── inbox/
│   ├── raw-thoughts.md
│   ├── examples.md
│   └── observations.md
├── research/
│   ├── cognitive-offloading.md
│   └── ai-coding-studies.md
├── concepts/
│   ├── premature-delegation.md
│   └── productive-friction.md
├── examples/
│   └── linting.md
├── counterarguments/
│   └── ai-is-not-the-problem.md
├── drafts/
└── outline.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Name the folders for &lt;em&gt;your&lt;/em&gt; project. The structure is not the insight. The insight is the &lt;code&gt;inbox/&lt;/code&gt; contract:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing in &lt;code&gt;inbox/&lt;/code&gt; has to be true, unique, or well placed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dump dated fragments and move on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# 2026-08-24&lt;/span&gt;

A person hit an ESLint warning, read it as a generic build failure,
pasted it into AI, accepted the fix.

They did not know what a linter was.

This is not the same as a developer using AI badly.

Maybe: AI as a substitute for mental models?

Need notes on cognitive offloading.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That paragraph is more valuable in a file than it is as message 87 in a chat you will never re-read carefully.&lt;/p&gt;

&lt;p&gt;When a fragment keeps showing up, &lt;em&gt;then&lt;/em&gt; promote it into &lt;code&gt;concepts/&lt;/code&gt; or &lt;code&gt;examples/&lt;/code&gt;. Promotion is a decision. Capture is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate observation from interpretation
&lt;/h2&gt;

&lt;p&gt;This is the part that saves the eventual article from becoming a vibe.&lt;/p&gt;

&lt;p&gt;Six months later you will not remember whether you &lt;em&gt;saw&lt;/em&gt; something or &lt;em&gt;theorized&lt;/em&gt; it. Chat transcripts erase that distinction because the model blends them for you. Your files should not.&lt;/p&gt;

&lt;p&gt;A note in &lt;code&gt;examples/&lt;/code&gt; can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Observation&lt;/span&gt;

Someone using AI-generated code hit an ESLint warning. They did not
know what ESLint was. They treated it as a build error, pasted it
into a chatbot, and accepted the generated fix.

&lt;span class="gu"&gt;## Interpretation&lt;/span&gt;

AI can hide a missing mental model. The failure disappears without
the concept ever appearing.

&lt;span class="gu"&gt;## Hypothesis&lt;/span&gt;

Resolving a tooling failure through a chatbot reduces the pressure
to learn what the tool is for.

&lt;span class="gu"&gt;## Questions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Is this new, or is it Stack Overflow with a smoother UX?
&lt;span class="p"&gt;-&lt;/span&gt; Does it happen to experienced developers in unfamiliar stacks?
&lt;span class="p"&gt;-&lt;/span&gt; What would falsify this?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those four headings are not bureaucracy. They stop you from publishing a confident thesis built on one anecdote plus a lot of fluent continuation.&lt;/p&gt;

&lt;p&gt;The originating research — AI as a substitute for engineering knowledge — is still in that shape for me. This post is not that article. This post is the container I needed before I was allowed to write that article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Argue with yourself on purpose
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;counterarguments/&lt;/code&gt; folder early, while you still like your thesis.&lt;/p&gt;

&lt;p&gt;For every claim you are tempted to tattoo on the outline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# AI causes deskilling&lt;/span&gt;

&lt;span class="gu"&gt;## Argument for&lt;/span&gt;

Cheap code production can skip the friction where judgment forms.

&lt;span class="gu"&gt;## Argument against&lt;/span&gt;

Engineers have always used abstractions. Nobody needs to understand
the TypeScript compiler to use TypeScript. Libraries already hide
enormous amounts of knowledge.

&lt;span class="gu"&gt;## What would falsify this?&lt;/span&gt;

Evidence that people who use AI as an oracle still build accurate
mental models at the same rate, just faster.

&lt;span class="gu"&gt;## Current confidence&lt;/span&gt;

Medium. Do not draft the polemic yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you skip this, the project will drift into an anti-AI rant. The position I actually expect to land on is narrower than "AI bad":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Abstraction is normal. The failure mode is operating an abstraction without enough of its boundary to use it safely.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sentence is only trustworthy if I have tried to kill it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Point the model at the repo
&lt;/h2&gt;

&lt;p&gt;Once the notes exist as files, the AI job changes.&lt;/p&gt;

&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember everything we discussed and write the book.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask against the tree:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Read &lt;code&gt;inbox/&lt;/code&gt; and list recurring concepts, contradictions, and research questions. Do not rewrite anything.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Compare those observations with &lt;code&gt;research/&lt;/code&gt;. Where is the evidence thin?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Build a conceptual model. Preserve uncertainty.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Only then: propose an outline.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the same discipline as the &lt;a href="https://omid.dev/2026/06/29/how-to-stretch-cursor-pro-with-a-split-ai-workflow/" rel="noopener noreferrer"&gt;split coding workflow&lt;/a&gt;: the model executes against artifacts you own. Cursor is unusually good at this part — not as a chatbot with a repo attached, but as an editor that can cluster notes, open three files, and leave the prose messy on purpose.&lt;/p&gt;

&lt;p&gt;A useful progression, and I would not skip steps because a model offered to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw notes
  → cluster
  → name concepts
  → find contradictions
  → read the literature
  → challenge hypotheses
  → conceptual model
  → outline
  → draft
  → editorial review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Do not ask AI to turn a pile of thoughts into a book. Ask it to help you think about the pile first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If that sounds slow, good. The slowness is the research. Generating a 4,000-word draft from a chat summary is how you get a fluent article you do not believe next month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Git, and what else
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Git plus Markdown&lt;/strong&gt; is the default I would give another developer. Version history, diffs, branches, grep, backup, no proprietary format, and any coding agent can read it. A private GitHub repo is enough. Make pieces public later if you want; do not start public and perform the mess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obsidian&lt;/strong&gt; is optional and compatible. It sits on the same Markdown files. Use it if you want daily notes, backlinks, and a graph over &lt;code&gt;inbox/&lt;/code&gt;. Do not use it as an excuse to leave Git. The vault should be the working copy of the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT Projects, Claude Projects, NotebookLM&lt;/strong&gt; are fine as &lt;em&gt;lenses&lt;/em&gt;. They are not the source of truth. If the files only live in the vendor's project, you are back to a nicer conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FigJam / Figma&lt;/strong&gt; is for a later pass: once you have a model worth drawing — amplifier vs prosthetic vs oracle, a knowledge-gradient sketch, a hierarchy of "already solved" problems. Keep the diagram as a view, not as the archive. Boxes in a whiteboard do not grep.&lt;/p&gt;

&lt;p&gt;I would not put this kind of work in Notion as the canonical store. It is a reasonable reading surface. It is a weak object for agents, diffs, and "this paragraph changed."&lt;/p&gt;

&lt;h2&gt;
  
  
  When you are allowed to write the article
&lt;/h2&gt;

&lt;p&gt;Not when the chat feels complete.&lt;/p&gt;

&lt;p&gt;When you can point at files and answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What did I actually observe?&lt;/li&gt;
&lt;li&gt;What did I only interpret?&lt;/li&gt;
&lt;li&gt;Which hypotheses have counterarguments I have written down?&lt;/li&gt;
&lt;li&gt;Where is the evidence still a vibe?&lt;/li&gt;
&lt;li&gt;What would make me drop the thesis?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those answers are fuzzy, you do not have an article yet. You have an inbox. That is a successful research workspace. Treat it that way.&lt;/p&gt;

&lt;p&gt;The chat that started this was useful. It was also the wrong database. I moved the notes out. The bigger piece — when AI becomes a substitute for software-engineering knowledge — can wait until the workspace has earned a draft.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>data</category>
    </item>
  </channel>
</rss>
