Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
158939 stories
·
33 followers

Iot Coffee Talk: Episode 325 - Agentic Accountability (Who is on the hook for bad AI behavior?)

1 Share
From: Iot Coffee Talk
Duration: 59:35
Views: 0

Welcome to IoT Coffee Talk, where hype comes to die a terrible death. We have a fireside chat about all things #IoT over a cup of coffee or two with some of the industry's leading business minds, thought leaders and technologists in a totally unscripted, non-AI affected and manipulated, organic format.

This week Rob, Devin, Pete, and Leonard jump on Web3 for a discussion about:

🎶 🎙️ BAD KARAOKE! 🎸 🥁 "Castles Made of Sand", Jimi Hendrix
🐣 Rob can't find his Stratovarus! Can you help him?
🐣 Is there a bias against human creativity and humanities?
🐣 Is AI worth book burning and destruction? Did you ask permission?
🐣 Should you be using AI for therapy? Why are human therapists better?
🐣 When an AI agent commits a crime, who is accountable?
🐣 Do the Kill Switch Act an inevitable necessity to regulate irresponsible AI?
🐣 The asymmetrical and unfair fight and cost to defend from criminal AI.
🐣 Why everyone needs to get real about their Battlestar Galactica security strategy!
🐣 What is automated AI development? Is that all you want to slow down, AI guys?
🐣 Is GenAI really that essential and important to humanity's future? Is it just a tool?
🐣 Can we ever trust AI and agents to operate on its own?
🐣 Why organizations need to reckon with their AI Frankenstein security debt!
🐣 PSA: See you at the Things Conference 2026 in Amsterdam!
🐣 PSA: Resilient America Challenge by Edge AI Foundation sponsored by Qualcomm, Edge Impulse, and Arduino.

It's a great episode. Grab an extraordinarily expensive latte at your local coffee shop and check out the whole thing. You will get all you need to survive another week in the world of IoT and greater tech!

Tune in! Like! Share! Comment and share your thoughts on IoT Coffee Talk, the greatest weekly assembly of Thinkers 360 and CBT tech and IoT influencers on the planet!!

If you are interested in sponsoring an episode, please contact Stephanie Atkinson at Elevate Communities. Just make a minimally required donation to www.elevatecommunities.org and you can jump on and hang with the gang and amplify your brand on one of the top IoT/Tech podcasts in the known metaverse!!!

Take IoT Coffee Talk on the road with you on your favorite podcast platform. Go to IoT Coffee Talk on Buzzsprout, like, subscribe, and share: https://lnkd.in/gyuhNZ62

Read the whole story
alvinashcraft
37 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Demis Steps Down, Apple’s Memory Problem, Microsoft’s Clever Trick

1 Share

M.G. Siegler from Spyglass is back for our Montly discussion of the latest tech news. We cover: 1) Demis Hassabis steps down as DeepMind CEO (Alex solo) 2) Apple's memory crunch 3) Should Apple have known better? 4) Will iPhone prices go up? 5) How much can Apple raise prices without losing sales 6) Does that eventually hurt its services business? 7) Microsoft is spending less on AI... but there's an interesting wrinkle 8) How much cloud growth is driven by OpenAI and Anthropic? 9) The divisions within Google's AI division 10) Can Google get it together?

---

Enjoying Big Technology Podcast? Please rate us five stars ⭐⭐⭐⭐⭐ in your podcast app of choice.

Want a discount for Big Technology on Substack + Discord? Here’s 25% off for the first year: https://www.bigtechnology.com/subscribe?coupon=0843016b

Learn more about your ad choices. Visit megaphone.fm/adchoices





Download audio: https://pdst.fm/e/tracking.swap.fm/track/t7yC0rGPUqahTF4et8YD/pscrb.fm/rss/p/traffic.megaphone.fm/AMPP8118466690.mp3
Read the whole story
alvinashcraft
37 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

PPP 518 | Why Better AI Prompts Aren't Enough for Better Decisions, with author Cheryl Strauss Einhorn

1 Share

Summary

In this episode, Andy welcomes Cheryl Strauss Einhorn, founder and CEO of the decision sciences company Decisive and author of The Human Edge: Smarter Decisions in the Age of AI. Cheryl has spent decades helping people make better decisions, and her message here is a simple one: AI can gather, summarize, and compare, but it can't know what matters most unless we do the thinking first.

Andy and Cheryl talk about why "AI first" can quietly turn into AI only, and why a poor answer from AI is actually useful feedback about your own thinking. Cheryl explains why separating the what of a decision from the why can change the path forward, shares her vision of success question, and walks through how human bias and AI bias reinforce each other. You'll also hear a practical way to use AI personas to pressure test your thinking before a big stakeholder conversation, plus what parents can do to help kids strengthen their decision-making muscles instead of letting them atrophy.

If you're looking for practical ways to make smarter decisions in the age of AI, this episode is for you!

Sound Bites

  • "AI is about patterns, but we're about purpose."
  • "We need to be the chief deciders in our own life."
  • "We need to make sure that we actually have a way to push back and check the veracity of what it's giving us because it's a known liar."
  • "And so the authenticity of human interaction is what actually builds trust, strengthens relationships, and really gives us a lot of the connections that are important to us in our home life and our work life."
  • "You don't need to have a perfect prompt for AI."
  • "AI is going to give you other people's answers."
  • "'Knowledge is power' isn't as true now. It's what you are able to do with the knowledge, and it's why you want to collect the knowledge in the first place."
  • "I almost never would accept AI's first answer."
  • "We tend to have evolving hypotheses unless we really build an audit trail of our thinking."
  • "So in the world of medicine, a fever tells you something is wrong, but it tells you nothing about what is wrong or where to look."
  • "So first we know AI's a sycophant, right?"
  • "If it's 99% accurate in its conclusion, but its underlying data is the wrong data set, you've got the wrong answer."
  • "I would say the more that I've studied these cognitive biases, these mental shortcuts, the more I realize that we see the world through a dirty windshield."
  • "Our brains are muscles, and just like we exercise to strengthen our muscles, if we don't exercise, they atrophy."

Chapters

  • 00:00 Introduction
  • 02:00 Start of Interview
  • 02:12 Growing Up Surrounded by Questions
  • 04:30 What Leaders Should Watch Out for in "AI First"
  • 07:07 When AI Confidently Makes Things Up
  • 09:04 How AI First Turns into AI Only
  • 09:20 Why Polished Doesn't Mean Authentic
  • 11:59 A Prompting Problem or a Problem Definition Problem?
  • 14:37 The Vision of Success Question
  • 15:45 Why a Bad Answer Is Useful Feedback
  • 19:06 Separating the What from the Why
  • 20:32 Research: More Information Isn't Better Judgment
  • 24:35 Progressive Prompting and Never Accepting the First Answer
  • 25:18 Fabricated Quotes and the Trouble with Attribution
  • 26:50 Documenting Assumptions and Building an Audit Trail
  • 29:25 Committing to Your Own Thinking
  • 32:29 How Human Bias and AI Bias Reinforce Each Other
  • 34:55 Knowing About Biases Doesn't Make You Immune
  • 36:51 Using AI Personas to Challenge Your Thinking
  • 40:20 AI and Stakeholder Management
  • 42:42 Helping Kids Become Better Decision-Makers
  • 44:25 End of Interview
  • 44:51 Andy Comments After the Interview
  • 48:13 Outtakes

Learn More

You can learn more about Cheryl and her work at AREAMethod.com.

For more learning on this topic, check out:

  • Episode 460 with Joe Sutherland. It's an interesting look at the intersection of AI, data, and decision-making, and a great follow-up to this discussion.
  • Episode 381 with Jim Loehr. One of Andy's favorite conversations about decision-making, from a remarkable figure in the human performance world.
  • Episode 99 with Mike Roberto. A conversation about his book Why Great Leaders Don't Take Yes for an Answer, recorded long before ChatGPT showed up, and still insightful today.

Chat with PMeLa

You can chat directly with PMeLa, the podcast's AI persona, to get episode recommendations and answers to your project management and leadership questions. Visit PeopleAndProjectsPodcast.com/PMeLa to chat with her.

Pass the PMP Exam

If you or someone you know is thinking about getting PMP certified, we've put together a helpful guide called The 5 Best Resources to Help You Pass the PMP Exam on Your First Try. We've helped thousands of people earn their certification, and we'd love to help you too. It's totally free, and it's a great way to get a head start.

Just go to 5BestResources.PeopleAndProjectsPodcast.com to grab your copy. I'd love to help you get your PMP this year!

Join Us for LEAD52

I know you want to be a more confident leader–that's why you listen to this podcast. LEAD52 is a global community of people like you who are committed to transforming their ability to lead and deliver. It's 52 weeks of leadership learning, delivered right to your inbox, taking less than 5 minutes a week. And it's all for free. Learn more and sign up at GetLEAD52.com. Thanks!

Thank you for joining me for this episode of The People and Projects Podcast!

Talent Triangle: Power Skills

Topics: Decision Making, Artificial Intelligence, Leadership, Project Management, Critical Thinking, Cognitive Bias, Problem Solving, Stakeholder Management, Judgment, Curiosity

The following music was used for this episode:

Music: Echo by Alexander Nakarada
License (CC BY 4.0): https://filmmusic.io/standard-license

Music: Tuesday by Sascha Ende
License (CC BY 4.0): https://filmmusic.io/standard-license





Download audio: https://traffic.libsyn.com/secure/peopleandprojectspodcast/518-CherylStraussEinhorn.mp3?dest-id=107017
Read the whole story
alvinashcraft
37 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

RNR 369 - RNR Explains: AppRegistry

1 Share

Robin Heinze and Tyler Williams break down React Native’s AppRegistry! From Expo and app entry points to brownfield apps and more, see what’s happening under the hood and build mobile apps with even more confidence after this exciting episode.

 

Connect With Us!

 

This episode is brought to you by Infinite Red!

Infinite Red is a premier mobile app consultancy, especially focused on Expo and React Native, located fully remote in the US. We’re a team of 30 with highly experienced mobile app developers and have been doing this for over a decade. We are also one of the first development teams to adopt agentic coding in a way that keeps high quality standards and aren’t afraid to do things the old school way if we need to. If you’re looking for mobile app or React Native or Expo expertise for your next project, hit us up at infinite.red/radio.





Download audio: https://cdn.simplecast.com/media/audio/transcoded/1208ee61-9c16-43c1-bc4c-ca790717f4a8/2de31959-5831-476e-8c89-02a2a32885ef/episodes/audio/group/131a2a35-bba9-4c37-adaa-007e144a309d/group-item/40fd5a9f-957e-4623-8611-3127f132d202/128_default_tc.mp3?aid=rss_feed&feed=hEI_f9Dx
Read the whole story
alvinashcraft
37 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Why does anyone use Crossplane?

1 Share

Share Episode         
         
Pushkar Gopalakrishna, Senior Staff Software Engineer at Snap, previously Cruise and AWS, joins to explore why engineering organizations pivot away from Terraform and HCL toward Kubernetes-native tools even when they might not be better. We unpack how developer friction, copy-pasted control structures, and misaligned organizational incentives create massive tech debt—often forcing SREs to manually update infrastructure repositories for compliance, resulting in broken pipelines and severe operational friction.

         

We debate over the mechanics of Crossplane, detailing how its continuous reconciliation loop and Custom Resource Definitions (CRDs) allow teams to express cloud infrastructure as YAML alongside their application manifests at potentially the cost of async validation. Pushkar pulls back the curtain on how Cruise managed infrastructure at scale using a custom internal platform called 'Juno' to bootstrap GCP projects, repositories, and permissions, while leveraging Crossplane for application-level resources. We also dive into the dangers of using CI tools for continuous deployment, detailing a terrifying incident where a pipeline bug accidentally marked three production Kubernetes namespaces for deletion, and how moving to ArgoCD and Argo Rollouts helped prevent future outages for autonomous vehicles.

         

Finally, we touch on the realities of non-production environment isolation, testing against live APIs, and why platform teams must balance providing a seamless developer experience without stripping away developer accountability.

         
💡 Notable Links:         
🎯 Picks:         




Download audio: https://dts.podtrac.com/redirect.mp3/api.spreaker.com/download/episode/73637013/download.mp3
Read the whole story
alvinashcraft
37 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Persisting a Rich Domain Model With EF Core

1 Share

Whenever I write about refactoring an anemic domain model into a rich one, one objection reliably appears in the replies:

Nice in theory, but EF Core needs public setters and a public parameterless constructor. The ORM forces the anemic model on us.

It was true a decade ago. It is not true now: EF Core will happily persist a fully encapsulated aggregate, and the payoff is a domain model that enforces its invariants in one place while the ORM quietly does its job.

An anemic entity with public setters that any service can mutate, next to a rich aggregate where state is private and every change goes through methods that enforce invariants

Let's map one aggregate end to end and hit every place where EF Core and encapsulation supposedly collide.

The Aggregate We Want to Persist

The domain is home brewing, because order aggregates have been done to death. A Batch ferments, you take gravity readings, and once the gravity holds steady you bottle. Bottle too early, while the yeast is still eating sugar, and you get bottle bombs.

Here's the Batch written the way I actually want it: no public setters, creation through a factory, and state changes that go through methods.

public sealed class Batch
{
    private readonly List<FermentationReading> _readings = [];
    private readonly List<IDomainEvent> _domainEvents = [];
    private DateTime? _bottledAtUtc;

    private Batch() { } // For EF Core

    private Batch(BatchId id, RecipeId recipeId, Volume volume)
    {
        Id = id;
        RecipeId = recipeId;
        Volume = volume;
        Status = BatchStatus.Fermenting;
    }

    public BatchId Id { get; private set; }
    public RecipeId RecipeId { get; private set; }
    public BatchStatus Status { get; private set; }
    public Volume Volume { get; private set; }

    public IReadOnlyCollection<FermentationReading> Readings => _readings.AsReadOnly();
    public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents.AsReadOnly();

    public static Batch Start(RecipeId recipeId, Volume volume) =>
        new(new BatchId(Guid.CreateVersion7()), recipeId, volume);

    public void AddReading(Gravity gravity, DateTime takenAtUtc)
    {
        if (Status != BatchStatus.Fermenting)
        {
            throw new DomainException("Readings only make sense while the batch is fermenting.");
        }

        _readings.Add(new FermentationReading(gravity, takenAtUtc));
    }

    public void Bottle(TimeProvider timeProvider)
    {
        if (Status != BatchStatus.Fermenting)
        {
            throw new DomainException("Only a fermenting batch can be bottled.");
        }

        Gravity[] lastTwo = _readings
            .OrderBy(r => r.TakenAtUtc)
            .TakeLast(2)
            .Select(r => r.Gravity)
            .ToArray();

        if (lastTwo.Length < 2 || lastTwo[0] != lastTwo[1])
        {
            throw new DomainException(
                "Gravity must hold steady across two readings before bottling.");
        }

        Status = BatchStatus.Bottled;
        _bottledAtUtc = timeProvider.GetUtcNow().UtcDateTime;
        _domainEvents.Add(new BatchBottled(Id));
    }

    public void ClearDomainEvents() => _domainEvents.Clear();
}

The supporting types are records, so value equality comes for free:

public readonly record struct BatchId(Guid Value);
public readonly record struct RecipeId(Guid Value);
public readonly record struct Gravity(decimal Value);

public sealed record Volume(decimal Amount, string Unit);

Three choices here come straight from aggregate design: RecipeId references another aggregate by ID only, FermentationReading is a child entity that lives and dies with the batch, and _bottledAtUtc is a private field with no property at all. Every one of those supposedly "breaks" EF Core, so let's map them piece by piece.

Private Constructors and Private Setters Just Work

When EF Core materializes an entity, it doesn't use your public API. It calls the private parameterless constructor and writes to properties through their backing fields, private setters and all. That's the whole reason private Batch() { } exists, and it's the one concession the domain model makes to the ORM.

Loading and changing a batch looks like any other EF code:

Batch batch = await context.Batches
    .SingleAsync(b => b.Id == batchId);

batch.AddReading(new Gravity(1.012m), timeProvider.GetUtcNow().UtcDateTime);

await context.SaveChangesAsync();

Change tracking reads the same backing fields, so private setters hide nothing from SaveChanges.

EF can even bind a parameterized constructor, matching parameters to mapped properties by name and type, private or not. The catch: navigations can't be constructor-bound, so an aggregate with a collection still needs the parameterless one. EF also skips your factory's validation when loading, which is correct: re-running rules during materialization would make historical rows unloadable the first time a rule changes.

Strongly Typed IDs and References to Other Aggregates

BatchId and RecipeId are strongly typed IDs, mapped with value conversions inside an IEntityTypeConfiguration<Batch>:

public sealed class BatchConfiguration : IEntityTypeConfiguration<Batch>
{
    public void Configure(EntityTypeBuilder<Batch> builder)
    {
        builder.ToTable("batches");

        builder.HasKey(b => b.Id);

        builder.Property(b => b.Id)
            .HasConversion(id => id.Value, value => new BatchId(value))
            .ValueGeneratedNever();

        builder.Property(b => b.RecipeId)
            .HasConversion(id => id.Value, value => new RecipeId(value));

        // Collections, value objects, and domain events: next sections.
    }
}

ValueGeneratedNever matters: value generation behind converters is a documented limitation area, so generate IDs in code (Guid.CreateVersion7() in the factory) and tell EF to keep its hands off.

Notice what RecipeId is not: a Recipe navigation property. The recipe is its own aggregate, and you don't need its grain bill to take a gravity reading. The foreign key column still exists, but the domain model doesn't traverse it.

The Encapsulated Collection

By convention, EF finds the _readings backing field for a navigation named Readings, but I configure it explicitly so the mapping survives a rename:

builder.HasMany<FermentationReading>("_readings")
    .WithOne()
    .HasForeignKey("batch_id");

builder.Navigation("_readings")
    .UsePropertyAccessMode(PropertyAccessMode.Field)
    .AutoInclude();

PropertyAccessMode.Field tells EF to read and write the field and never touch the public view. AutoInclude is my default for aggregates: the Bottle invariant reads the readings, so a half-loaded Batch is unsafe to use. WithOne() with no arguments means the child has no navigation back to Batch; the batch_id foreign key lives only as a shadow property.

State With No Property at All

_bottledAtUtc has no property, only a private field, and EF maps it anyway:

builder.Property<DateTime?>("_bottledAtUtc")
    .HasColumnName("bottled_at_utc");

The cost shows up on the query side: filtering on the field means writing EF.Property<DateTime?>(b, "_bottledAtUtc") in the LINQ query. My rule: private setters for state that queries filter on, field-only mapping for state only the aggregate itself needs.

var bottledThisWeek = await context.Batches
    .Where(b => EF.Property<DateTime?>(b, "_bottledAtUtc") >= weekAgo)
    .ToListAsync();

Value Objects: Complex Types, Owned Types, and Conversions

Volume is a value object, and multi-property value objects map as complex types, which store their members inline in the owner's table (no join, no separate identity):

builder.ComplexProperty(b => b.Volume, volume =>
{
    volume.Property(v => v.Amount).HasColumnName("volume_amount");
    volume.Property(v => v.Unit).HasColumnName("volume_unit");
});

Complex types were a v1 feature in EF Core 8 (no optional properties, no collections); EF Core 10 lifted both. On EF 8 or 9, a collection of value objects (say the batch kept its HopAddition schedule) falls back to owned types, which work everywhere but carry a hidden shadow key, because EF treats them as entities pretending to be values:

builder.OwnsMany(b => b.HopAdditions, hop =>
{
    hop.ToTable("hop_additions");
    hop.WithOwner().HasForeignKey("batch_id");
});

The enum takes a plain conversion, stored as text so the database stays readable:

builder.Property(b => b.Status)
    .HasConversion<string>()
    .HasMaxLength(20);

All converted properties share one caveat: LINQ operates on the provider type, so sorting by Status gives alphabetical order (Bottled, Dumped, Fermenting) rather than lifecycle order.

Domain Events Stay Out of the Schema

IDomainEvent is no entity, so tell EF to leave the DomainEvents collection alone:

builder.Ignore(b => b.DomainEvents);

The events still need to go somewhere, and a SaveChangesInterceptor is the natural place:

public sealed class DomainEventsInterceptor(IDomainEventsDispatcher dispatcher)
    : SaveChangesInterceptor
{
    public override async ValueTask<int> SavedChangesAsync(
        SaveChangesCompletedEventData eventData,
        int result,
        CancellationToken cancellationToken = default)
    {
        var domainEvents = eventData.Context!.ChangeTracker
            .Entries<Batch>()
            .SelectMany(entry =>
            {
                var events = entry.Entity.DomainEvents.ToList();
                entry.Entity.ClearDomainEvents();
                return events;
            })
            .ToList();

        await dispatcher.DispatchAsync(domainEvents, cancellationToken);

        return await base.SavedChangesAsync(eventData, result, cancellationToken);
    }
}

IDomainEventsDispatcher is the strongly typed dispatcher I built in building a custom domain events dispatcher, with no MediatR dependency; that post also covers dispatching before the save when handlers must share the transaction.

The Domain Never References EF Core

Every mapping snippet so far lives in BatchConfiguration, none of it in Batch: no mapping attributes, no ORM base class. That's persistence ignorance, and the fluent configuration API is what makes it possible. The DbContext sits in the infrastructure layer and picks up every configuration from its own assembly:

public sealed class BreweryDbContext(DbContextOptions<BreweryDbContext> options)
    : DbContext(options)
{
    public DbSet<Batch> Batches => Set<Batch>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(
            typeof(BreweryDbContext).Assembly);
    }
}

Summary

The "EF Core forces anemic models" objection expired years ago. A private constructor, backing fields, value conversions, and complex types cover everything a fully encapsulated aggregate needs, and all of it lives in configuration classes the domain never sees. The real limits come down to two: navigations can't be constructor-bound, and converted or field-only members translate through the provider type in queries.

The ORM was never the thing keeping your domain model anemic. It's a mapping exercise, done once per aggregate, and the encapsulation holds from then on.

If you want to go deeper into modeling aggregates, value objects, and rich behavior across a real system, that's what I teach in Pragmatic Domain-Driven Design.

Thanks for reading.

And stay awesome!




Read the whole story
alvinashcraft
38 minutes ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories