今日已更新 84 条资讯 | 累计 37333 条内容
关于我们

标签:#Productivity

找到 999 篇相关文章

AI 资讯

Building Local-First Web Apps: Parsing HTML and PDFs to Markdown in the Browser

Local-first and privacy-focused web utilities are having a massive comeback. With browser engines becoming faster and WebAssembly/Web Workers maturing, there is rarely a reason to push sensitive user documents to an external backend for simple conversions. While building MD-Convert (a zero-upload document to Markdown converter), I explored how to parse real-world documents into clean Markdown entirely on the client side. Here is a breakdown of the core architecture and libraries that make purely in-browser document processing possible. 1. Converting Web Articles with Readability + Turndown Converting messy web markup into clean Markdown involves two distinct steps: Content Extraction: Stripping ads, navbars, sidebars, and trackers. HTML-to-Markdown Transformation: Translating semantic DOM nodes into markdown tokens. Mozilla’s @mozilla/readability paired with turndown is an incredible combination for this: import { Readability } from ' @mozilla/readability ' ; import TurndownService from ' turndown ' ; function htmlToCleanMarkdown ( rawHtmlDocument , sourceUrl ) { // 1. Extract pure article content const reader = new Readability ( rawHtmlDocument ); const article = reader . parse (); if ( ! article || ! article . content ) { throw new Error ( ' Unable to extract main content ' ); } // 2. Initialize Turndown const turndownService = new TurndownService ({ headingStyle : ' atx ' , codeBlockStyle : ' fenced ' }); // Ensure image URLs remain absolute turndownService . addRule ( ' absoluteImages ' , { filter : ' img ' , replacement : ( content , node ) => { const src = node . getAttribute ( ' src ' ); const alt = node . getAttribute ( ' alt ' ) || '' ; if ( ! src ) return '' ; try { const absoluteUrl = new URL ( src , sourceUrl ). href ; return `![ ${ alt } ]( ${ absoluteUrl } )\n\n` ; } catch { return `![ ${ alt } ]( ${ src } )\n\n` ; } } }); return turndownService . turndown ( article . content ); } Offloading Heavy PDF Parsing to Web Workers Parsing large PDFs using pdf

2026-08-27 原文 →
AI 资讯

The Model's JSON Was Almost Valid. I Made It Grade Its Own Homework for 48 Hours.

Every extraction pipeline I have ever pointed at a language model shares the same dirty secret: the JSON comes back almost valid. Almost is where the bugs live, because almost passes your eyes and then fails your schema at midnight. So I built a loop where the model grades its own homework, then let it run for 48 hours on a free server to see what breaks. The experiment The idea was simple: take plain-text payloads that look like webhook bodies, extract five fields against a small schema, and give the model exactly one chance to fix its own mistakes. I wrote the rules down before writing any code, because rules written after a failure are just excuses. Pass one asks the model to return the fields as JSON. A validator checks the result against the schema. If validation fails, pass two sends the original payload, the bad JSON, and the exact validation errors back to the model. Every attempt, raw text included, lands in a JSONL log. I ran that loop for 48 hours on MonkeyCode's free server option, using its free model access for both passes. Disclosure: This article was prepared as part of MonkeyCode's product outreach. Here is the loop, trimmed to the parts that mattered. import hashlib import json import time from datetime import datetime , timezone import jsonschema import requests SCHEMA = { " type " : " object " , " required " : [ " event " , " customer_id " , " amount " , " currency " ], " properties " : { " event " : { " type " : " string " , " enum " : [ " charge.succeeded " , " charge.failed " ]}, " customer_id " : { " type " : " string " , " pattern " : " ^cus_ " }, " amount " : { " type " : " integer " , " minimum " : 0 }, " currency " : { " type " : " string " , " minLength " : 3 , " maxLength " : 3 }, }, } SEEN : set [ str ] = set () def now_iso () -> str : return datetime . now ( timezone . utc ). isoformat () def call_model ( prompt : str ) -> str : # Point this at the free model endpoint you are testing. resp = requests . post ( " https://your-endpoint.e

2026-08-26 原文 →
AI 资讯

How I Diagnosed and Fixed Keyword Cannibalization Between Two Nearly-Identical Blog Posts

I thought publishing more useful content would automatically give my website more opportunities to rank. Then I noticed something uncomfortable. Two articles on my site were covering almost the same subject. Both were useful. Both were properly indexed. Both answered similar questions. And both were competing for overlapping search intent. I had accidentally created a small SEO architecture problem inside my own blog. I'm building "SabrTime.in" ( https://sabrtime.in/ ), a small Islamic companion app focused on practical digital tools for everyday worship. As a solo developer, I also manage the website, content, SEO, and product development myself. While working on the site's content, I published two articles around Tasbeeh: How to Do Tasbeeh — A Complete Guide Digital Tasbeeh Counter: How It Works & Why Muslims Are Switching The first article is about the practice itself. The second is supposed to be about the technology and use case of digital Tasbeeh counters. Sounds different enough, right? At first, I thought so too. But when I looked at the actual content and search intent, the overlap became obvious. The Problem Wasn't Duplicate Content This is where SEO gets misunderstood. Keyword cannibalization doesn't necessarily mean you have two pages containing identical paragraphs. The more interesting problem is intent overlap. If two URLs are trying to satisfy essentially the same searcher's question, a search engine has less information about which page should be the primary result. For example, imagine these two pages: /page-a "How to Do Tasbeeh" /page-b "Digital Tasbeeh Counter" Their titles are different. But if both pages explain: what Tasbeeh means how many times to recite it common Tasbeeh counts the same hadith how to count Tasbeeh why Muslims use a counter FAQs about Tasbeeh ...then the distinction between the pages starts becoming blurry. That was happening on my site. The two articles were not technically duplicates. But parts of their search intent were d

2026-08-26 原文 →
AI 资讯

The Three-Eyed Raven and the Future of AI Memory in Logistics

The Three-Eyed Raven Problem: What Bran Stark could see the past, understand the present, and glimpse what might come next. Modern logistics AI is being asked to do something surprisingly similar. There is a moment in Game of Thrones when Bran Stark stops being merely a person who remembers events and becomes something much more powerful. As the Three-Eyed Raven, Bran has access to an enormous history of people, places, decisions, betrayals, and consequences. He does not simply possess information. He can retrieve the right information from the past and use it to understand what is happening now . That distinction matters. Because the logistics industry is beginning to face its own Three-Eyed Raven problem. We already have enormous amounts of data. Shipment events. GPS signals. Carrier performance. Customs documentation. warehouse scans. Purchase orders. invoices. weather feeds. port congestion. customer commitments. emails. SOPs. tariffs. exception histories. The problem is no longer simply: Can AI access all of this information? The more important question is: Can an AI system remember the right things, at the right time, for the right shipment—and forget what it should not retain? That question may become one of the defining problems of enterprise AI. AI Is Moving From Intelligence to Memory Much of the first wave of Generative AI focused on what models know . The next wave is increasingly about what AI systems can remember, retrieve, reason about, and act upon over time . This distinction becomes particularly important with AI agents. A chatbot might answer: “What documents are normally required for this shipment?” An AI logistics agent needs to understand something much harder: Which shipment are we discussing? What happened to it yesterday? Which carrier is moving it? Has this lane experienced similar delays before? What did the customer request? What customs rules apply? Was an exception already escalated? What action worked the last time this happened? Has a

2026-08-26 原文 →
AI 资讯

Your App Works. But Is It Actually Solving Your Users’ Problems?

A technically perfect app can still fail. It can have clean code, modern architecture, powerful APIs, and impressive features—and still leave users uninstalling it, abandoning transactions, or switching to a competitor. Because users don't experience your code.They experience the product. That is why developers and businesses need to look beyond functionality and ask a more important question: “Does this software make the user’s life easier?” The Real Cost of a Poor Digital Experience Customer expectations are rising quickly. According to PwC’s 2025 Customer Experience Survey, 70% of executives say customer expectations are evolving faster than their companies can adapt. Even more importantly, 29% of consumers said they stopped using or buying from a brand because of poor customer experience. That means a frustrating digital experience isn't simply a UX problem. It can become a business problem . A confusing checkout flow, slow screen, unnecessary registration step, broken search function, or poorly designed notification can turn a potential customer into a lost customer. And users rarely tell you exactly what went wrong. They simply leave. More Features Don't Always Mean More Value One of the biggest mistakes in software development is assuming that adding more features automatically makes a product better. It doesn't. Imagine an app with: 30+ features AI integration Multiple dashboards Complex personalization Advanced analytics …but users struggle to complete the one task they downloaded the app for. That's not innovation. That's friction. A better development approach starts with identifying the core user problem and then building around it. Before adding a feature, ask: What problem does this solve? If the answer isn't clear, the feature may not belong in the product. Performance Is Part of User Experience Developers often separate performance from UX. Users don't. To them, a slow API, delayed screen, frozen button, or failed transaction is simply a bad experien

2026-08-26 原文 →
AI 资讯

Vibecoding: How to Manage an AI Coder and Not Drown in Spaghetti Code

Vibecoding: How to Manage an AI Coder and Not Drown in Spaghetti Code Forget fairy tales about AI doing everything for you at the touch of a button. Without strict control, vibecoding quickly turns into a mess of broken, unmaintainable code. Modern vibecoding isn't blind generation — it is strict architectural supervision . To build real products, you must change your approach to context and redefine your role in the process. Forget Persona Prompting: Context is the Only King of Modern Prompting Fables like "Act as a Senior Developer" were left back in 2023. Modern LLMs don't need roleplay — they need the cleanest, deepest context possible . Why "Persona Prompting" is Outdated AI doesn't start coding better just because you called it a senior dev. It needs concrete technical boundaries. Skip the foreplay and provide the AI with technical specifications: Stack and versions: Not just "React", but React 18, Next.js 14 (App Router), Tailwind CSS . Architectural constraints: Show folder structure, naming conventions, and API response formats. Rule files ( .cursorrules / .clauderules ): Load strict rules into the project that the AI must follow at all times (e.g., "Never use any in TypeScript, write functional components only" ). Humans as Strict Regulators, Not Blind Consumers of Code The biggest danger of vibecoding is shipping AI-generated garbage straight to production without looking. If you blindly consume whatever the AI spits out, your project is doomed. 1. Total Quality Control and Code Review You act as the Technical Regulator and Censor . You never take the AI's word for it. Read every diff : Check exactly what the AI changes. Don't let it rewrite working modules from scratch just to add one button. Don't know how to code? Use basic logic: adding a single button shouldn't make 30 lines of code disappear from main.py or app.js . Force it to justify decisions: If the AI suggests a library, ask: "Why this one over a native solution? Will it impact performance?" 2.

2026-08-26 原文 →
开发者

情報が増えたときの整理を考える—シソーラス・タクソノミー・オントロジー

要点 呼び方の揺れにはシソーラス、置き場所の迷いにはタクソノミーが役立ちます 複数の情報がどう関係するかまで扱うなら、オントロジーを検討できます すべてを整えず、目の前の困りごとに合う方法から小さく始められます Slackで共有された仕様を探し、Notionの議事録とFigmaの画面を見比べ、GitHubのIssueで変更の経緯をたどる。情報は揃っているのに、呼び方や置き場所が違うだけで確認に時間がかかることがあります。そんな状況を整理する手がかりとして、シソーラス・タクソノミー・オントロジーという3つの考え方を眺めてみます。 情報の量だけでなく、整理の基準にも目を向ける 情報過多というと、保存する量を減らすことに目が向きがちです。ただ、同じものが違う名前で呼ばれ、保存場所が人によって変わり、情報同士の関係も見えにくいことが負担になっている場合があります。 同じ「ユーザー」という言葉でも、仕様書ではサービスの利用者、データモデルではログイン済みのアカウントを指しているかもしれません。反対に、「モーダル」「ダイアログ」「ポップアップ」のように、違う言葉で同じ画面を指していることもあります。認識を揃えないまま設計と実装が進み、後から齟齬が分かって仕様変更になった経験もあるかもしれません。 言葉と分類と関係を整理することは、情報を探しやすくするだけでなく、こうした手戻りを減らす助けにもなりそうです。3つの考え方は、それぞれ次の役割を担います。 シソーラス:言葉を揃える タクソノミー:置き場所を決める オントロジー:意味のつながりを記述する シソーラス:呼び方を揃える シソーラスは、言葉同士の関係を整理した語彙集です。同じ意味の言葉を代表語にまとめるほか、上位語・下位語や関連語も記録します。 たとえば、チーム内で同じUIを「ダイアログ」「モーダル」と呼んでいるなら、代表語を一つ決め、もう一方を同義語として結び付けられます。「オーバーレイ」を上位語、「ドロワー」を関連語として扱うこともできます。仕様書とデザインシステムで表記が違っていても、同じ情報へたどり着きやすくなるでしょう。 タグの表記揺れを抑えたいときや、社内検索で資料の取りこぼしを減らしたいときに使いやすい方法です。よく使うUI用語を一覧にして、代表語・同義語・関連語を記録するだけでも、小さなシソーラスになります。 教育文献データベースのERICでは、シソーラスの統制語を各文献に付与しています。「Indexing」には同じ検索先へ導く語や上位語、関連語がまとめられ、表現が異なる文献も共通の語彙から探せます( ERIC Thesaurus )。 タクソノミー:置き場所を決める タクソノミーは、情報を一定の基準で分類し、主に階層として整理する仕組みです。たとえばデザインシステムなら、「基礎」の下に「色」「余白」「文字」、「コンポーネント」の下に「入力」「ナビゲーション」「フィードバック」を置く、といった構造が考えられます。 上位の分類から下位へたどれるため、情報の全体像を見渡しやすくなります。ドキュメント、社内Wiki、デザインシステムなど、共通の置き場所を用意したい場面に向いています。 一方で、複数の軸を一つの階層へ押し込むと、迷いが生まれることもあります。「エラー表示付きの入力フォーム」は、「入力」と「フィードバック」のどちらにも置けそうです。この場合は主となる分類軸を一つ選び、ほかの軸をタグで補う方法もあります。 Google Merchant Centerでは、商品を「Apparel & Accessories > Clothing > Outerwear」のように、大きな分類から具体的な分類へ配置します。独自の商品名でも共通の階層に対応させることで、商品群の整理や広告運用の軸として使えます( Google Merchant Centerの商品データ仕様 )。 オントロジー:意味のつながりを記述する オントロジーは、ある領域に存在するものの種類、性質、関係、必要に応じて制約を明示したモデルです。単に「近い言葉」「同じカテゴリ」として結ぶだけでなく、何と何が、どのような意味で関係しているかを表します。 たとえば、「機能」「画面」「コンポーネント」「API」「Issue」という種類を定義し、「画面は機能を提供する」「画面はコンポーネントを使う」「機能はAPIに依存する」「Issueは機能を変更する」といった関係を記述できます。すると、「このAPIの変更で影響を受ける画面と関連Issue」のような、複数の関係をたどる問いにも答えやすくなります。 Schema.orgには「Person」「Event」「Product」などの型と属性が定義されています。Webページの情報を意味のある

2026-08-26 原文 →
AI 资讯

Fzf com Tmux - integração e pop-ups

1. Retomando: o que é o Fzf Na primeira parte desta série vimos o que é o fzf, como instalá-lo e como usá-lo direto no shell com Ctrl+R , Ctrl+T e Alt+C . Quem também usa tmux no dia a dia ganha um segundo nível de integração: o fzf pode rodar dentro de janelas flutuantes (pop-ups) do próprio tmux, sem interferir no layout de painéis já aberto, e servir de seletor para operações do próprio tmux — trocar de sessão, de janela, de painel, matar processos em outro painel etc. 2. Por que integrar Fzf com Tmux Sem integração, usar o fzf dentro de uma sessão tmux funciona normalmente, mas cada busca ocupa o painel inteiro: se o objetivo é só escolher um arquivo ou trocar de branch rapidamente, o conteúdo do painel (um editor, um servidor rodando) é temporariamente coberto e é preciso "voltar" depois. Além disso, o tmux tem sua própria lista de coisas que fazem sentido filtrar de forma fuzzy — sessões, janelas, painéis — e não há um binding nativo do tmux para isso. O fzf-tmux , incluído na instalação do fzf, resolve o primeiro problema: roda o fzf em uma janela sobreposta (pop-up ou split temporário) que desaparece assim que a seleção é feita, sem afetar o conteúdo do painel original. Combinado com bindings customizados no tmux.conf , também resolve o segundo. 3. fzf-tmux: pop-ups nativos fzf-tmux é um wrapper de shell em torno do fzf que aceita as mesmas opções, mais flags de posicionamento e tamanho da janela sobreposta: # pop-up centralizado, 80% da largura e 60% da altura do terminal fzf-tmux -p 80%,60% # split na parte de baixo do painel atual, ocupando 40% da altura fzf-tmux -d 40% # split lateral à direita, ocupando 50% da largura fzf-tmux -d 50% -r A flag -p (disponível a partir do tmux 3.2, que suporta display-popup ) é a mais usada hoje: cria uma janela verdadeiramente flutuante, sobreposta ao conteúdo do painel, que não reorganiza o layout existente — diferente do -d , que faz um split real e temporariamente redistribui o espaço entre painéis. # substitui o Ctrl

2026-08-26 原文 →
AI 资讯

Portfolio Update, I Guess

This isn't my main piece for the week, it's more of a "contributes nothing to knowledge" kind of post. Last week I took another look at my portfolio and thought, "Hey, why not make this feel a bit more like me?" So I set out to give it a makeover, stuffed as much of my personality into it as I could, and et voilà, done. The old one was kinda too formal. TL;DR: I gave my portfolio a personality transplant. If you'd rather just look than read: a-thedeveloper.vercel.app Vibe / Tone Option By default, the professional option is enabled. But if you're not too sensitive and want to have a little fun, try toggling over to the unfiltered version of me, lol. I don't actually talk like that in real life anymore, but having grown up speaking English, that's pretty much how I sounded back in my teenage years. I was a grumpy teenager like everyone else, the difference is I was extra grumpy compared to most. 😭 I also lost access to my Instagram account, so all of it is still sitting there, public, for anyone to see. Every day I hope that account just quietly gets deleted. And if you're wondering whether that same energy has been erased, nope, it's still very much here. I just keep it contained to appropriate contexts now, lol. I also found these while digging through my old microsoft drive, weird 16 year old me stuff. I actually said this in a debate, by the way. Can't remember if my team won that one or lost. Weather Options Kinda irrelevant to how it actually describes my portfolio, but I initially wanted to make rainy the only option, because I'm a big fan of dark, gloomy, cloudy weather — the kind that makes England look like heaven to me. 😭 Then I thought, why not just have all of them? So now each weather option comes with its own falling elements based on the selection, plus music that I feel fits the atmosphere. Again, it doesn't really serve any practical purpose, but I think it's a nice little touch to have, haha. DEV Writing Views with an API Key When I joined DEV in 2

2026-08-26 原文 →
AI 资讯

A year of coding by talking: what I gained and what I lost

2024 was the year AI was everywhere. The ads, the praise, the feeling that something had already been decided without me. I am in my fifties. I had to decide whether to watch or take part. I decided to take part. I started with VS Code, on a paid plan. I did not have to think about what to build. Something had been sitting in my head for years: an automated trading system. I have lived fifty years, and while raising children the money got tighter, not looser. Financial freedom was moving away from me, not toward me. So I wanted to make money with automated trading. I think the idea first arrived in my mid-forties. That is why the decision to take part came so quickly. Whatever I said out loud would simply get built. That was the hope I walked in on. I do not really know how to code. But the AI would handle that part, so I trusted it. Where the illusion first cracked A year inside VS Code taught me that two names mattered: GPT and Claude. I used them in turn. I used them one at a time. Two problems. First, even on a paid plan the usage ran out fast. Faster than I expected. The road ahead was long and I was sitting still, waiting for a quota to reset. The second one was worse. The explanations were excellent. The results were not. That is where the illusion cracked for the first time. I still could not let go, so I paid for more. Adding Cursor bought me some headroom. And a different problem showed up immediately. Switch the model and it wants to start over Change the model, and it wants to rewrite everything from the beginning. Handed code written by a different AI, it would rather replace the whole thing than edit it. That is when I understood that switching AI mid-project is a bad idea. Everyone talks about pricing. Almost nobody talks about this one. And this is the one that actually held me back. I spent a lot of time fighting the tool. In the end I paid for Claude's hundred-dollar plan, and from then on I worked with Claude. What I gained: the job nobody wanted

2026-08-26 原文 →
AI 资讯

Building a Unicode Text Transformer with Pure Character Maps

I built Unicode Text Tools , a free site with a bunch of text converters — superscript, subscript, bubble/circled text, upside-down text, small caps, and more. Type something, get it transformed, copy it out. The whole engine is one dependency-free JS file built entirely from character mapping tables . No AI, no server, no libraries. Here's why that's the right architecture for this class of tool, and how the trickier conversions work. The core idea: it's all just lookup tables Every conversion on the site is a function that maps each input character to a Unicode character (or does a small transform). The simplest cases are pure dictionaries: // Superscript (full a-z, 0-9) var SUP = { a : ' ᵃ ' , b : ' ᵇ ' , c : ' ᶜ ' , d : ' ᵈ ' , e : ' ᵉ ' , f : ' ᶠ ' , g : ' ᵍ ' , h : ' ʰ ' , i : ' ⁱ ' , j : ' ʲ ' , k : ' ᵏ ' , l : ' ˡ ' , m : ' ᵐ ' , n : ' ⁿ ' , o : ' ᵒ ' , p : ' ᵖ ' , q : ' ᵠ ' , r : ' ʳ ' , s : ' ˢ ' , t : ' ᵗ ' , u : ' ᵘ ' , v : ' ᵛ ' , w : ' ʷ ' , x : ' ˣ ' , y : ' ʸ ' , z : ' ᶻ ' , ' 0 ' : ' ⁰ ' , ' 1 ' : ' ¹ ' , ' 2 ' : ' ² ' , ' 3 ' : ' ³ ' , ' 4 ' : ' ⁴ ' , ' 5 ' : ' ⁵ ' , ' 6 ' : ' ⁶ ' , ' 7 ' : ' ⁷ ' , ' 8 ' : ' ⁸ ' , ' 9 ' : ' ⁹ ' , ' + ' : ' ⁺ ' , ' - ' : ' ⁻ ' , ' = ' : ' ⁼ ' , ' ( ' : ' ⁽ ' , ' ) ' : ' ⁾ ' }; The transform itself is trivial — walk the string, look up each char, append the mapped value (or the original char if unmapped). The work is in the tables: knowing which Unicode blocks exist, what's 1:1 reversible, and what's incomplete. The Unicode reality check Here's the thing nobody tells you about Unicode text transformation: the blocks are inconsistent. Superscript : complete for a-z and 0-9 — fully reversible. Subscript : incomplete — there's no subscript b , c , d , f , g , q , w , y , z . If you map an input with those letters, you have to decide what to do with them. Small caps : x has no small-cap form ( ꞯ is the closest, but it's a different character and looks wrong). j is a problem too — the Unicode small-cap ᴊ collides visually

2026-08-26 原文 →
AI 资讯

GitHub Copilot Premium Requests: Allowances, Multipliers, Billing, and What Replaced Them

GitHub Copilot premium requests are the metered unit that determined how much advanced Copilot usage your plan covered, and if you are searching for how they work in mid-2026, you need two answers, not one. First, the mechanics: a premium request is consumed each time you use an advanced Copilot feature, scaled by a per-model multiplier, against a fixed monthly allowance that came with your plan. Second, the news: as of June 1, 2026, GitHub moved Copilot from request-based billing to usage-based billing , and premium requests are now officially labeled "legacy" throughout GitHub's own documentation. Their replacement is GitHub AI Credits, metered at one cent per credit. Both systems matter today. Annual Copilot Pro and Pro+ subscribers who stayed on their existing plans are still billed in premium requests, and every question about the new credits model (allowances, overages, admin controls) is easier to answer if you understand the system it replaced. Here is the complete picture, with the numbers. What is a premium request? GitHub's definition is simple: a request is any interaction where you ask Copilot to do something, whether that is generating code, answering a question, or reviewing a pull request. Routine interactions, like inline code completions, are unlimited on every paid plan and never touch the meter. Premium requests are the interactions that use more advanced processing, and they draw down a monthly allowance: Copilot Chat : one premium request per user prompt, multiplied by the model's rate (ask, edit, agent, and plan modes all count). Copilot code review : each review consumed one request originally; since June 1, 2026 it carries a 13x multiplier , so a single review deducts 13 premium requests. Copilot coding agent and CLI : one premium request per prompt or session, times the model's rate. Only your prompts count; the autonomous tool calls Copilot makes along the way do not. Spark : a fixed rate of four premium requests per prompt. The critical n

2026-08-26 原文 →
AI 资讯

Implementing Persistent AI Disclosure Without Killing the Persona Experience

Following the discussion on named AI personas and trust — here's the engineering side: how do you keep AI-status disclosure genuinely persistent throughout a conversation without making the interface feel robotic or constantly interrupting the experience a named persona is meant to create? The Naive Approaches Both Fail Option A: One disclaimer, message one, never again. Trivially easy to implement, but gets forgotten within a few exchanges — exactly the failure mode worth avoiding for personas carrying real emotional weight. Option B: Repeat "I am an AI" every single message. Technically persistent, but breaks the actual UX a named persona is trying to create, and users will tune it out as noise within a few messages anyway — repetition without variation loses its signal value fast. Neither is a good engineering solution. The better pattern is contextual, adaptive disclosure. Pattern: Risk-Weighted Disclosure Frequency python class DisclosureManager: def init (self, base_interval=8, high_risk_interval=3): self.base_interval = base_interval self.high_risk_interval = high_risk_interval self.messages_since_disclosure = 0 def should_inject_disclosure(self, message_risk_level: str) -> bool: interval = ( self.high_risk_interval if message_risk_level == "high" else self.base_interval ) self.messages_since_disclosure += 1 if self.messages_since_disclosure >= interval: self.messages_since_disclosure = 0 return True return False message_risk_level comes from the same classification pass used for scope/escalation detection covered in earlier persona-guardrail architecture — emotionally sensitive or high-stakes exchanges trigger disclosure more frequently than routine ones. Pattern: Disclosure Woven Into Persona Voice, Not Bolted On Rather than an interrupting system message, integrate the reminder into the persona's actual response style: python def inject_natural_disclosure(response_text, persona_config): disclosure_phrases = persona_config.disclosure_variants # e.g. for "Ок

2026-08-26 原文 →
AI 资讯

How I Reduced Burnout by Fixing My Nutrition Stack

I want to be upfront about something. I didn't figure this out proactively. I figured it out after my second burnout in three years — sitting in a period of forced recovery, unable to look at a code editor without feeling a specific kind of dread that I couldn't logic my way out of. I'd done everything the burnout recovery advice said to do. Took time off. Set better boundaries at the new job. Worked on the psychological stuff. All of it helped. None of it explained why recovery felt so much harder and slower than it should. Then I got bloodwork done. And the picture became considerably less mysterious. The Diagnostic Output bash $ bloodwork --full-micronutrient-panel --date=recovery-period [CRITICAL] vitamin-d: 18 ng/mL target: 40-60 ng/mL status: severely deficient duration: estimated 2+ years note: dopamine synthesis impaired at this level [CRITICAL] rbc-magnesium: low note: serum looked normal — wrong metric duration: unknown — never previously tested correctly note: HPA axis running unregulated [HIGH] omega3-index: 3.1% target: 8%+ status: neuroinflammation elevated note: western diet + zero supplementation [HIGH] hs-crp: 2.9 mg/L target: <1.0 mg/L status: significant systemic inflammation note: never measured, thoroughly normalized [WARNING] ferritin: low-normal note: passing standard panel, causing fatigue bugs-found: 5 bugs-known: 0 recovery-speed: severely impaired by all of the above Two burnouts. Same underlying biology. Neither time did anyone suggest checking any of these markers. What the Numbers Actually Meant Vitamin D at 18 ng/mL: Vitamin D is a direct input to dopamine synthesis. The enzyme that produces dopamine requires it. I had been trying to rebuild motivation and find meaning in work — the core challenge of burnout recovery — while running a dopamine system without adequate substrate. javascript // what I was trying to do dopamine.rebuild() // what the system had to work with vitaminD: 18 // severely deficient tyrosineHydroxylase.efficiency:

2026-08-26 原文 →
AI 资讯

Stop asking your AI agent to follow rules. Enforce them.

You've written it a hundred times. In your CLAUDE.md , in your system prompt, in ALL CAPS: NEVER put "use client" at the page level. NEVER commit @ts-ignore without a reason. And your agent does it anyway. Not always — that would almost be easier to deal with. It follows the rule for the first 50k tokens, then quietly stops. Or Sonnet follows it and Haiku doesn't. Or it follows nine rules and forgets the tenth. Here's the thing I finally accepted: a rule in a prompt is a request. The model can decline it. So I stopped asking, and started enforcing. TL;DR Prompt adherence is probabilistic. It degrades with context length and with model size. But half of my coding rules never needed a model at all — they're grep-able. Claude Code hooks + exit 2 turn those rules into a deterministic reviewer that runs after every single edit , costs zero tokens when nothing is wrong , and fires at 100% regardless of which model wrote the code. Once the mechanical rules are enforced from below, you can safely downgrade the model doing the typing. That's the real payoff. Everything below ships in ccteams v0.3.0 , but the pattern takes 30 minutes to build yourself. Two kinds of rules Some background in three lines: I run Claude Code with orchestrated agent teams — a builder writes code, a reviewer verifies it, and both get a stack-specific "playbook" of rules distilled from the mistakes mid-tier models actually make. It works well. I wrote about the prompt-engineering side of it before. But rereading my playbooks, I noticed the rules split cleanly into two categories. Rules that need judgment: Trace the Server/Client boundary by hand. Don't write a fix until you can state the root cause. These need a model. Prompts are the right place for them. Rules that are just string matching: "use client" at the top of app/**/page.tsx → wrong. process.env.SECRET in a client file → wrong. @ts-ignore with no justification → wrong. Why was I asking a language model to remember these? A regex doesn't get

2026-08-25 原文 →
AI 资讯

Chega de git stash: como trabalhar em múltiplas features em paralelo com git worktree

Se você já perdeu tempo com essa sequência: git stash git checkout outra-branch # resolve o problema urgente git checkout branch-original git stash pop ...só pra descobrir depois que esqueceu o que tinha no stash, ou que o venv / node_modules da outra branch estava desatualizado — este artigo é pra você. O problema Um repositório Git tradicional tem uma única pasta de trabalho ligada a uma branch por vez. Trocar de branch significa trocar todo o conteúdo dessa pasta. Isso funciona bem quando você faz uma coisa de cada vez, mas quebra assim que você precisa: Revisar um PR urgente enquanto está no meio de uma feature grande Rodar testes de uma branch enquanto edita outra Manter ambientes de dependências diferentes (versões de libs, .env ) para features distintas sem reinstalar tudo a cada troca A saída mais comum é o stash , mas ele é frágil: some da vista, acumula, e é fácil esquecer o que tinha ali dentro. A solução: git worktree O git worktree permite ter várias pastas de trabalho simultâneas , cada uma vinculada a uma branch diferente, todas compartilhando o mesmo histórico de commits (o .git ). Pense em uma biblioteca central (o histórico do repositório) com várias mesas de leitura (as worktrees), cada uma com um livro diferente aberto. Você não precisa fechar um livro pra abrir outro. O que é compartilhado, o que é separado Compartilhado entre worktrees Separado por worktree Histórico de commits Arquivos da working directory Objetos do Git (blobs, trees) Arquivos não versionados ( .env , venv , node_modules ) Configuração do repositório Saída do git status Um commit feito em uma worktree aparece imediatamente no git log das outras — mas os arquivos físicos de cada pasta continuam independentes. Colocando em prática Criando uma worktree com branch nova git worktree add ../meu-projeto-feature-x -b feature/nome-da-feature Isso cria a pasta ../meu-projeto-feature-x , já com uma branch nova feature/nome-da-feature criada a partir do commit atual. Criando uma worktree

2026-08-25 原文 →
AI 资讯

Free AI Tiers Bill You in Hours, Not Dollars

Free AI Tiers Bill You in Hours, Not Dollars Free model access looks like a bargain until you track the hours you spend feeding context back into a model with no memory. A zero-cost invoice hides the most expensive resource in your workflow: your own attention. My position is straightforward: treat a free tier like a metered service and measure the hidden costs before you adopt it. The token counter tells you almost nothing about the real price. Disclosure: This article was prepared as part of MonkeyCode's product outreach. I'm using MonkeyCode's free model access and free server option as a concrete example; the measurement approach applies to any free tier. The dashboard shows tokens, not time Every free plan advertises a generous token allowance and a server that wakes up on demand. What the marketing page omits is the labor you spend reassembling context, waiting for cold starts, and double-checking output. Those costs do not appear on any invoice, but they consume your day in chunks. Four of them matter more than the token meter. Context reconstruction — Every new conversation starts from zero, so you re-explain your stack, your file layout, and your constraints. Those re-pasted tokens count against the same allowance you were trying to save. Cold-start waiting — A free server that sleeps after idle adds seconds to every call. Multiply that by a scheduled job that fires hourly and you have lost real time. Human verification — Confident output still needs a human to check it, and that check is the most expensive line item in the whole system. Attention fragmentation — A free allowance looks huge until you split it across codegen, debugging, and review. Small tasks nibble the budget faster than big ones. A ten-minute audit script The script below turns the argument into a reproducible measurement. It sends three representative prompts to any OpenAI-compatible endpoint, records wall-clock latency, and extracts token usage from the response. Run it several times du

2026-08-25 原文 →
AI 资讯

Your AI Coding Agent Doesn't Have a Junior-Developer Problem. It Has an Amnesia Problem.

How 41 codified laws, 22 specialist roles, and a file-based memory system stopped an autonomous coding agent from quietly re-breaking the same production defect every few weeks — and why I'm open-sourcing the whole thing as LEO. Ten times faster, ten times more garbage Developers reach for Cursor and Copilot to write code ten times faster, and the tools deliver on exactly that promise — which turns out to be most of the problem. Used as advanced autocomplete, an LLM doesn't produce ten times more good code. It produces legacy at ten times the usual rate. You ask for a feature; the model hands back a wall of if / else ; you ship it. Two months later the codebase reads like it was assembled by five people who never spoke to each other, the test suite is red more often than green, and the senior engineers who never touched the tool get to point at the wreckage and say, "See? AI is just a toy." They are not wrong about the wreckage. They are wrong about what caused it. The bug that wasn't a bug Directing an AI coding agent on real, paying engagements — multi-tenant SaaS platforms, one of them with background AI pipelines — surfaced the same shape of defect more than once, in different files, weeks apart. My own project's changelog ( roles/SYSTEM_UPGRADE_MANIFEST.md — every rule this system has ever added is logged there, with a reason) documents the pattern directly: a rate limiter that could be starved by its own retries because the check-and-consume wasn't atomic at the point of the call. A background worker whose heartbeat proved it was pinging, not that it was making progress — a zombie that looked alive on the dashboard. A held database transaction that outlived the request that opened it and sat there as a lock-holding corpse until something else timed out behind it. Each time, the agent's code was syntactically perfect. Each time, it passed its own tests. None of this was "the AI is bad at coding" — a frontier model in 2026 writes fine syntax all day. What the lo

2026-08-25 原文 →