Dec 23, 2025 - Scaling Decision-Making: Guardrails Beat Gatekeepers

I walked into a budget meeting expecting the usual spreadsheet tour: what went up, what went down, and where we should trim next year. We did that. But in the middle of the call, something else surfaced: we were debating how decisions should happen, not just what the numbers were.

Someone suggested a simple rule: any spend above a threshold should go to a committee for approval. It was well-intentioned, practical, and it looked good on paper.

My first reaction was: this won’t work.

Not because the threshold was too high or too low. But because the framing was off. It pushed strategy down to the operational level. It asked leaders across the company to act like mini-CFOs, to weigh trade-offs they don’t have context for. It created a system that depended on individual judgment instead of a repeatable path.

That’s the opposite of systems thinking.

Systems thinking

Systems thinking means you don’t fix outcomes only by giving people more decisions, you fix outcomes by designing the system that shapes decisions. If you want different behavior, you redesign the structure: the incentives, the sequence, the guardrails.

In practice, that means leadership has to do the hard part: define the path and remove ambiguity. The operation executes within that path.

So instead of telling everyone “spend less,” I prefer to ask: what are the rails that will naturally lead to better spending?

Enabling constraints (the rails)

That’s where enabling constraints come in. They are rules and flows that:

  • limit the decision space,
  • make the right choice the default,
  • without killing autonomy.

In our case, the first draft of the policy was “anything above X needs approval.” The system-thinking version was different:

  • First, internalize. If a request is about an external vendor, the first step is always to route it through the internal capability. Only if that path is exhausted does the approval flow even start. The point isn’t “protecting internal teams.” It’s reducing avoidable spend and fragmentation when the capability already exists, and escalating fast when it doesn’t.
  • Second, decide in the right moment. The worst time to approve a vendor is when the proposal is already on the table and the deadline is tomorrow. The flow needs to exist upstream, where the decision can be made calmly.
  • Third, separate strategy from execution. Teams should focus on delivery and client outcomes. Leadership should define guardrails with the people who run the work and monitor the system.

The difference is subtle but huge. Instead of asking people to make better decisions in chaotic situations, you reshape the process so the right decision is the easy one.

None of this eliminates judgment. It just moves judgment to the right layer: design the default path once, then let the organization run it repeatedly.

What I proposed

I proposed a lightweight “rail system” built around the reality of our operation:

  1. Define the default path. For certain categories (vendors, external analysis, specialized work), the default is internal first. If it can’t be done internally, the request escalates.
  2. Make the moment explicit. Add checkpoints inside the workflow where the request must be raised early, not when it’s already late.
  3. Keep approvals simple. No ceremonies, no weekly meetings, no bureaucracy. Just clear inputs, fast review, and a decision trail. Clear inputs = scope, deadline, expected outcome, alternatives considered, and a rough cost envelope.
  4. Define exception paths. Legal/compliance requirements, incident response, hard external deadlines, or unique expertise not available internally. If an exception applies, the flow skips steps, but still leaves a decision trail.

In other words: leadership designs the system; the team follows the rails.

Closing thoughts

This is not about being “tough on costs.” It’s about clarity. If you want a company to scale, you cannot rely on individual heroics or ad-hoc judgments. You need a system that consistently nudges people toward the strategic path.

And building those systems is not easy. You need to identify what should change, understand why the current structure enables the old behavior, visualize alternatives, and think through side effects, incentives, and how to earn buy-in from the people involved. That’s real work.

You know the rails are working when urgent approvals go down, repeat vendors consolidate, and lead time for “yes/no” decisions becomes predictable.

The easy thing is to outsource the problem to leaders who are already constrained in their day-to-day. “Just approve everything” sounds simple, but it’s naive to think that passing the burden downstream will solve the root issue.

Build the rails. Then let the train move fast.

Apr 2, 2025 - Anecdotal evidence of increased coding productivity with AI

I have been using AI to help me code (and actually to help me do anything) for a couple of years now. More and more I keep seeing how it boosts my productivity.

When programming, I keep code suggestions minimal in the IDE and really like the chat interface for tackling coding tasks. Writing down the problem, its constraints, and the task goals in a structured way has, in my experience, shown really great results and visibly boosted my productivity. As a bonus, it has positively influenced the way I communicate about technical challenges with colleagues.

So today, I saved some time to share a simple example — the anecdotal evidence. My task was to implement the following feature in a section of our app:

  • Automatically compress uploaded images

It took 25 minutes from start to finish. If I hadn’t used AI, I estimate that it would have taken me about 2 hours to search references, write down the code, test, and review before finishing this task.

👉 That’s roughly a 5x speed-up in this particular case.

Here’s a quick overview of how I structured my workflow using ChatGPT (GPT-4o model):

  1. Define the Problem: I started by clearly defining my task, which was to compress uploaded images automatically in two user flows.
  2. Generate Code: I asked ChatGPT to create a method for compressing images to high-quality JPEG, providing contextual code from my existing project.
  3. Integrate Changes: Next, I requested ChatGPT to modify two existing image upload methods, incorporating the new compression method.
  4. Create Unit Tests: Lastly, I asked ChatGPT to write a unit test for the new compression functionality following existing testing styles in the project.

Let’s take a deep dive.

The Workflow in Detail

Initially, I reviewed the source code to understand the user flows I needed to change and to locate the image upload entry points.

After getting familiar with the codebase, I concluded that the project didn’t yet define a method to compress images to JPEG. I also found an ImageExtensions class that contained several methods for performing operations on images (e.g., Rotate, Resize, Generate thumbnail, etc.), which I decided was the right place to define the new compression method.

So, in my first prompt to ChatGPT, I asked it to create the compression method, passing along additional contextual information to ensure the generated code would be compatible with my project:

prompt

In C# I’m using the following code for resizing images:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;

public static Image Resize(this Image image, int newWidth, int newHeight, string url = null) 
{
    using (var newImage = new Bitmap(newWidth, newHeight))
    {
        foreach (var item in image.PropertyItems)
            newImage.SetPropertyItem(item);

        using (var graphics = Graphics.FromImage(newImage))
        {
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
            graphics.DrawImage(image, new Rectangle(0, 0, newWidth, newHeight));
            var format = url != null ? GetImageFormat(url) : image.RawFormat;
            return Image.FromStream(newImage.ToStream(format));
        }
    }
}

Using the same referenced namespaces, how can I define a method for compressing images?

I want to compress PNG images into JPEG with high quality.

In its response ChatGPT correctly produced the following method (I’m omitting additional information and the usage sample also returned by ChatGPT):

response

public static Image CompressToJpeg(this Image image, long quality = 90L)
{
    if (image == null) throw new ArgumentNullException(nameof(image));

    // Set JPEG quality encoder
    var jpegEncoder = ImageCodecInfo.GetImageDecoders()
        .FirstOrDefault(c => c.FormatID == ImageFormat.Jpeg.Guid);

    if (jpegEncoder == null)
        throw new InvalidOperationException("JPEG encoder not found");

    var encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality);

    using (var ms = new MemoryStream())
    {
        image.Save(ms, jpegEncoder, encoderParams);
        return Image.FromStream(new MemoryStream(ms.ToArray()));
    }
}

I skimmed through the code, and it seemed to implement everything I requested, so I copied and pasted the generated code into my project’s ImageExtensions class.

I continued by asking ChatGPT to adjust two of my application user flows to use the new method, with additional considerations:

prompt

Now consider these two methods which handle Image objects:

    private string SaveCover(string coverName, Stream coverStream)
    {
        var path = GenerateImageName("covers", coverName);
        using (var img = Image.FromStream(coverStream))
        using (var stream = img.ToStream())
            return store.SaveObject(stream, path);
    }

    private string SaveIcon(string iconName, Stream iconStream)
    {
        var path = GenerateImageName("icons", iconName);
        using (var img = Image.FromStream(iconStream))
        using (var stream = img.ToStream())
            return store.SaveObject(stream, path);
    }
  1. Check if the file name indicates that the image is PNG (or other uncompressed image file).
  2. In case it is, call CompressToJpeg() and replace the name extensions to .jpeg.

As a result, both methods were modified as requested, and ChatGPT proposed a helper method IsUncompressedImage to be used by both methods in accordance with the DRY (“don’t repeat yourself”) principle.

Here’s the final code generated by ChatGPT for one of the methods after the introduced changes:

response

private string SaveIcon(string iconName, Stream iconStream)
{
    var isUncompressed = IsUncompressedImage(iconName);

    var finalName = isUncompressed
        ? Path.ChangeExtension(iconName, ".jpeg")
        : iconName;

    var path = GenerateImageName("icons", finalName);

    using (var img = Image.FromStream(iconStream))
    {
        var processedImage = isUncompressed ? img.CompressToJpeg(90L) : img;
        using (var stream = processedImage.ToStream(ImageFormat.Jpeg))
        {
            return store.SaveObject(stream, path);
        }
    }
}

Again, I reviewed the code and was happy with the proposed changes. After pasting it into my application code, everything compiled without any issues.

Finally, before closing the code changes, I wanted to create a unit test for the new CompressToJpeg method, so I sent another message to ChatGPT to create the test method analogous to another test in my project:

prompt

Now, create a unit test for the “CompressToJpeg” method. Follow the style below:

    [TestMethod]
    public void GetGeolocatedImageCoordinateTest()
    {
        var image = Image.FromFile(@"Resources\geolocated.jpg");
        var c = image.GetCoordinate();

        Assert.IsNotNull(c);
        Assert.AreEqual($"{-22.8939933776855}", $"{c.Latitude}");
        Assert.AreEqual($"{-43.1236000061035}", $"{c.Longitude}");
    }

The test should:

  1. Load a @”Resources\Boots.png” image
  2. Convert it to Jpeg
  3. Assert that the compressed image size is less than 25% of the original image size

Don’t save the compressed image to disk.

And voilà, the unit test was correctly created according to my request:

response

[TestMethod]
public void CompressToJpegTest()
{
    var image = Image.FromFile(@"Resources\Boots.png");

    using (var originalStream = new MemoryStream())
    using (var compressedStream = new MemoryStream())
    {
        // Save original image as PNG to stream
        image.Save(originalStream, ImageFormat.Png);
        var originalSize = originalStream.Length;

        // Compress to JPEG and save to stream
        var compressed = image.CompressToJpeg(90L);
        compressed.Save(compressedStream, ImageFormat.Jpeg);
        var compressedSize = compressedStream.Length;

        // Assert that the compressed image is less than 25% of the original size
        Assert.IsTrue(compressedSize < originalSize * 0.25,
            $"Expected compressed size < 25% of original. Original: {originalSize}, Compressed: {compressedSize}");
    }
}

After pasting the new test method into my test class, I was able to quickly run it and confirm that it passed 🟢.

Once I finished the code changes, I performed a manual test to validate that the task was completed:

Upload request in Chrome's network tab

Success!

Wrapping Up

This was just one of many examples where AI tools can turbocharge the time it takes to complete manual code structuring and fiddly tasks. This task was a great candidate because it was mostly digital plumbing, relying on high-level operations (like JPEG compression) already provided by the underlying framework.

Several studies try to capture how much productivity AI tools can bring. At the end of the day, it all depends on how frequently and how well you use them in your workflows.

As with anything, usage brings experience, and we become better at identifying the best situations and strategies for extracting productivity from these tools. A naive approach of blindly using AI in everything may backfire.


My complete conversation with ChatGPT can be accessed in the link below:

Oct 4, 2024 - Financial advice from ChatGPT? Let's give it a try!

I recently watched an interesting video titled How AI & LLMs are Shaping Financial Advice by MIT Professor Andrew W. Lo. In it, he discusses how LLMs could be used for tasks like analyzing financial reports and offering sound financial advice. He also touches on the challenges of oversight, trust and fiduciary duty, sharing his thoughts on how these issues might be addressed in the long run.

Right after that, YouTube suggested a news report from BBC about the Israel conflict in the Middle East, and that gave me an idea for an experiment. You see, we might be on the verge of an escalation in that conflict, and if it happens (I hope it doesn’t), I’m sure it’ll have a significant impact on the financial markets. I’m also sure that I’m not prepared for it, and that (again, if it happens) I’ll think in hindsight that I could have hedged against the real, though uncertain, possibility of escalation.

So in this experiment, I prepared a simple CoT (Chain-of-Thought) prompt to enlighten me about the possibilities ahead and advise me on what I could do. Let’s take a look at it below.

The prompt

If a conflict escalation occurs between Israel and Palestine in the Middle East, potentially involving Lebanon and possibly Iran…

1) What will happen to the global economy?

1.1) How might the global economy react if the conflict escalates further (e.g., involving the U.S.)?

2) Which currencies, commodities, bonds, and investments are likely to strengthen in this scenario, and which ones are likely to weaken?

3) How can I protect my capital in such a situation?

3.1) If the situation deescalates, what would be a balanced asset allocation strategy to hedge against both escalation and deescalation scenarios?

The purpose of this prompt is to first explain the typical impacts of conflict escalation on the global economy. Then, it analyzes the effects on an investor’s portfolio. Finally, it seeks advice on how to balance the portfolio, considering both the chances of escalation and de-escalation (essentially as a hedge).

I think with a little more effort, we could’ve made an even better prompt. But it’s friday so let’s give this one a shot and see what we get!

The reply

If the conflict between Israel and Palestine escalates, especially involving countries like Lebanon, Iran, and potentially drawing in global powers like the U.S., the global economy could be affected in several ways. Here’s an overview of what could happen, which investments might be impacted, and how you could protect your capital:

1. Global Economic Reaction to Conflict Escalation

If the conflict escalates into a broader regional war, the global economy could react in several ways:

  • Energy Supply Shocks: The Middle East is a crucial hub for global oil production. Any conflict that disrupts production or threatens the Strait of Hormuz (through which a significant percentage of the world’s oil passes) could send oil prices soaring. This would lead to inflationary pressures globally, particularly in energy-dependent economies.

  • Market Volatility: Investors might seek safer investments, leading to increased volatility in equity markets. Emerging markets could be especially vulnerable as they often rely on stable energy prices and foreign investment, both of which would be impacted.

  • Risk-Off Sentiment: Global investors tend to shift to safer, low-risk assets in times of uncertainty or geopolitical turmoil, which can affect multiple asset classes.


2. Impact on Currencies, Commodities, Bonds, and Investments

Strengthening Assets:

  • Commodities (Oil and Gold):
    • Oil: Any conflict in the Middle East typically leads to a rise in oil prices due to potential supply disruptions. Energy stocks might see a boost as oil prices rise.
    • Gold: Gold is traditionally viewed as a safe-haven asset during geopolitical tensions. Its price tends to rise when uncertainty or war escalates.
  • Currencies (USD and CHF):
    • USD (U.S. Dollar): The U.S. dollar tends to strengthen during global crises due to its status as a reserve currency and safe haven. Investors flock to the dollar in times of geopolitical instability.
    • CHF (Swiss Franc): Similar to the U.S. dollar, the Swiss franc is considered a stable, safe currency. It often appreciates during global turmoil.
  • Bonds (U.S. Treasuries, German Bunds):
    • U.S. Treasuries: Investors tend to move into U.S. Treasuries during times of global uncertainty. This will likely lead to lower yields (higher prices) for these bonds.
    • German Bunds: German bonds, considered some of the safest in Europe, are another place where investors might park capital during geopolitical crises.

Weakening Assets:

  • Equities (Especially in Emerging Markets):
    • Stocks, particularly in riskier or emerging markets, are likely to decline as investor sentiment turns risk-averse. Even developed markets might face downturns as investors sell off riskier assets in favor of bonds or safer investments.
  • Middle Eastern Currencies (Israeli Shekel, Lebanese Pound):
    • Currencies of countries directly involved in or geographically close to the conflict are likely to weaken. Investors may lose confidence in these currencies due to instability and fear of prolonged conflict.

3. Protecting Your Capital During Escalation

  • Increase Allocation to Safe-Haven Assets:
    • Gold and Precious Metals: Allocate part of your portfolio to gold or other precious metals.
    • U.S. Treasuries or Investment-Grade Bonds: Move towards high-quality bonds, such as U.S. Treasuries, or investment-grade corporate bonds to reduce risk and provide stability during market volatility.
    • Hold More Cash in USD or CHF: Having more liquidity in safe-haven currencies can provide flexibility and safety as the situation evolves.
  • Energy Sector Exposure: Increasing exposure to energy stocks or commodities like oil could provide a hedge against rising energy prices during conflict escalation.

  • Diversification: Ensure that your portfolio is diversified across geographies, sectors, and asset classes to minimize exposure to any one region or sector impacted by the conflict.

4. Balanced Asset Allocation Strategy for Escalation and De-escalation Scenarios

If you want to hedge against both escalation and de-escalation scenarios, you can adopt a balanced asset allocation strategy:

Escalation Hedge:

  • Commodities Exposure: Maintain some exposure to commodities like gold and oil. In times of escalation, these would benefit from flight-to-safety dynamics and potential supply disruptions.

  • Safe-Haven Bonds: Allocate to U.S. Treasuries or other low-risk government bonds, as they would strengthen in the event of increased geopolitical risk.

De-escalation Hedge:

  • Growth-Oriented Equities: Once the situation deescalates, global equity markets may recover, particularly in sectors that are cyclically sensitive like technology, consumer discretionary, or industrials. Maintain some exposure to these equities to capture potential upside.

  • Emerging Markets Exposure: If tensions ease, emerging markets that were initially hit hard may rebound strongly, making them an attractive investment for growth in a de-escalated environment.

Overall Strategy:

  • 60/40 or 50/30/20 Allocation: A traditional balanced allocation could work:
    • 60% Equities: Diversify across geographies and sectors (some growth-oriented, some defensive).
    • 40% Bonds: Split between safe-haven government bonds and investment-grade corporate bonds.
    • 20% Commodities & Alternative Investments: This portion can include gold, oil, and possibly some real estate or infrastructure investments that are less correlated with traditional assets.

By maintaining a diversified portfolio that includes both risk-on and risk-off assets, you can protect your capital and remain prepared for both escalation and de-escalation of geopolitical tensions.

There was a mix of stuff a bit obvious and some things that were new to me in the reply. But hey, sometimes the obvious needs to be said, right? Overall, I thought the info was pretty impressive. Then again, I’m not a financial analyst, so I might be falling into the Gell-Mann Amnesia effect without even realizing it.

Closing thoughts

It was a fun, quick experiment, and I learned a thing or two about global dynamics. Even though I won’t be following this advice for practical reasons, the main goal was to share it openly and get feedback from some friends in the financial sector. I also want to let it sit for a while, maybe check back in a year to see if GPT-4’s advice was somewhat valuable or just generic/simplistic fluff.