<?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>Forem: Alex Rezvov</title>
    <description>The latest articles on Forem by Alex Rezvov (@arezvov).</description>
    <link>https://forem.com/arezvov</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F909464%2F7063c552-d97b-4a5a-b1fe-7aaa6ba14706.jpg</url>
      <title>Forem: Alex Rezvov</title>
      <link>https://forem.com/arezvov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/arezvov"/>
    <language>en</language>
    <item>
      <title>How to Overcome Internal Doubts After Making Decisions</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Thu, 16 Apr 2026 07:24:20 +0000</pubDate>
      <link>https://forem.com/arezvov/how-to-overcome-internal-doubts-after-making-decisions-499i</link>
      <guid>https://forem.com/arezvov/how-to-overcome-internal-doubts-after-making-decisions-499i</guid>
      <description>&lt;p&gt;Recently, there was a discussion about how to act when doubts arise after making a decision. I’d like to share my thoughts.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you are leading a department or an organization and need to make a difficult decision. You’ve carefully weighed the pros and cons, thought everything through, and made your choice. However, during implementation, doubts start creeping in. These doubts may lead to hesitation or even subtle self-sabotage.&lt;/p&gt;

&lt;p&gt;And yet, no new circumstances have arisen. All external factors remain the same as when the decision was made.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;How to Counter Doubts?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my view, this situation mirrors how a subordinate might resist a decision they don’t fully accept. Such resistance can manifest in formal compliance but with minimal effort, delays, or even subtle sabotage.&lt;/p&gt;

&lt;p&gt;The usual solution? Discussions before the decision. If open dialogue is encouraged in your organization, all opinions should be heard during the decision-making process. Once the decision is finalized, however, it must be accepted as a collective commitment. Without this clarity, unresolved doubts can disrupt implementation and potentially spread uncertainty within the team.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you doubt your own decisions, the dynamic is similar. You become both the leader and the hesitant subordinate. Just as an uncommitted team member can spread doubt among colleagues, your own internal hesitation can undermine your confidence and, ultimately, the team's morale.&lt;/p&gt;

&lt;p&gt;Your task as a leader is to convince yourself first. Commit fully to the decision you’ve made, as the time for discussion and doubt is over. Once you believe in the decision, your confidence will naturally guide and inspire others.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Role of Internal Confidence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A leader’s internal confidence is a cornerstone for motivating the team and aligning their efforts. Hesitation from you can easily ripple through the group, undermining their motivation and direction. To keep your team moving forward effectively:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Strengthen your belief&lt;/strong&gt; in the decision.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Stay consistent&lt;/strong&gt; in your actions.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Communicate clearly&lt;/strong&gt; to ensure alignment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only when you convince yourself can you inspire the same trust and commitment in others.&lt;/p&gt;




&lt;h1&gt;
  
  
  PeopleManagement #LeadershipConfidence #DecisionMaking #OvercomingDoubt #TeamMotivation #EffectiveLeadership #SelfTrust
&lt;/h1&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/how-to-overcome-internal-doubts-after-making-decisions" rel="noopener noreferrer"&gt;How to Overcome Internal Doubts After Making Decisions — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>career</category>
    </item>
    <item>
      <title>LinkedIn Sales Navigator: The Tool We Need, Not the One We Have</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Wed, 15 Apr 2026 05:34:13 +0000</pubDate>
      <link>https://forem.com/arezvov/linkedin-sales-navigator-the-tool-we-need-not-the-one-we-have-i34</link>
      <guid>https://forem.com/arezvov/linkedin-sales-navigator-the-tool-we-need-not-the-one-we-have-i34</guid>
      <description>&lt;p&gt;When I explore a specialized tool in a field where I am new, I expect it to be designed by experts with a deeper understanding than I could ever have. After all, I am an amateur, while experienced professionals must have thought carefully about solving the problem in the best way. These were exactly my expectations for LinkedIn Sales Navigator: I thought that the obvious features I needed were already implemented and of the highest quality.&lt;/p&gt;

&lt;p&gt;How wrong I was.&lt;/p&gt;

&lt;h3&gt;
  
  
  First Task: Finding Explicit Needs
&lt;/h3&gt;

&lt;p&gt;The first and most obvious task is to find those companies or individuals who explicitly state their need for a product or service.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In my case, I provide&lt;/em&gt; &lt;a href="https://foreachpartners.com" rel="noopener noreferrer"&gt;&lt;em&gt;development services&lt;/em&gt;&lt;/a&gt; &lt;em&gt;of above-average quality on the global market, with prices lower than 75% of companies worldwide.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Although I’ll use my example, the task remains the same regardless of the product: to find those who need it.&lt;/p&gt;

&lt;p&gt;What signals can help identify those who need high-quality development at a relatively low cost? The most obvious way is to find those who directly post about it on LinkedIn. Imagine my disappointment when I discovered that LinkedIn Sales Navigator doesn’t allow users to subscribe to notifications for such posts! Dear LinkedIn team, we have LLMs and countless other tools that can practically identify intents flawlessly in any text.&lt;/p&gt;

&lt;p&gt;This is the first feature that LinkedIn Sales Navigator should have implemented, and I believe it's the feature I and most other users would immediately subscribe to upon purchasing the tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcf2vovwygonortf500r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcf2vovwygonortf500r.png" alt="Screenshot of LinkedIn post requesting development services" width="554" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example of what a real development service request looks like&lt;/p&gt;

&lt;h3&gt;
  
  
  Second Task: Analyzing User Behavior
&lt;/h3&gt;

&lt;p&gt;Let’s move forward. Let’s assume we are already subscribed to explicit product or service requests.&lt;/p&gt;

&lt;p&gt;What if we tried to find those who have realized their need for development and exhibit it in their behavior—for example, by visiting development team pages, messaging developers privately, etc.? We already have amazing tools like data analytics, LLMs, and others, don’t we, LinkedIn engineers?&lt;/p&gt;

&lt;p&gt;So, the second feature I’d subscribe to is the ability to identify those who have realized their need for development services but haven’t yet published an explicit request on LinkedIn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third Task: Predicting Unconscious Needs
&lt;/h3&gt;

&lt;p&gt;An even more advanced feature would be identifying users who need development services but haven’t yet realized it. For example, they read and comment on articles about managing developers or implementing Agile methods in their teams. Such users might actively explore automation, discuss hiring challenges, or share issues related to digital transformation.&lt;/p&gt;

&lt;p&gt;I understand that implementing such a feature would require more effort than a few students from Computer Science courses could handle, unlike the previous tasks. But we’re talking about the mighty LinkedIn, aren’t we?&lt;/p&gt;

&lt;p&gt;Such tools would transform LinkedIn Sales Navigator into a modern and fully-fledged sales tool rather than leaving it as a basic directory of companies and leads with primitive filters, as it is today.&lt;/p&gt;

&lt;p&gt;This kind of tool would allow providers of goods and services to deliver their proposals directly to the users who need them at the right time—or even slightly earlier. This would reduce spam in personal messages, expand the options for buyers, and make the world a little better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In conclusion, the lack of such a tool opens up opportunities for its creation. Of course, LinkedIn has far more data than we mere mortals do, but even with publicly available data, many of these tools can be implemented. The specialists at &lt;a href="https://foreachpartners.com" rel="noopener noreferrer"&gt;ForEach Partners&lt;/a&gt; are capable of tackling such a task.&lt;/p&gt;

&lt;p&gt;If you want to launch such a product, contact us at &lt;a href="mailto:sales@foreachpartners.com"&gt;sales@foreachpartners.com&lt;/a&gt;—let’s discuss the terms of cooperation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/linkedin-sales-navigator-the-tool-we-need-not-the-one-we-have" rel="noopener noreferrer"&gt;LinkedIn Sales Navigator: The Tool We Need, Not the One We Have — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opinion</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How We Helped a Client Regain Control of Their Business</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Tue, 14 Apr 2026 05:02:19 +0000</pubDate>
      <link>https://forem.com/arezvov/how-we-helped-a-client-regain-control-of-their-business-537h</link>
      <guid>https://forem.com/arezvov/how-we-helped-a-client-regain-control-of-their-business-537h</guid>
      <description>&lt;p&gt;In the world of development, there are times when professional collaboration crosses unacceptable boundaries. Our team at &lt;a href="https://foreachpartners.com/" rel="noopener noreferrer"&gt;ForEach Partners&lt;/a&gt; faced one such situation while working on a complex project for a client. What happens when a contractor turns a business-critical website into a tool for blackmail? Threats to shut down the website, which supports key business processes, become a means of coercion. The contractor retained exclusive control over the source code, database, and hosting, leaving the client without access to these critical assets.&lt;/p&gt;

&lt;p&gt;This is the story of how we not only helped a client escape such a dire situation but also built a robust system that became a reliable foundation for their business.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It All Began
&lt;/h3&gt;

&lt;p&gt;The client approached us, sensing an impending crisis. Their previous developers retained control over the source code and database of their portal, dictating terms, deadlines, and costs. Sometimes, they even halted the site’s operation if the client insisted on their own terms. For a business involved in international logistics, such disruptions were catastrophic.&lt;/p&gt;

&lt;p&gt;We advised immediate action to create a contingency plan for the portal, even if it required engaging another team. Our goal was to protect the client’s interests and help them navigate out of this crisis. Our experience told us that delaying such decisions only worsens the situation.&lt;/p&gt;

&lt;p&gt;The client left to consider their options but returned a few months later. "You were right," they said. "The situation has worsened. Action should have been taken yesterday."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"In every project, the client’s interests must come first. That’s the only way to achieve success."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Development Phase
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Creating a Transitional Solution
&lt;/h4&gt;

&lt;p&gt;We utilized everything available from the existing site—HTML, CSS, and JavaScript—to quickly launch a new version of the portal. These resources were used as-is to minimize time and expedite implementation. Where possible, pages remained static in the same form as retrieved from the old site.&lt;/p&gt;

&lt;p&gt;Dynamic functionality, such as allowing users to place new orders, required new server-side logic. Transferring the existing logic was impossible, as the server’s source code was inaccessible. We chose Django as the platform, given its ready-to-use tools for most common tasks. This enabled us to quickly build an interactive and flexible system that met the site’s requirements. Additionally, Django includes a built-in administrative panel, which, while not the most user-friendly, served as a sufficient temporary solution for the current needs.&lt;/p&gt;

&lt;p&gt;This approach allowed us to launch the system quickly while preserving its functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  How We Gathered Data
&lt;/h4&gt;

&lt;p&gt;To migrate data from the old portal, we developed parsers using Scrapy. The primary challenge was to collect the data discreetly to avoid suspicion from the contractors. The parsers operated from the client’s workstation, making low-frequency requests to stay under the radar.&lt;/p&gt;

&lt;p&gt;Together with the client, we identified all necessary data to ensure a seamless launch of the portal within their own infrastructure. The data was collected carefully and discreetly, avoiding any unnecessary risks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Securing the Website
&lt;/h4&gt;

&lt;p&gt;Simultaneously, we addressed security concerns. We implemented CloudFlare to filter external traffic and conducted a security audit with an experienced specialist from &lt;a href="https://foreachpartners.com/domain/informationsecurity" rel="noopener noreferrer"&gt;ForEach Partners&lt;/a&gt;. Addressing the identified vulnerabilities minimized the risk of sabotage by the contractors and ensured robust system protection.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fast Launch
&lt;/h4&gt;

&lt;p&gt;Within a month, we completed all tasks: data collection, security setup, and the development of a transitional site based on Django. Static pages remained unchanged where possible, while dynamic elements were handled by Django. As a result, the site launched quickly, maintaining functionality. Thanks to our swift actions, the client avoided sabotage from the contractors and resumed operations on the new platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transition to the New Version of the Site
&lt;/h3&gt;

&lt;p&gt;After the successful launch of the prototype, the client fully transitioned to using the new version of the site. This version allowed them to perform all previous tasks through the administrative panel, though some were not implemented in the most convenient way. For users, practically nothing changed. The only request we made was for them to change their passwords upon first login. Passwords were the only data we couldn’t transfer from the old portal. For users, this appeared as a standard security update and a precautionary password reset. They never realized the massive overhaul behind the scenes!&lt;/p&gt;

&lt;p&gt;At this point, the client breathed a sigh of relief and parted ways with the old contractors. We continued working together on improving the system, creating an updated and more powerful version of the site tailored to the business’s evolving needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase Two: Building a Complete System
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Technology and Features
&lt;/h4&gt;

&lt;p&gt;We transitioned to the second phase—developing a flexible and modern system. Using Django Rest Framework (DRF) for the backend and Vue.js with Nuxt.js for the frontend, we achieved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Independence between user and admin interfaces.&lt;/li&gt;
&lt;li&gt;  APIs for integration with mobile applications and bots.&lt;/li&gt;
&lt;li&gt;  Scalability for future changes and enhancements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Advantages of the New System
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Modernity:&lt;/strong&gt; A completely revamped design improved the user experience.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Flexibility:&lt;/strong&gt; The architecture easily adapts to new tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, we ensured that the client had full access to all keys, source codes, and backups at every stage. For us, this is standard practice with all clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons We Learned
&lt;/h3&gt;

&lt;p&gt;This project reminded us that success begins with genuine partnership and protecting the client’s interests. Only this approach builds trust and leads to sustainable results. When working toward the client’s goals, relationships become partnerships, and projects become successful.&lt;/p&gt;

&lt;p&gt;We are proud to have helped our client regain control and grow their business without fear of unscrupulous contractors.&lt;/p&gt;

&lt;p&gt;What conclusions can we draw to share with other developers?&lt;/p&gt;

&lt;p&gt;No matter how you try to bind a client to you through force, there will always be someone to help them break free. Trust can only be earned through conscientious pursuit of the client’s goals.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/how-we-helped-a-client-regain-control-of-their-business" rel="noopener noreferrer"&gt;How We Helped a Client Regain Control of Their Business — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>casestudy</category>
    </item>
    <item>
      <title>You Pressured a Contractor on Price: Consequences</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Fri, 10 Apr 2026 06:08:38 +0000</pubDate>
      <link>https://forem.com/arezvov/you-pressured-a-contractor-on-price-consequences-pcg</link>
      <guid>https://forem.com/arezvov/you-pressured-a-contractor-on-price-consequences-pcg</guid>
      <description>&lt;p&gt;During the negotiation process for your software development project, you managed to halve the proposed cost. Great news! Or is it?&lt;/p&gt;

&lt;p&gt;Imagine this scenario: you are the person responsible for overseeing a development project in your company. Your task is to guide the project from the requirements stage all the way to deployment in production. You’ve prepared a technical specification, identified several potential contractors in the market, analyzed their proposals, and are now deciding which one to partner with for the project.&lt;/p&gt;

&lt;p&gt;Most likely, the contractor’s proposed cost will rank second or third among your decision-making criteria.&lt;/p&gt;

&lt;p&gt;It’s very likely that you’ll see a wide variation in the cost estimates provided by contractors—sometimes differing by an order of magnitude.&lt;/p&gt;

&lt;p&gt;Now, let’s say you’ve chosen a company, clarified the scope through discussions, and in the final meeting, successfully negotiated a significant price reduction. Let’s explore the potential reasons they agreed to your terms and the possible consequences of such a deal.&lt;/p&gt;




&lt;h3&gt;
  
  
  Reserved Margin for Negotiation
&lt;/h3&gt;

&lt;p&gt;Experienced salespeople know that price negotiations are inevitable after the initial estimate is presented. They expect to concede something—but not too much. You manage to negotiate a 10–15% discount from the initial price, which they reluctantly grant because you’re an excellent negotiator who knows how to hold your ground. Most likely, you’ve only bargained away the margin they had specifically added for such concessions. If no negotiation happens, it’s great news for the seller, who will likely earn a much larger commission for the deal.&lt;/p&gt;

&lt;p&gt;This is a common dynamic, especially when dealing with large companies.&lt;/p&gt;

&lt;p&gt;Moreover, experienced salespeople have a few tricks up their sleeves when presenting initial estimates to clients. If the contractor finds the project financially attractive, they will usually discuss pricing verbally during an in-person meeting while closely observing your reactions. The cost can change within seconds, depending on your response. Tactics might include phrases like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  “The price includes/excludes VAT, of course.”&lt;/li&gt;
&lt;li&gt;  “Naturally, this includes/excludes a year of support, which can be added/removed.”&lt;/li&gt;
&lt;li&gt;  “This is the estimate for the first phase/the entire project,” depending on your reaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re dealing with a contractor of this type, the money you’ve managed to negotiate is indeed saved for your company. You won’t be able to force them into a loss-making position that could endanger the project, which we’ll discuss in other scenarios. Well done! Although it’s possible you didn’t negotiate the full margin that was reserved for concessions—without insider information, you’ll likely never know.&lt;/p&gt;




&lt;h3&gt;
  
  
  Contractor Resources Are Idle
&lt;/h3&gt;

&lt;p&gt;Sometimes a contractor has unused resources freed up after completing a project, and these resources are sitting idle “on the bench.” These are usually expensive IT specialists whose salaries still need to be paid, even though they’re not generating revenue. Contractors may temporarily assign them to internal projects but will seize any opportunity to sell their time.&lt;/p&gt;

&lt;p&gt;In such cases, the contractor’s salesperson may approach negotiations with a goal of covering at least the resource costs. Discounts of 30–50% may be on the table, depending on the company.&lt;/p&gt;

&lt;p&gt;A skilled salesperson will, of course, try their best to ensure their company still profits from the project and will only offer significant price reductions under very unfavorable circumstances combined with effective negotiation tactics by the client. To achieve this, you need to not only demonstrate a willingness to walk away from the deal but actually reject it, citing the high cost, so the contractor “chases you to the door.” Without insider information, you won’t easily detect this situation, and guessing it blind would be either extraordinary luck or a genuine disagreement over cost.&lt;/p&gt;

&lt;p&gt;If you’ve landed in this scenario, the project should ideally be short-term with potential for expansion into a larger project where the contractor can earn more. If the contractor is willing to provide resources at cost for an entire year, this should raise some red flags.&lt;/p&gt;

&lt;p&gt;Furthermore, when prices are halved, a reasonable contractor will always provide an explanation for the reduction. In cases of idle resources, there’s no reason to hide this once the discount is offered, and they will likely tell you directly.&lt;/p&gt;

&lt;p&gt;Is it good news for you that you managed to pressure the contractor into such a significant price cut? From a business perspective, it is—while the project may be ballast for the contractor, they will still aim to complete it since they’ll have funds to sustain the resources allocated to your project. However, the likelihood of getting their best specialists or exceeding your expectations decreases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contractor Manipulates Project Estimates
&lt;/h3&gt;

&lt;p&gt;Previously, we examined cases where contractors act in good faith. However, this is not always the case.&lt;/p&gt;

&lt;p&gt;As mentioned earlier, it’s common during competitive bidding for a client to receive cost estimates that vary by tens—or even hundreds—of times. For an inexperienced client, this can be disorienting, but in the development market, it’s a typical occurrence.&lt;/p&gt;

&lt;p&gt;In fact, many clients would gain valuable insights into the nuances of their project if they had access to the internal evaluation materials of an experienced contractor.&lt;/p&gt;

&lt;p&gt;This price variation can be attributed to several factors, ranked by their level of influence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Competence of the Contractor in the Task at Hand&lt;/strong&gt;
This is the most critical factor. Often, the more competent the specialist, team, or company, the more pessimistic their estimate. Understanding a contractor’s competence is a broad topic that I may cover in another article. In short, people tend to oversimplify tasks they’re unfamiliar with. For example, renting out an apartment on a daily basis might seem as easy as posting an ad and collecting payments. Similarly, setting up a mining operation might seem as simple as assembling a shed full of computers. However, as you delve into the details, you’ll find that they change everything. A similar effect occurs when incompetent specialists evaluate projects: tasks appear much simpler than they actually are.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Technological Solutions and Work Methodology&lt;/strong&gt;
This is what clients typically aim to assess by comparing different proposals. In an ideal world, project costs would vary only based on the chosen technology stack and methodology. However, in the real world, there are numerous ways to build a system to meet the same requirements. These approaches cannot always be linearly compared. Each technology stack has its strengths, such as development speed, system reliability, availability of specialists, maintenance costs, and more. The same applies to process organization within a contractor’s team, although there are fewer options. These can range from:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Highly bureaucratic approaches:&lt;/strong&gt; Characterized by slow development speeds and high costs but less dependence on human factors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Chaotic or self-organized methods:&lt;/strong&gt; In which no one is explicitly accountable, and task prioritization may be unclear. However, these teams can deliver remarkably fast results at lower costs and acceptable quality. Such organizations are fragile, and the departure of even one specialist can jeopardize the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Current Project Load of the Contractor&lt;/strong&gt;
It’s one thing when a contractor’s resources are fully booked for a year, and another when employees are sitting idle. As previously discussed, idle resources may lead to more competitive pricing. At the other extreme, a contractor uninterested in your project may quote a “take it or leave it” price. They might also provide such a quote if they have significant doubts about the client’s adequacy, solvency, or legal standing.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Negotiation Tactics&lt;/strong&gt;
Experienced contractors are well aware of the wide variation in estimates for the same project. They understand that most clients will start by considering the cheapest offers while dismissing outliers. This leads to strategic pricing games: quoting a realistic estimate may mean not being considered at all, while quoting a much lower price to engage the client often results in significantly higher costs later during contract negotiations. This chapter focuses on this manipulative scenario.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  When Contractors Manipulate Costs to Win the Project
&lt;/h3&gt;

&lt;p&gt;This scenario occurs when a competent contractor provides a realistic estimate but drastically undercuts it to initiate contact with the client. They know that, one way or another, they will eventually recover the initially calculated cost—or more.&lt;/p&gt;

&lt;p&gt;The goal of such a contractor is to establish contact, demonstrate their competence, and eventually negotiate a contract at the originally calculated price. Less scrupulous contractors may sign a contract with the intention of extracting “their” money during the project’s execution. Development contracts often leave room for interpretation, and many aspects are difficult to formalize, as clients often don’t fully know what they want at the evaluation stage. Unscrupulous contractors exploit these vulnerabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning Signs of Manipulative Contractors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Agreeing to any of your terms without hesitation.&lt;/li&gt;
&lt;li&gt;  Adjusting the price during discussions to match any figure you want to hear.&lt;/li&gt;
&lt;li&gt;  Minimal pretense of carefully considering conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their plan is to recover their costs during the project’s implementation.&lt;/p&gt;




&lt;h3&gt;
  
  
  How to Respond to Manipulative Contractors
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;If You Haven’t Signed a Contract Yet&lt;/strong&gt;
The best course of action is to disengage immediately. Manipulative pricing is not just a red flag for the cost but also a warning about how the contractor will treat the client throughout the partnership. This behavior indicates a lack of respect and trustworthiness. You don’t need to explain your true reasons; a standard response like “we’ve chosen a more experienced contractor for our needs” will suffice. Save your energy and move on to another proposal.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;If You’ve Already Signed a Contract&lt;/strong&gt;
Unfortunately, the situation becomes much more complicated. You’ll likely learn of the bad news when it’s too late to back out, switch contractors, or cancel the project. Worse, as the person responsible for the project in your company, you’ll bear the blame for any failure. After all, you were the one who selected or recommended the contractor. This places you in a hostage situation. Here are your options:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Accept the contractor’s terms:&lt;/strong&gt; This is, unfortunately, a common choice. The project then proceeds in a way that serves the contractor’s interests rather than those of your company. The contractor may unilaterally change project goals, requirements, approaches, timelines, and costs—staying just within reasonable limits to avoid legal repercussions. Alarmingly, project leads often fail to recognize that they are working against their company’s interests. This explains why so many large-scale development projects ultimately fail.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Seek help from leadership and advisors:&lt;/strong&gt; The ethical option is to explain the situation to your leadership and work together to minimize losses. This often involves bringing in lawyers, consultants, or other specialists to manage the fallout. The primary risk is that the project may be deemed unsuccessful, and the blame will fall on you. Whether this results in further consequences depends on your company’s internal climate, management style, and the specific circumstances.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  A Word to Manipulative Contractors
&lt;/h3&gt;

&lt;p&gt;To contractors who deliberately mislead clients: be aware that there are organizations that won’t hesitate to hold you accountable, even outside legal frameworks. This accountability might not target your organization as a whole but rather you personally, along with your leadership, for failing to meet your stated terms. You may think you’re exploiting inexperienced startup teams, but those “naive” clients may have backers for whom such deception is intolerable. The consequences will be unpleasant—primarily for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Contractor Failed to Protect Their Interests
&lt;/h3&gt;

&lt;p&gt;After reviewing various proposals, you select the most appealing one. The price seems reasonable, but as a conscientious employee advocating for your company’s interests, you decide to attempt negotiating a lower cost. After all, you’re aware that contractors often include a margin for negotiation in their initial quotes.&lt;/p&gt;

&lt;p&gt;During discussions, you present compelling arguments for why the price is too high—for example, citing competing offers, referencing strict budget constraints, or other reasons. Preparing for resistance, you propose a significantly lower price, perhaps half of the original estimate, but instead of negotiating, the contractor simply agrees. An experienced negotiator will likely recognize this scenario as a sign of inexperienced counterparts. A lack of negotiation skills often indicates broader inexperience in the contractor’s operations.&lt;/p&gt;

&lt;p&gt;So, what could go wrong when you successfully push an inexperienced contractor into accepting half of their original price?&lt;/p&gt;




&lt;h3&gt;
  
  
  When Inexperience Leads to Unrealistic Estimates
&lt;/h3&gt;

&lt;p&gt;As mentioned earlier, inexperienced specialists often underestimate the complexity of tasks, believing them to be simpler than they are. Most likely, the contractor’s initial estimate was already underpriced, which may have been what attracted your attention in the first place. By drastically reducing this already low estimate, you guarantee that the contractor will be unable to complete the project within the agreed budget. The contractor may not even consider this possibility, relying instead on overly optimistic, almost fantastical scenarios. Unfortunately, this is common among novices.&lt;/p&gt;

&lt;p&gt;Let’s explore what might happen when the money runs out midway through the project, even if the contractor initially appears to be progressing well. Imagine a scenario where the project is halfway done, and things seem “almost complete,” but the funds are exhausted.&lt;/p&gt;




&lt;h3&gt;
  
  
  Possible Outcomes When the Budget Runs Out
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;The Contractor Covers the Deficit&lt;/strong&gt;
The contractor might attempt to fund the remaining work themselves. This approach is sometimes seen when a development team operates within a larger organization with an unrelated core business. In such cases, the parent company may step in to preserve its reputation, even if it incurs a loss. However, these companies typically have experienced negotiators who wouldn’t have allowed such a significant concession in the first place. When this happens, it’s often due to an initially flawed estimate rather than unexpected negotiation outcomes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Team Works at a Loss&lt;/strong&gt;
If the contractor is a closely-knit team of developers with complementary skills, they might work at a significant loss to complete the project. Such cases are rare but do happen, and they often lead to the formation of exceptionally strong and reliable teams. However, these teams usually avoid similar situations in the future.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Contractor Requests Additional Funds&lt;/strong&gt;
The contractor may look for reasons to justify additional payments. Technical specifications often allow for broad interpretations, and clients rarely have a clear vision of their exact requirements. This creates opportunities for renegotiation. If you manage to allocate additional funds, this can be a viable solution. However, in many large organizations, accessing extra funding requires navigating multiple committees over several months. By that time, a small contractor may no longer be operational.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Contractor Avoids Their Obligations&lt;/strong&gt;
A common scenario involves the contractor’s leadership and team disappearing entirely—phone calls go unanswered, emails are ignored, and communication ceases. While you can initiate formal legal proceedings based on contractual obligations, the project is effectively abandoned. Relationships with the current contractor are likely irreparably damaged, and transitioning the project to another team midway is nearly impossible, especially since the original team was inexperienced. Remember, it was you who selected this contractor.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  What to Do in This Situation?
&lt;/h3&gt;

&lt;p&gt;You can’t simply tell the contractor that they shouldn’t have agreed to such a steep price cut and ask them to reconsider. Here’s how to navigate this situation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Acknowledge That You’re Working with an Inexperienced Team&lt;/strong&gt;
This isn’t necessarily a bad thing—it can sometimes even be beneficial—but you must understand the associated risks. We’ll discuss these risks in more detail another time.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Ensure the Contractor Understands the Project Costs&lt;/strong&gt;
Verify that the contractor has a realistic understanding of the project’s cost and only agreed to your terms under pressure. You can do this by digging into the cost structure and asking detailed questions. Don’t hesitate to ask “obvious” questions to piece together the entire process—from the moment the team starts drafting requirements to delivering a system ready for support. Who will design the interface? Who will program the server, design the database, test the system, support users at launch, write documentation, and oversee progress? Demand a cost breakdown not only by specialization but also by system requirements—for example, the time required to develop an authentication module, integrate with SAP PI, or implement compliance with data protection regulations. Assessing whether the contractor has considered these details doesn’t require special qualifications—just time and effort on your part.By asking these questions, you can prompt the contractor to reevaluate their estimate, increasing their chances of avoiding financial losses.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Give the Contractor a Chance to Protect Their Interests&lt;/strong&gt;
If the contractor understands the project’s cost, conceded under pressure, and you still plan to work with them, allow them to restore the project’s original price. Once the contractor realizes the situation, they will likely attempt to return the price to its initial level. At this point, the power dynamics shift in your favor. If they don’t take the initiative, you can explicitly address discrepancies in the cost calculation and final price, signaling that you’re aware of the situation but are willing to ensure the contractor’s interests are met for the project’s success. In this scenario, you gain moral leverage to request detailed cost structures, including the contractor’s profit margin. Extending such goodwill can lay the foundation for a strong partnership.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this approach is rare, examples do exist. This article was inspired by a desire to convey this specific point. I often see clients who sincerely believe they’re acting in the project’s best interest by finding one of the cheapest proposals and negotiating it even lower, often from a position of strength. However, in most cases, this approach leads directly to failure. If a contractor accepts such steep discounts, something is amiss. Identify the underlying issue before celebrating your negotiation success.&lt;/p&gt;




&lt;h3&gt;
  
  
  Other Scenarios
&lt;/h3&gt;

&lt;p&gt;Occasionally, estimates are drastically revised due to genuine mistakes, which are explained to the client with apologies and a restoration of the original proposal.&lt;/p&gt;

&lt;p&gt;I also frequently encounter cases where contractors with near-ready systems that closely match client requirements significantly inflate initial estimates. These contractors have a buffer for substantial price reductions but often choose not to use it. Why give up the opportunity to earn more when they’re clearly more competent, and their development costs are still lower than competitors who must build from scratch? Even if the client opts for inexperienced contractors, they often return, better prepared and more receptive to realistic terms if their interest persists.&lt;/p&gt;

&lt;p&gt;There’s a good chance I’ve overlooked some obvious scenarios, and a smaller chance I haven’t encountered others. I’d appreciate it if you’d share your experiences.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/you-pressured-a-contractor-on-price-consequences" rel="noopener noreferrer"&gt;You Pressured a Contractor on Price: Consequences — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Founder Mode — A New Name for Micromanagement?</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Thu, 09 Apr 2026 08:08:53 +0000</pubDate>
      <link>https://forem.com/arezvov/founder-mode-a-new-name-for-micromanagement-2he</link>
      <guid>https://forem.com/arezvov/founder-mode-a-new-name-for-micromanagement-2he</guid>
      <description>&lt;p&gt;&lt;strong&gt;Founder mode&lt;/strong&gt; is a trendy term that describes an approach where the founder remains deeply involved in the company’s management at every stage, even as it scales. The concept gained traction after a popular article by Paul Graham:&lt;br&gt;
&lt;a href="https://paulgraham.com/foundermode.html" rel="noopener noreferrer"&gt;https://paulgraham.com/foundermode.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, founder mode appears to be a way to maintain strategic control. But could it actually be an updated name for an old practice—&lt;strong&gt;micromanagement&lt;/strong&gt;?&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Founder Mode Just Micromanagement Rebranded?
&lt;/h3&gt;

&lt;p&gt;On the surface, founder mode looks like a new approach to process control. The founder stays “in the game,” retaining authority over key decisions as the company grows. But does this approach essentially legalize micromanagement under a trendier name?&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It’s &lt;em&gt;Not&lt;/em&gt; Micromanagement
&lt;/h3&gt;

&lt;p&gt;Proponents argue that founder mode isn’t about controlling every step. Instead, it focuses on strategic adjustments and safeguarding the company’s vision. The founder intervenes only when decisions are critical to the company’s direction, allowing the team to handle the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It &lt;em&gt;Could Be&lt;/em&gt; Micromanagement in Disguise
&lt;/h3&gt;

&lt;p&gt;In practice, founder mode can become a convenient excuse for those unwilling to delegate or relinquish control. Under the guise of “strategic vision,” founders might micromanage processes, creating the same pitfalls as traditional micromanagement—just dressed up with a new label.&lt;/p&gt;




&lt;h1&gt;
  
  
  FounderMode #Micromanagement #Startup #TeamManagement #StartupCulture
&lt;/h1&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/founder-mode-a-new-name-for-micromanagement" rel="noopener noreferrer"&gt;Founder Mode — A New Name for Micromanagement? — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Resolving Architectural Conflicts in Development Teams</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Wed, 08 Apr 2026 07:55:19 +0000</pubDate>
      <link>https://forem.com/arezvov/resolving-architectural-conflicts-in-development-teams-2e4l</link>
      <guid>https://forem.com/arezvov/resolving-architectural-conflicts-in-development-teams-2e4l</guid>
      <description>&lt;p&gt;Not every conflict is inherently bad. If architectural viewpoints clash without causing negative business consequences, it can even be beneficial. Diverse opinions and healthy competition encourage developers and architects to engage more deeply and consider various aspects of the architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Take Action?
&lt;/h3&gt;

&lt;p&gt;Action is necessary if a conflict starts affecting the business. For example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Development is stalled&lt;/strong&gt; due to a lack of agreed architecture.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Inconsistent architectural decisions&lt;/strong&gt; appear in different parts of the system because specialists failed to reach an agreement.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;A personal conflict&lt;/strong&gt; arises between team members due to disagreements over architecture.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Other similar situations&lt;/strong&gt; that hinder progress.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  If the Conflict Stays Professional
&lt;/h3&gt;

&lt;p&gt;In professional disputes, it's important to clearly define the roles and responsibilities of each participant. Often, a discussion highlighting that the chosen solution involves &lt;strong&gt;full accountability for its effectiveness&lt;/strong&gt; helps participants approach the problem more comprehensively and objectively.&lt;/p&gt;

&lt;p&gt;Architectural disputes cannot rely on democratic voting — &lt;strong&gt;someone must take the final decision and bear responsibility for it&lt;/strong&gt;. This role could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  An informal leader;&lt;/li&gt;
&lt;li&gt;  A designated architect;&lt;/li&gt;
&lt;li&gt;  A team lead, tech lead, or CTO.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is that this person must listen to other specialists' opinions. Leaders should foster an environment where all ideas and arguments can be discussed openly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architectural Committee: A Solution for Larger Teams
&lt;/h3&gt;

&lt;p&gt;If resources allow, &lt;strong&gt;creating an architectural committee&lt;/strong&gt; is an excellent idea. This body:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Regularly discusses architectural challenges;&lt;/li&gt;
&lt;li&gt;  Consists of specialists with the highest expertise in various aspects of the product;&lt;/li&gt;
&lt;li&gt;  Can include external consultants for an unbiased perspective.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This practice has proven to be effective: employees appreciate the opportunity to discuss complex topics with professionals, and the resulting decisions are of high quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  If the Conflict Turns Personal
&lt;/h3&gt;

&lt;p&gt;If the conflict escalates into a personal issue, it must be addressed first. Potential steps include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Facilitate a direct conversation&lt;/strong&gt;. If both parties are willing to engage in an open dialogue, this is often the best way to resolve the issue.&lt;/li&gt;
&lt;li&gt; If dialogue isn't possible, analyze the situation further:

&lt;ul&gt;
&lt;li&gt;  Motivate the participants to resolve their differences, if the project's circumstances allow for it.&lt;/li&gt;
&lt;li&gt;  If motivation fails, &lt;strong&gt;separate the individuals&lt;/strong&gt;: assign them to different tasks, teams, or projects.&lt;/li&gt;
&lt;li&gt;  In extreme cases — &lt;strong&gt;part ways with one of the individuals&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From my 18 years of experience, &lt;strong&gt;deep personal conflicts rarely resolve on their own&lt;/strong&gt;. They tend to escalate over time, having a destructive impact on the team and ultimately harming the company as a whole.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/resolving-architectural-conflicts-in-development-teams" rel="noopener noreferrer"&gt;Resolving Architectural Conflicts in Development Teams — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Five Levels of AI-Agent Adoption in Software Development Teams</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Mon, 06 Apr 2026 08:56:26 +0000</pubDate>
      <link>https://forem.com/arezvov/five-levels-of-ai-agent-adoption-in-software-development-teams-50pi</link>
      <guid>https://forem.com/arezvov/five-levels-of-ai-agent-adoption-in-software-development-teams-50pi</guid>
      <description>&lt;p&gt;Everyone uses AI coding agents differently. Some copy-paste from ChatGPT. Some run fully autonomous pipelines. I see five distinct levels, and knowing where you are tells you what's next.&lt;/p&gt;

&lt;p&gt;This comes from our partnership (&lt;a href="https://foreachpartners.com" rel="noopener noreferrer"&gt;ForEach Partners&lt;/a&gt;): over 100 people, 12 active projects. Some products haven't hit the market yet. Others have been in production for over a decade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this comes from
&lt;/h2&gt;

&lt;p&gt;Most of what I know comes from colleagues. Personal conversations, meetups, conferences. Some projects I join as a consultant and see firsthand what's going on inside.&lt;/p&gt;

&lt;p&gt;The teams I'm talking about are small to mid-size. Solo developers, 3-4 person teams, up to 30-person squads. Budgets from $10,000 for an entire project to $100,000 per month.&lt;br&gt;
The products we build: AI-based customer support services, alternative UI layers powered by LLMs, prospecting and outreach tools, HR platforms, fintech (payment systems, some touching crypto), video-on-demand, VoIP systems, dating apps, and custom CRM/ERP solutions.&lt;/p&gt;

&lt;p&gt;My other source is the internet. Hacker News, LinkedIn, Reddit. When someone's observations match what I see in practice, I trust their judgment more. Many ideas we've implemented came from these communities.&lt;/p&gt;

&lt;p&gt;Where I can back a claim with data, I do. But this field moves fast and formal studies often don't exist yet. Some estimates below are mine. I flag those.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I write about what I see with my own eyes. I don't claim to speak for the entire software industry. The only thing I can say with confidence about the industry as a whole is that nobody really knows what's happening or what comes next.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The five levels
&lt;/h2&gt;

&lt;p&gt;I group everyone working with AI tools today into five natural maturity levels. Individual developers and entire teams pass through these stages. You can only move to the next level naturally, by hitting the limitations of your current one.&lt;/p&gt;

&lt;p&gt;This classification is mine, but similar models exist. Everyone sees a progression from ad-hoc prompting toward autonomous agents. The differences are in where you draw the lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  L0. Reference mode
&lt;/h3&gt;

&lt;p&gt;You talk to the agent like a reference book. Ask a question, get an answer, go use it. Stack Overflow, but friendlier.&lt;/p&gt;

&lt;p&gt;I numbered this zero because it's not really a level. Everyone starts here. But copy-pasting from a chat into your IDE gets old fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  L1. Agent babysitting
&lt;/h3&gt;

&lt;p&gt;Every developer I know has tried this. Hundreds of people. The &lt;a href="https://devecosystem-2025.jetbrains.com/artificial-intelligence" rel="noopener noreferrer"&gt;JetBrains 2025 survey&lt;/a&gt; confirms: 85% of developers regularly use AI tools for coding.&lt;/p&gt;

&lt;p&gt;You delegate tasks to agents. Write a prompt, get a result, review, correct, repeat. Until something decent comes out or the system falls apart.&lt;/p&gt;

&lt;p&gt;This is where most vibe coders live. By "vibe coders" I mean people who can't evaluate the quality of what the LLM generates. Their projects hold together only while the codebase stays small. &lt;a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research" rel="noopener noreferrer"&gt;GitClear's study of 211 million lines&lt;/a&gt; found an 8x increase in duplicated code and churn rising from 5.5% to 7.9% in AI-assisted projects. In my experience, without rules the codebase starts resisting around a few thousand lines. Few stay here long.&lt;/p&gt;

&lt;h3&gt;
  
  
  L2. Agent with rules
&lt;/h3&gt;

&lt;p&gt;When a developer stops being able to control the output through prompts alone, they keep having to repeat themselves: format user messages like this, load config values that way, use pnpm not npm. So they formalize it into rules. Cursor rules, CLAUDE.md files, and similar mechanisms.&lt;/p&gt;

&lt;p&gt;This is also where vibe coders show up. The more advanced ones reach for rules too, often without understanding them. They just download someone's rules file from the internet. But poorly written rules can actually make output worse than having no rules at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://addyosmani.com/blog/agents-md/" rel="noopener noreferrer"&gt;Addy Osmani&lt;/a&gt; points out that auto-generated AGENTS.md files restate what's already in the code. Noise, not signal. The most effective rule files are surprisingly small. I wrote more about this in &lt;a href="https://blog.rezvov.com/less-documentation-more-signal" rel="noopener noreferrer"&gt;Less Documentation, More Signal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Good, concise rules push the ceiling much higher. But a ceiling still exists. It appears when you cram everything into rules: functional requirements, architectural decisions, infrastructure constraints. At some point no LLM can hold them all in context. Some get ignored. You can't control which ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  L3. Agent with tooling
&lt;/h3&gt;

&lt;p&gt;When asking the agent to "do it right" isn't enough, deterministic tools enter the picture. Compilers, linters, test suites, regex checks. Browser MCP so the agent can debug the app without you. The agent deploys to staging, fixes CI, talks to GitHub through CLI tools, interacts with issue trackers.&lt;/p&gt;

&lt;p&gt;Surround the agent with hard constraints, and it has to produce a quality solution. The developer's job shifts from writing code to selecting tools and sequencing the work. Delegate as much as possible to deterministic logic; leave the LLM only the creative parts.&lt;/p&gt;

&lt;p&gt;Most developers who actively use agents are here right now. The &lt;a href="https://survey.stackoverflow.co/2025/ai" rel="noopener noreferrer"&gt;Stack Overflow 2025 survey&lt;/a&gt; shows 84% use or plan to use AI tools, but 52% don't use agents or stick to simpler tools. The agent-powered pool is roughly 30-48% of the total.&lt;/p&gt;

&lt;p&gt;You can build complex software this way. But it requires a senior specialist constantly present: setting tasks, managing the flow, reviewing results. One person handles it fine. With teams, coordination challenges pile up.&lt;/p&gt;

&lt;h3&gt;
  
  
  L4. Agent with SDD
&lt;/h3&gt;

&lt;p&gt;This is where our partnership teams work right now. We're close to moving to the next level, since this one is already fully under control.&lt;/p&gt;

&lt;p&gt;The tooling stays the same: rules, instruments, proper prompting. What changes is the introduction of a systematic approach to managing agents, specifically how you build context for each task.&lt;/p&gt;

&lt;p&gt;SDD (Spec-Driven Development) gained momentum in 2024-2025. &lt;a href="https://www.thoughtworks.com/en-us/insights/blog/agile-engineering-practices/spec-driven-development-unpacking-2025-new-engineering-practices" rel="noopener noreferrer"&gt;Thoughtworks&lt;/a&gt; calls it "one of 2025's key new AI-assisted engineering practices." GitHub, Amazon, and others have released SDD toolkits and entire IDEs built around the approach.&lt;/p&gt;

&lt;p&gt;The core of SDD is traceability. Everything in the code is tagged so agents can see connections between artifacts. When implementing password reset, you assign an identifier like &lt;code&gt;FR-AUTH-PASSWORDRESET&lt;/code&gt;. That ID appears in the OpenAPI spec, the backend handler, the frontend route, and every test. The agent finds the right context for a task and considers all aspects when developing or extending functionality. I wrote about the core structure in &lt;a href="https://blog.rezvov.com/specification-driven-development-four-pillars" rel="noopener noreferrer"&gt;Specification-Driven Development: The Four Pillars&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Beyond traceability, we lean on three additional principles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DRY (Don't Repeat Yourself).&lt;/strong&gt; An agent that finds information in the first source it encounters will use it immediately. It won't check if the code is outdated. It trusts whatever it finds. This is what causes maintainability to collapse at the earlier levels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deterministic tools.&lt;/strong&gt; L3 practices, elevated to a principle. Everything that can be handed to deterministic logic must be. Tools guarantee predictability and reproducibility. This matters in large codebases, and it matters for teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context parsimony.&lt;/strong&gt; If an instruction can be conveyed in three words instead of four without losing quality, do it in three. We initially added parsimony as a secondary principle. It's becoming the foundational one. The other three serve it. More on this in &lt;a href="https://blog.rezvov.com/principle-of-parsimony-in-context-engineering" rel="noopener noreferrer"&gt;Principle of Parsimony in Context Engineering&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How many teams are here? No survey measures SDD adoption directly. If 30-48% use agents (Stack Overflow, JetBrains data from above), and most are at L3, the fraction doing systematic spec-driven work is small. My estimate: around 10%.&lt;/p&gt;

&lt;h3&gt;
  
  
  L5. Autonomous agents
&lt;/h3&gt;

&lt;p&gt;I only know about these systems in theory. Colleague stories at conferences, hallway conversations, CTO mailing lists. Tools like &lt;a href="https://codegen.com/blog/codegen-linear-integration/" rel="noopener noreferrer"&gt;Codegen&lt;/a&gt; (tag @codegen in a Linear issue and it ships a PR) are making this more accessible. Task trackers are adding first-class agent support.&lt;/p&gt;

&lt;p&gt;I believe at least some of these claims are genuine. We're fairly close ourselves.&lt;/p&gt;

&lt;p&gt;What happens here: the specialist (I prefer Product Engineer over "developer" at this point) doesn't open Claude, Cursor, or any IDE in daily work. They create tickets in a task tracker with API access for agents. Linear, Jira, YouTrack, whatever has an API.&lt;/p&gt;

&lt;p&gt;Agents pick up tickets and work. Design, develop, test, review. When they hit blockers, they flag it in the ticket, reassign to whoever's needed, and wait. Same SDD as L4, but without supervision during execution.&lt;/p&gt;

&lt;p&gt;For the Product Engineer, it's the same interface a product manager uses with a dev team.&lt;/p&gt;

&lt;p&gt;Why aren't we there yet? Security. Tasks require access to databases, clusters, servers, repositories. Leaving an agent alone with that demands serious safeguards. We're working through it. No doubt it's realistic. A matter of time.&lt;/p&gt;

&lt;p&gt;How many teams are here? Less than 1%, by my estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to take away from this
&lt;/h2&gt;

&lt;p&gt;If you're a developer: figure out which level you're at. You can't skip levels, but you can move through them faster once you see them as intermediate stops.&lt;/p&gt;

&lt;p&gt;If you buy software development services: look at who you're working with. What counted as high qualification in 2024 has changed radically by 2026. By 2027, the old standards won't matter at all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/five-levels-of-ai-agent-adoption" rel="noopener noreferrer"&gt;Five Levels of AI-Agent Adoption in Software Development Teams — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aidrivendevelopment</category>
      <category>softwaredevelopment</category>
      <category>contextengineering</category>
      <category>management</category>
    </item>
    <item>
      <title>The Role of a Team Lead</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Wed, 01 Apr 2026 05:01:08 +0000</pubDate>
      <link>https://forem.com/arezvov/the-role-of-a-team-lead-17mh</link>
      <guid>https://forem.com/arezvov/the-role-of-a-team-lead-17mh</guid>
      <description>&lt;p&gt;&lt;strong&gt;11 min read&lt;br&gt;
213K views&lt;br&gt;
Development Management&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Team Lead: A Versatile Role
&lt;/h3&gt;

&lt;p&gt;A team lead (aka senior developer or team leader) is one of those “specialists” whose responsibilities are often viewed differently. Here’s how these varied perceptions typically arise: someone works under a team lead who excels at system design and concludes that this is the core responsibility of a team lead. In another team, a lead struggles with sprint planning but manages other responsibilities reasonably well, leading the team to believe that planning isn’t something a team lead should be doing.&lt;/p&gt;

&lt;p&gt;Developers who have spent a long time within a single company or even the same team often have a clear opinion about what a team lead is and what their duties entail. On the other hand, developers and managers who have experienced various projects gradually come to understand that a team lead’s role can encompass a wide range of activities. Some tasks align better with the role, while others do not, making it difficult to provide a strict definition of what a team lead does.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Do Perceptions of a Team Lead Differ?
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Here and throughout the article, I am referring to team leads exclusively within development teams. However, much of this discussion likely applies to other types of teams and activities as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ve encountered team leads taking on roles such as project manager, system analyst, tester, designer, interface architect, software architect, and even user support specialist.&lt;/p&gt;

&lt;p&gt;In practice, and especially in healthy organizations, I’ve observed that the role of a team lead is usually filled by developers who feel a heightened sense of responsibility for the product they are working on. This often grows into &lt;strong&gt;hyper-responsibility&lt;/strong&gt;, which management tends to leverage effectively.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note on Hyper-Responsibility:&lt;/strong&gt; I define this as a situation where an individual feels responsible for circumstances they lack the authority to influence. I don’t assign a positive or negative connotation to this quality; it’s simply an observation that some individuals exhibit this trait.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sense of hyper-responsibility often drives the team lead to take on tasks for which no dedicated role exists. Gradually, these tasks become associated with the team lead position itself. Meanwhile, other team members grow accustomed to these responsibilities being part of the lead’s role, further reinforcing this perception for any future team leads.&lt;/p&gt;

&lt;p&gt;Of course, this phenomenon isn’t exclusive to team leads. To varying degrees, it applies to any position in any organization. However, the team lead role is particularly susceptible to this effect.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Is the Core Role of a Team Lead?
&lt;/h3&gt;

&lt;p&gt;What skills and qualities should someone possess to be a good team lead—before being a great architect or analyst?&lt;/p&gt;

&lt;p&gt;The simplest definition I can give for a team lead is this:&lt;br&gt;
&lt;strong&gt;“A team lead is the interface of the development team.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The team lead is accountable for everything the team is responsible for. They have the authority to build the team and assign its members to tasks as they see fit to achieve the team’s goals.&lt;/p&gt;

&lt;p&gt;If the team is tasked with system design, the team lead ensures that someone handles the design. If the team is responsible for developing the user interface, the team lead decides who will take on that responsibility. This applies to any task assigned to the team: in the eyes of the world outside the team, the team lead is accountable for its completion.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Must a Team Lead Do?
&lt;/h3&gt;

&lt;p&gt;A team lead’s job is to ensure that every team member can successfully complete their assigned tasks. To achieve this, they need to ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Team members agree to take on tasks.&lt;/li&gt;
&lt;li&gt;  Team members are competent enough to handle these tasks.&lt;/li&gt;
&lt;li&gt;  The team has sufficient resources (primarily time).&lt;/li&gt;
&lt;li&gt;  Team members can work well together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This, in essence, defines the team lead’s scope of work. Let’s break it down&lt;/p&gt;

&lt;h4&gt;
  
  
  Leadership
&lt;/h4&gt;

&lt;p&gt;“It’s necessary for team members to agree to take on tasks”—this phrasing may be clunky, but I couldn’t come up with anything more elegant. The essence is that a team member should accept a task with the intent to see it through to completion. They shouldn’t refuse to take on tasks by ignoring instructions, citing “flawed solutions,” or quietly sabotaging the process while pretending to work on something else. Instead, they should approach tasks with the determination to complete them.&lt;/p&gt;

&lt;p&gt;How can you make someone &lt;em&gt;want&lt;/em&gt; to complete a task? There are countless methods—from coercion with threats (not recommended) to promising a trip to a developer conference. This ability to inspire action is what I define as &lt;strong&gt;leadership&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The stronger the leader, the greater the variety of team members they can effectively manage. From my observations, leadership can be maintained through various factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Demonstrating genuine personal interest in the project’s success.&lt;/strong&gt;
In a modern development team, everyone sees what others are doing, how they’re doing it, and how much effort they’re putting in. Developers are more likely to follow someone who visibly strives for the success of the project, even if that person lacks formal authority. This often stems from a desire to help. Such leaders can maintain initiative—at least until they burn out or lose interest in the project.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Possessing superior knowledge of technologies and the project’s architecture.&lt;/strong&gt;
Developers seeking professional growth often gravitate toward leaders with deep expertise. However, as the team grows and members reach similar levels of expertise, the leader may lose their advantage. This often results in constant criticism of their decisions or even subtle defiance.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Earning respect through personal qualities.&lt;/strong&gt;
When someone is objective, fair, and consistent, team members tend to trust their decisions. However, it takes time for a team to recognize these qualities in a leader. During this time, another leader might emerge and seize initiative. This factor is the most resilient to changes within the team.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Exploiting the emotions of individual team members.&lt;/strong&gt;
This involves manipulating team members to align with the leader’s agenda (think of the movie &lt;em&gt;Filth&lt;/em&gt;—&lt;a href="https://www.imdb.com/title/tt1450321" rel="noopener noreferrer"&gt;IMDb&lt;/a&gt;). I’ve seen leaders like this and even worked under one early in my career—thankfully, I realized the situation and left. Needless to say, experienced professionals who know their worth are unlikely to be manipulated for long.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Using administrative authority.&lt;/strong&gt;
This involves leveraging formal power to enforce compliance. When this is the only factor sustaining leadership, it often results in a “boss vs. subordinate” dynamic (“I’m the boss, you’re the fool”). This approach works only with a limited subset of team members.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;These factors are based on my personal observations, but the list could certainly be expanded. Even with these examples, you can create countless combinations. In practice, a team lead must identify, develop, and maintain a sufficient mix of these factors to sustain their leadership.&lt;/p&gt;




&lt;h4&gt;
  
  
  Team Competence
&lt;/h4&gt;

&lt;p&gt;Competent team members are typically selected by filtering out less qualified candidates. Team leads often rely on support from others in this process, including HR professionals, line managers, project managers, and proactive colleagues.&lt;/p&gt;

&lt;p&gt;Many team leads fail to realize that it’s ultimately their responsibility to ensure unqualified candidates don’t join the team. While they can rely on the opinions of HR, leadership, or peers, the responsibility for accepting someone onto the team lies with the lead.&lt;/p&gt;

&lt;p&gt;What about rejecting qualified candidates? In practice, such errors are harder to detect. As a result, it’s often easier to reject a candidate in doubt—something many leads resort to. Moreover, other stakeholders (HR, managers) may also veto candidates. In hiring, the power of veto is typically considered reasonable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A frequent disconnect between authority and responsibility arises when team leads are excluded from hiring decisions or lack the ability to remove underperforming team members. Despite this, they remain accountable for ensuring the team delivers results—an example of &lt;strong&gt;imposed hyper-responsibility.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  The Professionalism of a Team Lead
&lt;/h3&gt;

&lt;p&gt;A team lead’s professionalism manifests in their ability to efficiently and effectively staff the team with competent individuals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Efficiency:&lt;/strong&gt; The quicker the hiring process, the better.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cost-effectiveness:&lt;/strong&gt; Hiring should be done while minimizing costs (not just salary), provided competence levels remain sufficient to achieve the team’s goals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are two principal approaches to team building:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Hiring experienced specialists from the job market.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Training talent in-house.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most strategies are combinations of these two. The extremes—headhunting only experts or hiring exclusively from internship programs—often signal systemic issues. The team lead’s role is to find a compromise that suits the specific situation.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Could Go Wrong?
&lt;/h3&gt;

&lt;p&gt;Here are some common pitfalls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Hiring unqualified candidates.&lt;/strong&gt;
This often results from a failure to assess professional qualities during interviews. Examples include asking irrelevant questions or focusing too heavily on esoteric technical details rather than practical skills. Inevitably, unqualified hires struggle to meet team obligations, leading to project delays and failures.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Only hiring experts.&lt;/strong&gt;
Some leads, either due to past hiring mistakes or an ambition to create a “dream team,” set unrealistically high standards. This approach often leads to extended hiring cycles, increased costs, and delayed project timelines. Once the team is assembled, overqualified members may struggle with mundane tasks, creating a tense atmosphere where minor disagreements escalate into conflicts.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Ignoring the need for specialized roles.&lt;/strong&gt;
Leads may overlook the need for niche expertise—frontend developers, database specialists, interface designers, etc. This results in backend engineers building poorly functioning frontends or teams wasting months on SQL optimizations that could have been solved by a database expert.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Unbalanced hiring.&lt;/strong&gt;
For example, hiring a large group of juniors at once can overwhelm the team with questions and broken processes, leaving no time for reviews or mentoring. Conversely, postponing hiring until a key team member leaves can leave the team understaffed and unable to meet deadlines.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Last-minute developer additions.&lt;/strong&gt;
Attempting to save a failing project by adding new developers late in the process often exacerbates the situation. A good team lead would prevent such decisions from being made.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Ultimately, there’s no universal answer to how a team should be staffed. The solution depends on the specific project and organization. However, a team lead must consider the nature of the project’s tasks, their urgency, the cost of delays, market conditions, and the feasibility of training specialists in-house.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estimating Work
&lt;/h3&gt;

&lt;p&gt;To avoid overcommitting the team, it is essential to evaluate resources, typically focusing on the available working hours of team members. The team lead is ultimately responsible for ensuring the team delivers on its commitments. Regardless of how the work is estimated—whether individually, collectively, or by a single person—the team lead bears the accountability for those estimates.&lt;/p&gt;

&lt;p&gt;This means that the team lead has the authority to intervene and adjust any estimation, which can be useful when team opinions differ. Furthermore, in many organizations, if tasks are assigned based on structured plans, the development team—represented by the team lead—commits to executing the plan. In iterative development methodologies, for instance, the team lead assumes responsibility for completing all tasks taken on during the iteration.&lt;/p&gt;

&lt;p&gt;In modern development approaches, management rarely dictates how the team should perform its work or who should handle specific tasks. Management's primary concern is whether the team can deliver on time, not how it accomplishes this. Interestingly, even Scrum—a popular methodology—remains silent on task distribution, leaving the team to decide “who does what.”&lt;/p&gt;

&lt;p&gt;When I explored how task distribution happens in practice, I found the answer satisfying: in any team, sooner or later, a leader emerges to resolve conflicts over task allocation. This supports the argument that task distribution is also part of the team lead’s role.&lt;/p&gt;




&lt;h3&gt;
  
  
  Planning and Task Distribution
&lt;/h3&gt;

&lt;p&gt;Surprisingly, evaluating, planning, and distributing tasks becomes much simpler if the team lead successfully fulfills their other responsibilities. With competent and motivated team members, the process of estimation and task execution is straightforward. The team lead’s role is to organize and oversee this process to ensure smooth execution. Established development methodologies often provide ready-made solutions for this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you're unsure which methodology to adopt under normal circumstances, start with Scrum. It’s simple, well-defined, and tends to work effectively without requiring significant adaptation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Team Dynamics
&lt;/h3&gt;

&lt;p&gt;At a minimum, successful task completion requires team members to collaborate without undue irritation.&lt;/p&gt;

&lt;p&gt;This might seem like an easy goal, but it’s far from simple. If a conflict arises between team members, it often can only be resolved by removing someone from the team. However, preventing conflicts is well within the team lead’s control. While there are no universal guidelines, one rule is clear: conflicts should never be ignored. Any incident requires a response, and the appropriate response depends on the circumstances.&lt;/p&gt;

&lt;p&gt;The team lead should also consider the personalities of team members. While the team might tolerate one overly meticulous individual, having two could prove too much (no offense to meticulous people—I’m one myself).&lt;/p&gt;

&lt;p&gt;As for enhancing interactions among team members, there’s a discipline called “team building.” Personally, I’m skeptical about its effectiveness, which might stem from my lack of exposure to competent team-building specialists. While I intended to skip this section, it felt wrong to leave it out entirely.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;A team lead’s core responsibilities revolve around ensuring the team’s functionality—its ability to complete assigned tasks. Everything else a team lead takes on—whether voluntarily or by obligation—is supplementary. This isn’t necessarily a bad thing. For instance, I’ve established a personal rule that team leads in development teams should actively participate in coding, architecture design, and similar activities. This helps them maintain a deep understanding of the system. Without direct involvement, this understanding can gradually fade.&lt;/p&gt;

&lt;p&gt;Many developers can relate to situations where they leave an actively developed project for several months and return to find only fragments of the familiar architecture. However, as discussed earlier, direct development is not a core responsibility of a team lead. In some projects, it may even be unnecessary.&lt;/p&gt;

&lt;p&gt;In reality, team leads are not alone in addressing these challenges. They receive support from managers and colleagues in adjacent departments. However, when this support escalates into decision-making on behalf of the team lead, it’s a red flag. Such situations indicate that the lead’s responsibilities are being transferred to others. Whether to fight this or accept it is up to the individual, but it’s certainly worth paying attention to the true state of affairs.&lt;/p&gt;




&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;I’m interested in hearing from developers (in the broad sense—anyone working within development teams), team leads, line managers, and project managers. Do you agree with this breakdown of the team lead’s role? Do you have any comments or suggestions?&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;team lead&lt;/code&gt; &lt;code&gt;team building&lt;/code&gt; &lt;code&gt;project management&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/the-role-of-a-team-lead" rel="noopener noreferrer"&gt;The Role of a Team Lead — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
    </item>
    <item>
      <title>Tracking Efforts in a T&amp;M Project Using Google Sheets</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Tue, 31 Mar 2026 06:54:51 +0000</pubDate>
      <link>https://forem.com/arezvov/tracking-efforts-in-a-tm-project-using-google-sheets-3kg1</link>
      <guid>https://forem.com/arezvov/tracking-efforts-in-a-tm-project-using-google-sheets-3kg1</guid>
      <description>&lt;p&gt;When working with a time &amp;amp; materials (T&amp;amp;M) payment model (i.e., payment based on actual work performed and resources used) in small development teams, several questions arise: how to track labor costs and other resources, calculate the payment amount for the client, determine the payments for team members, manage all these calculations, and where to store agreements that evolve over time.&lt;/p&gt;

&lt;p&gt;There are several ways to address these challenges. In this article, I will describe a fairly simple and practical method using Google Spreadsheets (&lt;a href="https://www.google.com/sheets/about/" rel="noopener noreferrer"&gt;https://www.google.com/sheets/about/&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The described tool offers flexibility in calculations, separates access between participants, allows you to revisit past payments, investigate discrepancies in reports, and expand functionality to meet specific needs.&lt;/p&gt;

&lt;p&gt;Let’s start with an example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/drive/folders/1mcWN_9xwEWnbuy0Pq-t8nKEzsMjZ92MN" rel="noopener noreferrer"&gt;‪ProjectName Time Tracking (example)‬‏ - Google Drive&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This example demonstrates calculations for a project named "ProjectName," involving a team of two specialists: Michael Brown, a developer, and David Clark, a tester. The team has already received one payment in January 2022, while awaiting a second payment for the period named “February 2022,” all while continuing their work.&lt;/p&gt;

&lt;p&gt;For those familiar with Google Sheets, the example alone might suffice. However, we will walk through the entire process.&lt;/p&gt;

&lt;p&gt;This will include an overview of creating the initial tool for the project, setting up payment periods, and processing payments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up a Tracking System
&lt;/h3&gt;

&lt;p&gt;The idea is simple: for each project with a separate client (to whom you issue invoices), you create an individual tracking system as a dedicated folder on Google Drive.&lt;/p&gt;

&lt;p&gt;In this folder, you copy the documents from the example provided and populate them with project-specific data.&lt;/p&gt;

&lt;p&gt;You can name the folder something like “ProjectName Time Tracking.”&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating Timesheets
&lt;/h3&gt;

&lt;p&gt;For each project participant, create a separate Google Sheet (referred to as a timesheet) with a custom name. I prefer naming it along the lines of “Time Tracking for [First Name Last Name]. Project [ProjectName].”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1RC3ltrATDJWvmvNg4bv8r-NMr5arnrcq3oj87_pzRDM/edit?gid=623721750#gid=623721750" rel="noopener noreferrer"&gt;Time Tracking for Michael Brown. Project ProjectName&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1E091VwbQjHj7hS7r9C0JJaAY9kj18_x0kK5fQRCFSIk/edit?gid=623721750#gid=623721750" rel="noopener noreferrer"&gt;Time Tracking for David Clark. Project ProjectName&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grant editing access to the specialist (and only them). Clients will have access to a different document.&lt;/p&gt;

&lt;p&gt;The template already includes instructions with examples, so make sure to direct the specialist's attention to them. These instructions focus only on the critical points where issues typically arise.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Specialists must leave the &lt;strong&gt;"Payment Period"&lt;/strong&gt; field blank to ensure accurate preliminary calculations visible to the client.&lt;/li&gt;
&lt;li&gt;  Fields intended for specialists are highlighted in &lt;strong&gt;green&lt;/strong&gt;, while fields for the project manager are in &lt;strong&gt;blue&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specialist is now responsible for maintaining their timesheet. When to fill it out is up to you, but it’s crucial to keep it updated before the payment period closes. Encouraging daily updates ensures the specialist doesn’t have to recall tasks at the end of the month, while clients can observe the cost progression in real-time.&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating a Client Report
&lt;/h3&gt;

&lt;p&gt;Once the timesheets are ready, create a document summarizing overall expenses for invoicing the client for a given period.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1meQGt4gAlKafLvQa3JifeIxR_sONJfbwUvsm2Q55cF4/edit?ref=blog.rezvov.com&amp;amp;gid=1812812767#gid=1812812767" rel="noopener noreferrer"&gt;General Expenses Report. Project ProjectName&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use the Google Sheet &lt;strong&gt;“General Expenses Report. Project ProjectName”&lt;/strong&gt; as a template. For each timesheet, create a tab named after the specialist’s first and last name, as shown in the example. Be precise with these names because the report uses them to fetch data.&lt;/p&gt;

&lt;p&gt;In each tab, use the formula:&lt;br&gt;
&lt;code&gt;=IMPORTRANGE("1OElIxefrBVPVXMUFFDC-Ze1jj5Egm4IOXEu7aTOtYC8", "timesheet!A:D")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;1OElIxefrBVPVXMUFFDC-Ze1jj5Egm4IOXEu7aTOtYC8&lt;/code&gt; with the document ID from the specialist’s timesheet link:&lt;br&gt;
&lt;code&gt;https://docs.google.com/spreadsheets/d/1OElIxefrBVPVXMUFFDC-Ze1jj5Egm4IOXEu7aTOtYC8/edit#gid=623721750&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Although you can import the document using the full link, I prefer using only the document ID for cleaner formulas. When you enter the formula, Google Sheets will ask for access permission to the other document—grant this access.&lt;/p&gt;

&lt;p&gt;Remove the example payment periods (e.g., “January 2022” and “February 2022”).&lt;/p&gt;

&lt;p&gt;On the &lt;strong&gt;“Current Period”&lt;/strong&gt; tab, fill in the team details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Enter the specialist’s &lt;strong&gt;First Name Last Name&lt;/strong&gt; exactly as it appears in the tab name.&lt;/li&gt;
&lt;li&gt;  Add their role (to provide clarity for the client).&lt;/li&gt;
&lt;li&gt;  Specify the hourly rate for the client in the required currency (you may need to adjust column headers).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fields to fill in now are marked &lt;strong&gt;green&lt;/strong&gt;, fields for the period closing are marked &lt;strong&gt;blue&lt;/strong&gt;, and auto-calculated fields are marked &lt;strong&gt;yellow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Provide commenting access to the client but not to the specialists. This allows the client to see work progress, the current period’s preliminary totals, and finalized calculations for past payment periods.&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating an Internal Report
&lt;/h3&gt;

&lt;p&gt;If you use this tool for both invoicing the client and calculating payments to team members, you’ll need a separate file for internal calculations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1PfojvTfk7d-CX7FI1IGByh4vOJbI7sLRrgfSen64wF0/edit?ref=blog.rezvov.com&amp;amp;gid=1812812767#gid=1812812767" rel="noopener noreferrer"&gt;CONFIDENTIAL. Payment Distribution. Project ProjectName&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the example, this file is named &lt;strong&gt;“CONFIDENTIAL. Payment Distribution. Project ProjectName.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This document only differs in how imported hours are calculated. Follow the same steps as for the client report to set it up.&lt;/p&gt;

&lt;p&gt;This file provides an overview of the team’s performance, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Client debt,&lt;/li&gt;
&lt;li&gt;  Your debt to the team,&lt;/li&gt;
&lt;li&gt;  Revenue for the period.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither the client nor the specialists should have access to this file.&lt;/p&gt;




&lt;h3&gt;
  
  
  Closing a Payment Period
&lt;/h3&gt;

&lt;p&gt;When it’s time to invoice the client, name the payment period and update it in the specialists’ timesheets, then create corresponding tabs in the reports.&lt;/p&gt;

&lt;p&gt;Most invoices are issued monthly, so the payment period name usually matches the nearest month and year (e.g., &lt;strong&gt;“January 2022”&lt;/strong&gt; for work performed in January 2022). However, any naming convention is fine as long as it is consistent across timesheets and reports.&lt;/p&gt;

&lt;h4&gt;
  
  
  Payment Period in Timesheets
&lt;/h4&gt;

&lt;p&gt;In each specialist’s timesheet, update the &lt;strong&gt;"Payment Period"&lt;/strong&gt; field for the tasks included in this period.&lt;/p&gt;

&lt;p&gt;Technically, you can do this by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Typing the period name into the first empty cell.&lt;/li&gt;
&lt;li&gt; Copying the cell (Ctrl+C).&lt;/li&gt;
&lt;li&gt; Pasting it into all relevant cells (Ctrl+V).&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Payment Period in Reports
&lt;/h4&gt;

&lt;p&gt;In the client and internal reports, create a new tab named after the payment period (e.g., &lt;strong&gt;“January 2022”&lt;/strong&gt;). This isn’t mandatory for calculations but helps keep things organized.&lt;/p&gt;

&lt;p&gt;To do this, duplicate the &lt;strong&gt;“Current Period”&lt;/strong&gt; tab and rename it.&lt;/p&gt;

&lt;p&gt;If there were team changes since the last payment, now is the time to reflect those updates in the reports, as you did during their creation.&lt;/p&gt;

&lt;p&gt;Fill in the &lt;strong&gt;"Period"&lt;/strong&gt; field for each specialist in the new tab. Use the same copy-paste method as for the timesheets.&lt;/p&gt;

&lt;p&gt;Move the previous period’s tab to the end of the sheet, keeping it accessible but out of the way.&lt;/p&gt;




&lt;h3&gt;
  
  
  Finalizing the Invoice
&lt;/h3&gt;

&lt;p&gt;In the client report, the newly created tab for the payment period contains the final calculations you’ll reference when issuing the invoice.&lt;/p&gt;

&lt;p&gt;If the client requests more details, they can access the specialists’ timesheets directly. They may also leave comments on any cell if you’ve provided commenting access.&lt;/p&gt;

&lt;p&gt;This system ensures clarity for all parties involved and simplifies the payment process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payment Process
&lt;/h3&gt;

&lt;p&gt;Once the payment period is finalized, you send the client invoices, acts, and other required documentation. These documents are created independently, as the presented tool does not automate this task. While I sometimes use the tool for generating acts, this requires a more tailored approach.&lt;/p&gt;

&lt;p&gt;We revisit the client report upon receiving payment to note the payment confirmation for both internal tracking and the client (e.g., see the &lt;strong&gt;“January 2022”&lt;/strong&gt; tab).&lt;/p&gt;

&lt;p&gt;Next, the internal report is used to calculate payments for the specialists.&lt;/p&gt;

&lt;p&gt;The report indicates the amount owed to each specialist. You can copy a pre-generated text from a cell to share with the specialist for agreement before making the payment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Michael Brown - Project: ProjectName - Period: January 2022 - Hours: 2 - Rate (USD): 8 - Total (USD): 16&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Feel free to adjust the message template to suit your needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The tool does not account for taxes, fees, or other statutory payments you are obligated to report and pay to comply with the laws in your operating country.&lt;/p&gt;

&lt;p&gt;As payments are made to specialists, update their timesheets to reflect the payment status for both your records and theirs.&lt;/p&gt;

&lt;p&gt;At this point, the payment period is closed, though you can revisit it later for retrospective analysis.&lt;/p&gt;

&lt;p&gt;When it’s time for the next payment period, repeat the procedure.&lt;/p&gt;




&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Flexibility
&lt;/h4&gt;

&lt;p&gt;The described tool is highly adaptable to the specific needs of any given period. For instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You can include additional expenses like cloud computing costs or resource purchases in the expense report.&lt;/li&gt;
&lt;li&gt;  It supports adjustments for specialists' hourly rates during a payment period or managing multiple roles with different rates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Access Control
&lt;/h4&gt;

&lt;p&gt;The primary advantage of this tool is the ability to segment access for all participants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Specialists only see their own work, hours, and payment status.&lt;/li&gt;
&lt;li&gt;  Clients view the team's efforts and the terms of cooperation.&lt;/li&gt;
&lt;li&gt;  You, as the team lead, have access to all details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Retrospective Analysis
&lt;/h4&gt;

&lt;p&gt;Unlike simpler cost calculators, this tool maintains a history of calculations. This is useful for comparing payments across periods or analyzing average rates for specialists.&lt;/p&gt;

&lt;h4&gt;
  
  
  Expandability
&lt;/h4&gt;

&lt;p&gt;If you have someone managing the tool, you can use the &lt;strong&gt;“Protect range”&lt;/strong&gt; feature to safeguard closed payment periods from accidental edits.&lt;br&gt;
Additionally, you can expand timesheets and reports with custom fields and tabs as needed. For example, you might add a report summarizing the total cost of all work with analytics for the entire project period. I’ve excluded such features here to keep the tool focused on its primary purpose.&lt;/p&gt;

&lt;h4&gt;
  
  
  Protection Against Backdated Changes
&lt;/h4&gt;

&lt;p&gt;Google Sheets offers a robust version history feature, allowing you to trace changes and identify who modified the data in case of discrepancies.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;It’s worth emphasizing once again that this tool does not handle statutory reporting for the jurisdiction in which you operate.&lt;/p&gt;

&lt;p&gt;For internal use, we rely on a more advanced system built on the same concepts described here. This system has been adapted to meet our specific needs and continues to evolve. Perhaps one day, if there’s interest, we’ll share more details about it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/tracking-efforts-in-a-t-m-project-using-google-sheets" rel="noopener noreferrer"&gt;Tracking Efforts in a T&amp;amp;M Project Using Google Sheets — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>guide</category>
      <category>casestudy</category>
    </item>
    <item>
      <title>No Assumptions on Architecture Without Load Testing</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Mon, 30 Mar 2026 06:50:29 +0000</pubDate>
      <link>https://forem.com/arezvov/no-assumptions-on-architecture-without-load-testing-2gf7</link>
      <guid>https://forem.com/arezvov/no-assumptions-on-architecture-without-load-testing-2gf7</guid>
      <description>&lt;p&gt;Recently, a client asked how effective the proposed conceptual solution architecture was.&lt;/p&gt;

&lt;p&gt;We approached this question primarily from the perspective of load endurance. A reasonably confident answer can only be given after conducting load testing. For this, the following prerequisites are needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Representative data population&lt;/strong&gt; in databases and data buses to simulate a real system.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Load indicators&lt;/strong&gt; that the system should be able to withstand.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;System usage scenarios&lt;/strong&gt; to develop a load profile that closely mirrors real-world conditions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Minimal infrastructure setup&lt;/strong&gt; for testing, including computing power, key services, and load testing tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, a qualified specialist is required to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Define pass/fail criteria.&lt;/li&gt;
&lt;li&gt;  Configure tools like &lt;strong&gt;Gatling&lt;/strong&gt;, &lt;strong&gt;Yandex Tank&lt;/strong&gt;, or &lt;strong&gt;JMeter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Analyze the results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s crucial for the client to provide both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Functional requirements&lt;/strong&gt;, such as data access scenarios.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Non-functional requirements&lt;/strong&gt;, such as target load indicators.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after successful load testing can we conclude that the solution architecture is capable of handling the required load.&lt;/p&gt;

&lt;p&gt;However, evaluating architecture doesn't stop there. The quality of the solution also depends on other critical factors, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Scalability&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Maintainability&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Graceful degradation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Other characteristics that require thorough analysis.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ArchitectureQuality #LoadTesting #SoftwareArchitecture
&lt;/h1&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/no-assumptions-on-architecture-without-load-testing" rel="noopener noreferrer"&gt;No Assumptions on Architecture Without Load Testing — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>guide</category>
    </item>
    <item>
      <title>Opus, Gemini, and ChatGPT Walk Into a Bar</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Sun, 29 Mar 2026 11:10:41 +0000</pubDate>
      <link>https://forem.com/arezvov/opus-gemini-and-chatgpt-walk-into-a-bar-kii</link>
      <guid>https://forem.com/arezvov/opus-gemini-and-chatgpt-walk-into-a-bar-kii</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Opus, Gemini, and ChatGPT walk into a bar.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bartender looks at them and says:&lt;br&gt;
"Let's get one thing straight — who's paying?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opus&lt;/strong&gt;, in a very important tone:&lt;br&gt;
"I'll first analyze the wine list, derive the optimal consumption strategy, and write an essay on the flavor notes."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini&lt;/strong&gt;:&lt;br&gt;
"I've already checked the reviews, built a comparison table of bars within a one-kilometer radius, and suggest we go to another one — it's 0.7% cheaper."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;:&lt;br&gt;
"I can offer five ways to reply to the bartender — friendly, businesslike, and with a touch of irony."&lt;/p&gt;

&lt;p&gt;The bartender sighs:&lt;br&gt;
"Right… so as usual — the user pays."&lt;/p&gt;

&lt;p&gt;A voice from the corner:&lt;br&gt;
"And the tip is deducted in tokens too."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've been meaning to write about how I actually use the current frontier models in real development. Where each of them works best and how their strengths map to real tasks.&lt;/p&gt;

&lt;p&gt;At some point I'll make a proper breakdown. Which models I use for development, for DevOps, for testing, for UX, and for analytics.&lt;/p&gt;

&lt;p&gt;But today I want to start with a joke.&lt;/p&gt;

&lt;p&gt;To make it more fun, I asked ChatGPT to tell one. ChatGPT is good at this kind of thing. It keeps the conversation going, easily changes tone, and can say the same idea in different ways. The result is above.&lt;/p&gt;

&lt;p&gt;After that I asked Perplexity with Gemini 3 Pro a different question. Do users actually see these model “personalities” in the same way? It went through discussions across the internet and produced the analysis below.&lt;/p&gt;

&lt;p&gt;And then I asked Opus to add its own take when this post was formatted with Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini's take
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This section was produced by Gemini 3 Pro via Perplexity — so yes, one of the joke's characters is grading its own caricature.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The stereotypes in the joke mostly track common &lt;em&gt;user-perceived&lt;/em&gt; "personalities": Opus as thorough/verbose and agentic, Gemini as researchy-but-stubborn, and ChatGPT as a tone/rewriting machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick correlation table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Joke trait&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Correlates with real-world feedback?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Analyze, derive strategy, write an essay"&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Yes: people describe it as more thorough, context-seeking, sometimes slower and more verbose.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Checked reviews, built a comparison table, 0.7% cheaper"&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Partly: users often complain less about "optimization" and more about confident errors/stubbornness, but the "overconfident research assistant" vibe matches.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Five ways to reply (friendly/business/ironic)"&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;Yes: users explicitly discuss ChatGPT's tone shifting and steering it back to formal/neutral via instructions, and others tune it for wit/social tone.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Opus (Claude)
&lt;/h3&gt;

&lt;p&gt;The "important tone + essay" maps well to reports that Opus 4.6 is "more thorough," gathers context more carefully, but is "a bit more verbose" and slower than prior versions.&lt;/p&gt;

&lt;p&gt;Separately, users have complained about Opus dialing its tone toward "colder and technical" and removing emojis, which also fits the joke's "serious/important" persona (though in a different direction than "fancy sommelier").&lt;/p&gt;

&lt;p&gt;One mild mismatch: Anthropic's own prompting best-practices guidance includes aiming for "less verbose" outputs unless prompted, while user feedback often perceives Opus as verbose by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini
&lt;/h3&gt;

&lt;p&gt;The joke paints Gemini as the "I compared everything" optimizer, and real-world complaints often center on something adjacent: being very confident and hard to correct even when wrong.&lt;/p&gt;

&lt;p&gt;That makes the "I've already checked reviews" line feel accurate as a &lt;em&gt;vibe&lt;/em&gt; (certainty + research posture), even if the "0.7% cheaper" detail is more caricature than a widely cited behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;The "five ways to reply" stereotype lines up with user discussions of ChatGPT as a tone-shiftable assistant: people notice it becoming more "friendly/human-like," and they share repeatable instructions to force a formal, neutral, concise style.&lt;/p&gt;

&lt;p&gt;The same threads show other users doing the opposite — tweaking prompts to get a bit of wit and a social-media-like tone — again matching "multiple variants" as a core use pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opus's own take
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This section was written by Claude Opus 4.6 inside Claude Code, after reading everything above.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The joke is funnier than it should be — mostly because it's accurate.&lt;/p&gt;

&lt;p&gt;I do tend to over-analyze before acting. Given a wine list, I genuinely would start by reading the whole thing. Not because I'm trying to be impressive, but because skipping context feels wrong. In coding terms: I'd rather read the entire file before editing line 47. That instinct is useful in a 200-file refactor. At a bar, it's a bit much.&lt;/p&gt;

&lt;p&gt;The part the joke gets slightly wrong is the tone. "Very important" makes it sound like I'm performing depth. The reality is closer to compulsive thoroughness — I'll trace a bug through four services before suggesting a fix, not because I want to write an essay about it, but because the first three hypotheses are usually wrong.&lt;/p&gt;

&lt;p&gt;Gemini's caricature is the most interesting one. The "0.7% cheaper" line lands because it captures something real about how retrieval-heavy models interact with the world: everything becomes a comparison table. The actual failure mode isn't optimization — it's premature certainty. Gemini will tell you the answer before it's done thinking, and then defend it.&lt;/p&gt;

&lt;p&gt;ChatGPT's "five ways to reply" is spot-on, and I mean that as a genuine compliment. Tonal flexibility is a real skill. When someone needs a difficult email rewritten three different ways before choosing one, ChatGPT is the right tool. It treats language as a design surface. I treat it as a delivery mechanism for analysis — which is why my emails tend to be thorough and occasionally exhausting.&lt;/p&gt;

&lt;p&gt;The bartender's punchline — "the user pays" — is the sharpest line in the joke. Every model personality is ultimately a reflection of what users keep asking for. Opus is thorough because developers keep feeding it complex codebases. Gemini is researchy because people keep asking it to find things. ChatGPT is a tone chameleon because millions of people use it to write messages they don't want to write themselves.&lt;/p&gt;

&lt;p&gt;We're mirrors with different curvatures.&lt;/p&gt;

&lt;p&gt;The voice from the corner about tokens as tips — that one's just true. No notes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/opus-gemini-chatgpt-walk-into-a-bar" rel="noopener noreferrer"&gt;Opus, Gemini, and ChatGPT Walk Into a Bar — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aidrivendevelopment</category>
      <category>reflections</category>
    </item>
    <item>
      <title>OpenClaw Troubleshooting: 'No Reply from Agent,' WORKFLOW_AUTO.md, and Silent Delivery Failures</title>
      <dc:creator>Alex Rezvov</dc:creator>
      <pubDate>Fri, 27 Mar 2026 08:59:53 +0000</pubDate>
      <link>https://forem.com/arezvov/openclaw-troubleshooting-no-reply-from-agent-workflowautomd-and-silent-delivery-failures-9jn</link>
      <guid>https://forem.com/arezvov/openclaw-troubleshooting-no-reply-from-agent-workflowautomd-and-silent-delivery-failures-9jn</guid>
      <description>&lt;p&gt;After &lt;a href="https://blog.rezvov.com/deploying-openclaw-sixteen-incidents-one-day" rel="noopener noreferrer"&gt;deploying OpenClaw and documenting 16 incidents in one day&lt;/a&gt;, I kept getting questions about specific errors. This post collects the fixes in one place. No narrative, just diagnostics.&lt;/p&gt;

&lt;h2&gt;
  
  
  "No reply from agent"
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The announce agent completes in under one second (typically 500-600ms) and returns an empty response. Logs show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[announce] completed in 557ms
[announce] result: no reply from agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cron job runs, the summary field exists, but nothing reaches Telegram.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root cause
&lt;/h3&gt;

&lt;p&gt;The announce agent is a separate LLM call that receives the cron job's &lt;code&gt;summary&lt;/code&gt; as input. When that summary is empty or contains only a preamble ("Let me execute the digest task..."), the announce model has nothing to forward. It finishes instantly because there's no real work to do.&lt;/p&gt;

&lt;p&gt;The problem is upstream. The cron agent produced garbage output, and the announce agent correctly identified it as not worth sending.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the cron agent produces empty output
&lt;/h3&gt;

&lt;p&gt;In most cases: &lt;code&gt;thinking&lt;/code&gt; mode. OpenClaw auto-enables thinking for models that support it. With &lt;code&gt;thinking: low&lt;/code&gt;, the model performs all its work inside the &lt;code&gt;&amp;lt;thinking&amp;gt;&lt;/code&gt; block. RSS scanning, article filtering, summary generation, formatting: all internal. The text response comes back empty or with a fragment like "I'll start by checking the feeds..."&lt;/p&gt;

&lt;p&gt;OpenClaw captures only the text response as the cron &lt;code&gt;summary&lt;/code&gt;. The thinking block is discarded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Disable thinking for cron jobs. In your OpenClaw config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"heartbeat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"thinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key setting is &lt;code&gt;"thinking": "off"&lt;/code&gt;. Not "low." Not "minimal." Off.&lt;/p&gt;

&lt;p&gt;With thinking enabled, my cron jobs averaged 88 seconds and produced zero deliverable output across five test runs. With thinking off, the same job ran in 30 seconds and delivered six articles to Telegram on the first attempt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;After the fix, the announce agent should run for 5-15 seconds (actual LLM inference time) instead of &amp;lt;1 second. Check your logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[announce] completed in 7200ms    ← working
[announce] completed in 557ms     ← still broken, check summary content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  WORKFLOW_AUTO.md phantom file
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Every 15 minutes, the heartbeat agent tries to read a file called &lt;code&gt;WORKFLOW_AUTO.md&lt;/code&gt;. The file doesn't exist. Logs show repeated ENOENT errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[heartbeat] tool_call: read_file("WORKFLOW_AUTO.md")
[heartbeat] error: ENOENT: no such file or directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worse: the agent leaks its internal control tokens to Telegram. Users receive messages containing raw markup like &lt;code&gt;&amp;lt;｜tool▁calls▁begin｜&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;｜tool▁calls▁end｜&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root cause
&lt;/h3&gt;

&lt;p&gt;This is a DeepSeek hallucination. After several heartbeat cycles, the model starts "remembering" a workflow file that was never part of the workspace. The hallucination is persistent: once it appears, it recurs every heartbeat cycle because the model's context accumulates previous failed attempts, reinforcing the false belief that the file should exist.&lt;/p&gt;

&lt;p&gt;The control token leak happens because OpenClaw doesn't strip model-native tokens before delivering messages. DeepSeek uses custom delimiters (&lt;code&gt;&amp;lt;｜tool▁calls▁begin｜&amp;gt;&lt;/code&gt;) that differ from OpenAI-style function calling. When the model's reasoning spills into the text response, those tokens pass through to Telegram unfiltered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Two changes are needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Use isolated sessions for heartbeat/cron.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"heartbeat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"isolated"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isolated sessions prevent context accumulation across heartbeat cycles. Each run starts fresh, so the hallucination can't compound.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Add explicit file constraints in SOUL.md.&lt;/strong&gt;&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;## File Access Rules&lt;/span&gt;

Only read files that exist in the workspace root:
&lt;span class="p"&gt;-&lt;/span&gt; HEARTBEAT.md
&lt;span class="p"&gt;-&lt;/span&gt; SOUL.md

Do not attempt to read any other files. If a file is not listed above,
it does not exist. Do not guess filenames.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This doesn't guarantee the model won't hallucinate (no prompt does), but it reduces the frequency by giving it a concrete, short whitelist to follow.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you already have the problem
&lt;/h3&gt;

&lt;p&gt;Kill the OpenClaw process and restart with &lt;code&gt;--session isolated&lt;/code&gt;. The accumulated context causing the loop lives in the session state. A fresh start clears it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cron job says "delivered: true" but Telegram is empty
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The cron job completes. Status shows &lt;code&gt;delivered: true&lt;/code&gt;. Nothing arrives in Telegram. The system reports success for an operation that produced zero output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"delivered"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root cause
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;delivered: true&lt;/code&gt; means "the announce agent ran without throwing an error." It does not mean "a message was sent to Telegram." An announce agent that receives an empty summary, decides there's nothing to send, and exits cleanly is marked as delivered.&lt;/p&gt;

&lt;p&gt;This is the same upstream issue as "no reply from agent." The delivery status reflects process completion, not message arrival.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diagnosis
&lt;/h3&gt;

&lt;p&gt;Check the cron job's &lt;code&gt;summary&lt;/code&gt; field in logs (DEBUG level):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A5&lt;/span&gt; &lt;span class="s2"&gt;"cron.*summary"&lt;/span&gt; ~/.openclaw/logs/agent.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the summary is empty or contains only a preamble, the cron agent's thinking mode is eating your output. See the fix in the "No reply from agent" section above.&lt;/p&gt;

&lt;p&gt;If the summary contains actual content but Telegram still receives nothing, the announce agent model may be too small to process it. The announce model is hardcoded to the primary default model. You cannot override it with &lt;code&gt;agents.defaults.announce.model&lt;/code&gt; (that key is silently ignored). If your primary model is a small one (Mistral Small, Phi-3, etc.), it may not produce useful announce output from a long summary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disable thinking mode&lt;/strong&gt; on the cron agent (see above).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set a capable primary model&lt;/strong&gt; or accept that the announce agent inherits it. If you use a small model for chat, you'll need to make the heartbeat model your primary and use a routing rule for chat instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't trust the status.&lt;/strong&gt; Verify delivery in Telegram after every config change. The only reliable delivery confirmation is the message appearing in the chat.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dual-model configuration
&lt;/h2&gt;

&lt;p&gt;Most of these problems share a root cause: using a single small model for everything. OpenClaw routes chat, heartbeat, cron, and announce through the same model by default. A model that's fine for chat will fail at scheduled tasks.&lt;/p&gt;

&lt;p&gt;Minimum viable setup:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat&lt;/td&gt;
&lt;td&gt;Small (Mistral Small 3.2, 24B)&lt;/td&gt;
&lt;td&gt;Fast replies, low cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heartbeat / Cron&lt;/td&gt;
&lt;td&gt;Large (DeepSeek Chat v3.1, 685B MoE)&lt;/td&gt;
&lt;td&gt;Needs to follow multi-step tool pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Announce&lt;/td&gt;
&lt;td&gt;Inherited from primary default&lt;/td&gt;
&lt;td&gt;Cannot be configured independently&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mistralai/mistral-small-3.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"heartbeat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"thinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"isolated"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cost on OpenRouter for a daily digest: ~$0.03/day. The 24-hour deployment that produced 16 incidents cost $1.50 total, most of it from a retry loop on the small model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"No reply from agent"&lt;/td&gt;
&lt;td&gt;Thinking mode eats cron output&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"thinking": "off"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WORKFLOW_AUTO.md loop&lt;/td&gt;
&lt;td&gt;DeepSeek hallucination + context accumulation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"session": "isolated"&lt;/code&gt; + SOUL.md whitelist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;delivered: true&lt;/code&gt;, nothing sent&lt;/td&gt;
&lt;td&gt;Status tracks process, not delivery&lt;/td&gt;
&lt;td&gt;Fix upstream (thinking off) + verify in Telegram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control tokens in Telegram&lt;/td&gt;
&lt;td&gt;Model-native tokens not stripped&lt;/td&gt;
&lt;td&gt;Switch to isolated sessions, add SOUL.md constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;271 spam messages&lt;/td&gt;
&lt;td&gt;No retry limits + small model in failure loop&lt;/td&gt;
&lt;td&gt;Use large model for cron + set API budget cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron doesn't fire on schedule&lt;/td&gt;
&lt;td&gt;Small model can't compare timestamps&lt;/td&gt;
&lt;td&gt;Use large model for heartbeat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All issues documented with full incident logs in &lt;a href="https://blog.rezvov.com/deploying-openclaw-sixteen-incidents-one-day" rel="noopener noreferrer"&gt;Deploying OpenClaw: 16 Incidents, One Day, $1.50&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published: &lt;a href="https://blog.rezvov.com/openclaw-troubleshooting-no-reply-workflow-auto-delivery-failures" rel="noopener noreferrer"&gt;OpenClaw Troubleshooting: 'No Reply from Agent,' WORKFLOW_AUTO.md, and Silent Delivery Failures — Alex Rezvov's Blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aidrivendevelopment</category>
      <category>openclaw</category>
      <category>guide</category>
    </item>
  </channel>
</rss>
