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

Pixel Watch's New Life-Saving Feature, Explained

1 Share

How can a smartwatch on your wrist do more than just track steps and actually help in a life-threatening situation?


Host Rachid Finge sits down with Google Health research scientist Jake Sunshine and product manager Pramod Rudrapatna to go deep on Breathing Emergency Detection, a breakthrough feature for the Google Pixel Watch.


They uncover the incredible story of its creation, from the initial "what if" moment to the immense challenges of clinical testing and the user-centered design that ensures it can summon help when someone is unable to themselves. It’s a look at how everyday devices are being reimagined to act as true health guardians, potentially saving lives when every second counts.


Hosted on Acast. See acast.com/privacy for more information.





Download audio: https://sphinx.acast.com/p/open/s/63e39eb02e631f0011a284ac/e/6aaf867851da7059ecd7c88b/media.mp3
Read the whole story
alvinashcraft
just a second ago
reply
Pennsylvania, USA
Share this story
Delete

Justin Martin: Commanding Fleets of AI Agents - Episode 420

1 Share

https://clearmeasure.com/developers/forums/

Today I'm joined by Justin Martin, a product-focused engineering leader based in Austin, Texas, with more than twenty years of experience driving technical innovation at startups and high-growth tech companies, from Groupon-era Rails to fraud prevention for banks. He is now commanding fleets of AI agents from a single post. He is currently the Head of Engineering at 6Lock.

Github - https://github.com/LupusDei
X Account - https://twitter.com/LupusDei18
Website - https://justinmmartin.me/
LinkedIn - https://www.linkedin.com/in/mythinking/

Want to Learn More?
Visit AzureDevOps.Show for show notes and additional episodes.





Download audio: https://traffic.libsyn.com/clean/secure/azuredevops/Episode_420.mp3?dest-id=768873
Read the whole story
alvinashcraft
11 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

533: iPhone Duo Development: Navigating Dual Screens and Layouts

1 Share

Apple's new iPhone Duo promises a game-changing foldable experience, but developers face a minefield of technical challenges. James and Frank break down the critical app adaptation work required—from handling multiple screen permutations to managing safe area insets and keyboard behavior—plus why native UI controls matter more than ever. 

Follow Us

⭐⭐ Review Us ⭐⭐

Machine transcription available on http://mergeconflict.fm

Support Merge Conflict





Download audio: https://aphid.fireside.fm/d/1437767933/02d84890-e58d-43eb-ab4c-26bcc8524289/43713c89-b5de-4787-a69f-1046c58ff386.mp3
Read the whole story
alvinashcraft
19 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

7 Ways How We Use AI Is Changing

1 Share
From: AIDailyBrief
Duration: 22:54
Views: 2,249

From persistent conversations and voice commands to chatbots that coordinate entire teams of agents, the way we work with AI is shifting. NLW breaks down seven changes shaping everyday AI use, including the move from prompts to goals, managing model costs, and building shared agents for teams.

The AI Daily Brief helps you understand the most important news and discussions in AI.
Subscribe to the podcast version of The AI Daily Brief wherever you listen: https://pod.link/1680633614
Get it ad free at http://patreon.com/aidailybrief
Learn more about the show https://aidailybrief.ai/

Read the whole story
alvinashcraft
24 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Azure Service Bus sessions: Pub/sub without autoforwarding

1 Share

TL;DR: Azure Service Bus does not support autoforwarding from a session-enabled subscription. A direct workaround is to process each subscription as an application input, but that spreads session locks, retries, monitoring, and shutdown across several receive points. A narrowly scoped transport-owned bridge can instead move each ordered subscription stream into one session-enabled endpoint queue. The application can then apply one recoverability model.

The earlier posts in my Azure Service Bus topology series looked at filters, shared-topic contention, failure boundaries, and incremental migration. This post adds another constraint to that discussion: ordered event streams.

My original sessions article covers the basic session model. The previous post in this mini-series explains why delayed retries need a session hold-back. Here, I want to keep that recoverability behavior in one place while events arrive through topics and subscriptions.

This topology only earns its complexity after the system has answered the question from You don’t need ordered delivery. If business-level state, idempotence, or a saga can handle events in either order, let the pub/sub system keep moving. If the event stream has a strict sequencing invariant, the topology must preserve it through forwarding and retries rather than only on the happy path.

The ordered design starts with one awkward broker rule: a session-enabled subscription cannot set ForwardTo.

Sessions remove the forwarding shortcut

A common endpoint topology uses Azure Service Bus autoforwarding:

publisher
  -> topic
    -> subscription
      -> ForwardTo
        -> endpoint input queue
          -> message handler

The subscription selects events for one consumer. Azure Service Bus forwards those events to the consumer’s input queue. Commands sent directly to the endpoint and events published through topics meet at that queue. Monitoring, retries, and handler concurrency all line up around one input.

According to the Azure Service Bus autoforwarding documentation, autoforwarding is not supported for session-enabled entities. An ordered subscription must therefore keep its messages until a receiver consumes them.

The shortest workaround is to invoke handlers directly from each subscription. But that turns an infrastructure constraint into an application model. An endpoint with five ordered subscriptions now has five handler inputs, each with session concurrency, recoverability, lifecycle, critical-error, and observability concerns.

Another hop can keep those concerns together.

Keep subscription receivers out of the handler pipeline

The alternative is a transport-owned bridge for every session-enabled subscription. The bridge accepts sessions and moves their messages into the endpoint’s session-enabled input queue.

publisher
  -> topic
    -> session-enabled subscription, no ForwardTo
      -> transactional subscription bridge
        -> session-enabled endpoint input queue
          -> session-aware message pump
            -> message handler

Keep this component boring. It does not invoke handlers, decide retry delays, or block sessions after a processing failure.

It copies the body, headers, and relevant broker properties. It preserves SessionId and the logical message identity, chooses the destination broker identity according to the endpoint’s duplicate-detection policy, and settles the source safely.

That leaves one ordered processing boundary. Commands sent to the endpoint, events bridged from subscriptions, and operational retries all arrive at the input queue. The session-aware pump owns the ordering and recoverability contract once.

Make forwarding transactional

A naive bridge sends a copy and then completes the subscription message. If the process stops between those operations, the source is redelivered, and the destination may receive a duplicate. Reversing the operations creates a loss window instead.

Azure Service Bus supports transactions that span entities in the same namespace. With cross-entity transactions enabled, the bridge can send the copy and complete the source under one transaction.

ServiceBusClient bridgeClient = new(
    connectionString,
    new ServiceBusClientOptions
    {
        EnableCrossEntityTransactions = true
    });

ServiceBusSender inputQueueSender =
    bridgeClient.CreateSender("sales-input");

ServiceBusSessionProcessor bridgeProcessor =
    bridgeClient.CreateSessionProcessor(
        "orders",
        "sales-sub",
        new ServiceBusSessionProcessorOptions
        {
            AutoCompleteMessages = false,
            MaxConcurrentSessions = 8,
            MaxConcurrentCallsPerSession = 1,
            ReceiveMode = ServiceBusReceiveMode.PeekLock
        });

bridgeProcessor.ProcessMessageAsync += async args =>
{
    ServiceBusReceivedMessage source = args.Message;
    ServiceBusMessage copy = new(source)
    {
        SessionId = args.SessionId
    };

    using TransactionScope transaction = new(
        TransactionScopeAsyncFlowOption.Enabled);

    await inputQueueSender.SendMessageAsync(copy);
    await args.CompleteMessageAsync(source);

    transaction.Complete();
};

The sample keeps the transaction visible by omitting lifecycle management, cancellation, diagnostics, and error handling. Production code must start and stop processors with the endpoint, report repeated bridge failures, and decide which native properties should survive the copy.

The bridge has a narrow responsibility. Building and operating the complete feature is still a sizable transport change.

The spike behind this article verifies cross-entity forwarding against a live namespace, including rollback. It also exercises concurrent producers, multiple retries, and a graceful restart in the input pump. It does not yet prove every hard-kill boundary or duplicate-detection configuration.

Each accepted session is limited to one concurrent call. Several sessions can move at once, but two messages from the same session should not race through one bridge processor.

Keep the ordering promise narrow

A session-enabled subscription owns an ordered stream for each SessionId. The bridge preserves that stream as it copies messages into the endpoint queue. Once copied, the endpoint queue establishes the processing order for that session.

That is not a global ordering guarantee. Suppose one endpoint subscribes to an orders topic and an inventory topic. Each topic has an independent subscription, and both subscriptions contain messages for Customer-123. Azure Service Bus does not coordinate an order across those subscriptions. Two bridges cannot reconstruct one.

A direct command for Customer-123 can also reach the input queue while bridged events are in flight. The input queue has a definite arrival order, but that order does not prove which event happened first across the source entities.

The useful promise is narrower: preserve each source subscription’s per-session order into the input queue, then preserve ordered endpoint processing per session at that queue. Anything stronger would need a distributed ordering coordinator outside the native session model.

The bridge relocates back-pressure

Without ForwardTo, a slow bridge leaves messages in the subscription. Subscriptions share the topic’s storage budget. One stalled ordered subscriber can therefore contribute to topic depth and eventually affect publishers or unrelated subscribers using that topic.

A healthy bridge drains messages into the endpoint input queue. The endpoint’s backlog then consumes the queue’s capacity rather than the topic’s capacity. This moves the normal buffering boundary closer to the consumer who owns the work.

It does not remove back-pressure. If the input queue is full or unavailable, the transactional send cannot commit. The source message remains in the subscription and pressure returns to the topic.

Native autoforwarding can dead-letter at the source when destination problems repeatedly prevent forwarding. A custom bridge needs an equally deliberate escape valve. After a bounded number of failures, it may need to dead-letter the source message with enough diagnostics to explain why the endpoint queue rejected it. Otherwise, the bridge can stop draining forever. The exact source-side dead-lettering policy remains an open production item.

Configuration becomes part of the contract

RequiresSession is fixed when a queue or subscription is created. Enabling ordered processing on an existing endpoint, therefore, needs a migration plan, new entity names, or fail-fast validation. It is not a runtime switch that can update an entity in place.

Every message entering the ordered path also needs a SessionId. That includes published events, direct commands, bridge copies, and operational retries. Rejecting a message before send is safer than discovering the missing identifier when the session-enabled entity refuses delivery.

Partitioning adds another constraint. On partitioned session entities, the session identifier also selects the partition. Any explicit partition or transaction partition key must remain compatible with it. Batching may need to group messages by destination and session rather than destination alone.

The receive mode matters too. Receive-and-delete removes the settlement operations needed for a transactional bridge and for session-aware recovery. Peek-lock is the practical foundation when the system promises recoverability as well as order.

Keep one endpoint queue

It would be simpler to describe this topology as “consume the subscriptions.” It would be harder to operate. Every new subscription would add another place where handlers can fail and another place where the system must understand blocked sessions and retries.

That extra broker hop and its transaction cost preserve a stronger application boundary. The endpoint still has one input queue. That queue owns concurrency, session state, delayed-retry hold-backs, error handling, and operational visibility.

Azure Service Bus cannot autoforward a session-enabled subscription. The application does not have to inherit that limitation as its programming model.

Further reading:

Common questions

These are the questions I would ask before adding ordered subscriptions to an endpoint.

Can a session-enabled subscription use ForwardTo?

No. Azure Service Bus does not support autoforwarding on session-enabled subscriptions, so code must receive those messages.

Does a bridge create global ordering across topics?

No. It can preserve per-session order from one source subscription. Independent topics, subscriptions, commands, and retries do not share a broker-wide ordering authority.

Why use a transaction?

The bridge must send a destination copy and settle the source as one outcome. Without a transaction, a crash between those operations creates a duplicate or loss window.

Read the whole story
alvinashcraft
42 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Sharing your VS Code automations

1 Share

Last week I talked about Continuous AI and how the VSCode Automation feature is one example of this vision

My blog posts were just written when a new VS Code update landed on my machine with some Automation improvements included. First the automation feature is no longer in preview but enabled by default.

But the feature I want to talk about is that you can start sharing automations; either by shipping automation templates through an agent plugin, or by exporting and importing automations as a file.

Let's look at both.

What gets shared?

An automation is a saved prompt, a session configuration and a schedule. Not all of that travels well between machines, so VS Code only shares the portable part:

  • Name and prompt
  • Schedule (manual, hourly, daily or weekly)
  • File format version and an identifier

What is not shared: workspace, provider, model, permissions, enabled state and run history. The person who receives the automation makes those choices locally.

This makes sense. You don't want someone else's permission settings silently landing on your machine.

Option 1: Automation templates in an agent plugin

Agent plugins can now contribute automation templates next to the list of built-in templates. 

Put them in an automations/ folder at the root of your plugin. Every file needs the .automation.md suffix.

my-team-plugin/
  plugin.json
  automations/
    daily-commit-summary.automation.md

The plugin.json is the regular Agent Plugins manifest:

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "my-team-plugin",
  "description": "Automation templates for our team",
  "version": "1.0.0"
}

A template is a Markdown file with YAML frontmatter. The Markdown body is the prompt:

---
version: 1
id: daily-commit-summary
name: Daily commit summary
description: Summarize the commits of the last 24 hours.
schedule:
  kind: cron
  expression: "0 8 * * *"
  timeZone: local
---
Summarize the commits on the current branch from the last 24 hours.
Group them by feature, fix and maintenance.
Do not modify any files.

For the schedule you have these options:

  • kind: manual
  • kind: hourly
  • kind: cron with a five-field expression for a daily or weekly schedule, together with timeZone: local

Remark: Only local-time cron expressions that represent a daily or weekly schedule are supported. Anything else is ignored. VS Code doesn't try to fix your schedule for you.

Tip: Don't want to use the default automations/ folder? Add extra folders through extensions.com.github.copilot.automations.paths in plugin.json. Set exclusive to true to load templates only from those folders.

Using the templates

Install the plugin, for example through Install Plugin from Source on the Plugins page of the Agent Customizations editor, or by registering a local folder in the chat.pluginLocations setting.

Then open Automations in the Agents window. Your templates show up under Templates from Plugins, with a Plugin badge and the name of the source plugin. A blue marker tells you a plugin contributed a new template.

Select a template and the New Automation dialog opens. Review the prompt and the schedule, choose workspace, agent, model, permissions and isolation, and select Create. The Enabled checkbox is cleared by default.

Installing the plugin doesn't create or enable anything. Disabling the plugin removes its templates from the view, but automations you already created from them (including their run history) stay.

Option 2: Export and import

Sometimes a plugin is overkill. You have one automation and you want to send it to one person.

To export:

  1. Hover over the automation card and open More Actions
  2. Select Export
  3. Choose where to save the .automation.md file

The result is the same format as a plugin template: readable Markdown with YAML frontmatter. Open it in an editor before you share it. That's a good habit anyway.

To import:

  1. Select Import Automation in the Automations view and choose the file, or drag the file onto the view
  2. Review the name, prompt and schedule in the New Automation dialog
  3. Choose workspace, agent, model, permissions and isolation
  4. Select Enabled when you are happy, then Create

Files that VS Code doesn't support are rejected instead of being imported with a changed schedule or with execution permissions.

Remark: An automation can read files, run commands and make changes based on the permissions of its agent. Review the permission level before you schedule anything unattended, certainly for an automation you received from someone else.

Which one should you use?

  • Agent plugin: for templates you want to maintain and distribute to a team. Update the plugin and everyone gets the new version.
  • Export/import: for one-off sharing between two people or two machines.

Both end up in the same place: the New Automation dialog, disabled, waiting for your review.

More information

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