Profiling and Optimizing Hybrid Quantum–Classical Applications
Learn how to profile latency, resource usage, and bottlenecks in hybrid quantum-classical apps with practical optimization tactics.
Profiling and Optimizing Hybrid Quantum–Classical Applications
Hybrid quantum-classical applications are where real quantum development meets the constraints of modern software engineering. In practice, these workloads are not “just quantum circuits”; they are distributed systems that combine a classical host, SDK/runtime layers, network hops, queueing behavior, QPU access windows, and post-processing logic. That means performance tuning has to be broader than circuit depth reduction alone. If you are evaluating team capabilities for hybrid quantum classical development, this guide will help you build the instrumentation and optimization muscle needed to ship reliable prototypes with measurable improvements.
What makes profiling quantum apps difficult is that the bottleneck can move around from run to run. A circuit may be efficient, but latency may be dominated by orchestration, transpilation, API overhead, or batched execution policies in the cloud backend. On the other hand, a classical pipeline may be clean, yet the quantum part may suffer from unnecessary gate counts, poor qubit mapping, or deep parameter sweeps that amplify noise. That is why the best teams treat profiling quantum apps as a full-stack discipline, similar to how operators analyze hidden cloud costs in AI services or enterprise-scale AI metrics and repeatable processes.
In this guide, you will learn how to measure latency, resource usage, and bottlenecks across the full workflow; how to compare classical orchestration strategies; and how to optimize both circuits and orchestration loops without losing reproducibility. Along the way, we will connect practical quantum developer tools to established performance engineering habits, because the strongest hybrid quantum classical teams borrow methods from observability, distributed systems, and runtime analysis. For readers building a broader operating model, see also our guide on embedding governance into product roadmaps and governance for no-code and visual AI platforms.
1. What to Measure in a Hybrid Quantum–Classical Workflow
Latency, throughput, and queueing delay
Hybrid systems are often blamed for “slow quantum execution” when the real issue is end-to-end latency across several stages. A single request may include parameter preparation, circuit construction, transpilation, job submission, queue wait time, backend execution, result retrieval, and classical post-processing. If you only measure execution time inside the circuit, you miss the latency profile that end users actually experience. A practical profiling plan starts by timestamping each stage and calculating both p50/p95 latency and queueing variance.
Think of the workflow like a payment pipeline where authorization, risk checks, and clearing all affect the final response time. In the same way, hybrid quantum workflows should be monitored as a chain of dependent operations rather than an isolated computation. This is especially important for experiments that use repeated parameterized circuit runs, because the network and scheduler overhead can dominate the quantum runtime. For a useful analogy on end-to-end dependency management, review real-time payments and continuous identity checks and clinical decision support systems that clinicians actually use.
Resource usage across CPU, memory, I/O, and QPU calls
Resource profiling in hybrid apps should include both classical and quantum-side consumption. On the classical side, track CPU bursts from circuit construction, memory spikes caused by large statevector simulations, disk or network I/O from data loading, and serialization overhead when moving objects between processes. On the quantum side, count circuit depth, two-qubit gate usage, number of shots, number of transpilation passes, and the volume of backend requests. If your workload uses simulator fallback or batching, those behaviors need to be measured too, because they can mask true resource costs.
Teams sometimes over-focus on shot count because it is easy to see, but that is only one dimension of expense. A circuit with a modest shot count can still be operationally expensive if it requires many retries, repeated calibrations, or inefficient job packing. Consider resource profiling as a budgeting exercise: you are estimating how much classical orchestration and quantum execution your application really consumes per useful result. This mindset mirrors how operators plan for variable costs in AI supply chain risk management and how performance teams examine marketplace vendor economics.
Error rates, stability, and repeatability
Performance is not only speed. For quantum workflows, stability and repeatability are part of the performance envelope because noisy hardware can make an “optimized” circuit unusable in practice. A good profiling routine records variance across repeated runs, compares simulator versus hardware deltas, and flags results that are too sensitive to backend drift or job order. If your workflow changes dramatically between morning and afternoon runs, you may be looking at calibration drift rather than code inefficiency.
This is where a disciplined benchmark harness matters. You should store seeds, backend metadata, circuit versions, transpiler settings, and classical environment details with every run. Without that discipline, tuning is guesswork. Teams that need a broader operational template can borrow habits from executive-ready reporting and product-roadmap governance, where traceability is essential for confidence and review.
2. Building a Profiling Stack for Quantum Developer Tools
Instrumentation at the SDK level
The easiest way to begin profiling quantum apps is to instrument the SDK layer where circuits are assembled and jobs are submitted. In Python-based stacks, that can mean timing circuit generation, tagging parameter sweeps, logging transpilation passes, and wrapping backend calls with structured logs. If the SDK exposes hooks or callbacks, use them to emit timestamps and metadata per stage. The goal is to make each run explainable after the fact, especially when a benchmark regresses unexpectedly.
Good instrumentation also helps you separate application logic from quantum runtime delays. For example, if a single call combines circuit build time, transpilation, queue wait, and result parsing, you cannot tell which phase is causing latency inflation. By splitting the stages, you can identify whether the bottleneck is in your code, your transpiler settings, or the backend service. This principle is similar to debugging distributed customer flows described in multi-layered recipient strategy design and troubleshooting remote-work disconnects.
Classical observability tools still matter
Hybrid quantum classical systems should be monitored using familiar observability tools: logs, metrics, traces, and correlation IDs. The quantum component may be exotic, but the orchestration is still software, which means you can use the same debugging instincts you already know from microservices or data pipelines. Trace a user request from API edge through parameter generation, circuit compile, job submission, result fetch, and downstream aggregation. When possible, export timings to a dashboard so you can compare runs over time and detect regressions after SDK upgrades.
One practical pattern is to define a “hybrid trace” record that includes classical service latency, backend job identifier, circuit signature, and performance counters such as transpilation depth or number of queued jobs. This lets you compare simulated and hardware-backed runs without rebuilding your observability stack every time. It also makes it easier to communicate bottlenecks to stakeholders who are not quantum specialists. For teams thinking about system-wide telemetry, a useful adjacent read is fleet telemetry concepts for remote monitoring, which illustrates the value of structured operational data.
Benchmark harnesses and reproducible experiments
A profiling effort is only useful if it is reproducible. Build a harness that fixes seed values, backend configuration, optimizer settings, and input sizes so you can compare apples to apples. Run your benchmark suite against both simulator and hardware, then record median, tail latency, memory usage, and output fidelity. If your benchmark suite includes parameterized circuits, test multiple points in the search space instead of only the default configuration, because some optimizers behave well on one topology and poorly on another.
For teams balancing rapid prototyping with governance, this is similar to the discipline outlined in embed governance into roadmaps and scaling AI with trust, roles, and metrics. The lesson is simple: you do not improve what you cannot reproduce, and you do not trust what you cannot compare.
3. Latency Profiling: Finding Where Time Actually Goes
Break the workflow into measurable stages
Latency profiling starts with decomposition. Measure the time spent in circuit construction, transpilation, submission, queueing, hardware execution, result fetch, and classical post-processing separately. Once those stages are visible, you can identify whether the dominant cost is in your local code or the remote backend. That distinction matters because the first is under your control, while the second may require workload redesign or backend selection.
In many hybrid apps, queueing and network overhead dominate the user experience more than the circuit itself. That means optimization sometimes means reducing job count or batching requests, not just reducing gate depth. For example, if a workflow submits hundreds of tiny jobs, the API overhead can overwhelm the actual quantum computation. This is the same sort of system-level thinking used when comparing service paths in cost optimization for airline products or building a high-converting deals hub.
Use p95 and p99, not just averages
Averages hide the behavior that users feel. In hybrid quantum workflows, a few slow backend jobs can dramatically affect trust and usability, especially in demos or POCs where stakeholders are watching the clock. Track p50, p95, and p99 latency per stage, and compare those values before and after each optimization. If the mean improves but the tail gets worse, you may have created a brittle system that only looks faster in the aggregate.
Tail latency often exposes backend contention, calibration churn, or orchestration retries. For example, batching may improve throughput but increase wait time for the first item in the batch. Likewise, aggressive parallelization can produce resource contention on the classical host. Mature teams treat latency as a distribution, not a single number, and they validate changes against business-relevant SLAs rather than best-case benchmarks.
Separate user think time from system time
Some hybrid applications include human-in-the-loop steps, such as parameter selection, run approval, or result inspection. These steps should be excluded from system latency metrics while still being measured for workflow productivity. Otherwise, you may accidentally attribute operator delay to the runtime stack and misdiagnose the actual bottleneck. This matters when you are comparing interactive notebooks, API-driven services, or CI-driven workloads.
If your use case is a demo or internal prototyping flow, measure both “system response time” and “time to insight.” That second metric is often the one stakeholders care about most. It is also where tool choice matters, because some quantum developer tools make iteration easy while others improve raw execution but slow the experimental loop. Teams designing productive workflows can borrow ideas from personalized learning systems and data publishing workflows, both of which depend on responsive feedback loops.
4. Resource Usage Analysis: Classical and Quantum Sides Together
Classical compute and memory
Many profiling initiatives fail because they ignore the classical overhead surrounding the quantum call. Parameter generation, ansatz construction, tensor reshaping, matrix operations, and optimization loops may consume more CPU and RAM than the quantum runtime itself. If your workflow uses simulators, memory pressure can spike quickly because statevector simulators scale exponentially with qubit count. Even modest circuits can become expensive if you retain intermediate arrays or run many parallel instances.
To manage this, capture process memory peaks, garbage collection pauses, thread counts, and serialization overhead. If a function unexpectedly allocates large objects on every iteration, the classical system may become the real bottleneck even if the circuit is efficient. This is the kind of hidden drag that teams often discover only after they add proper instrumentation. For a parallel mindset, read about home-office optimization and lightweight workflow tooling, where avoiding waste improves the entire system.
Quantum resource metrics
On the quantum side, the key resource metrics are gate count, two-qubit gate count, circuit depth, number of measurement operations, shot count, and transpilation cost. Two-qubit gates are especially important because they typically contribute more error than single-qubit operations on noisy hardware. Circuit depth affects not only runtime but also decoherence risk, which means deeper circuits may lose fidelity even if they are syntactically valid. If you are using variational algorithms, include optimizer iterations and callback frequency as part of the resource profile.
Resource optimization should be guided by the hardware target, not by abstract elegance. A beautiful circuit diagram is not necessarily a performant workload on real devices. Map logical qubits to physical topology, reduce swap overhead, and prefer hardware-native gate sets where possible. If you are choosing between competing backend options, compare their performance characteristics just as you would compare refurbished versus new device procurement decisions or .
Job submission and orchestration overhead
Hybrid apps often spend too much time on orchestration around the QPU. Queue management, retry logic, serialization, batching, and polling can all become significant when jobs are small and frequent. If your workflow submits one quantum job per data point, you may be spending more time managing jobs than solving the problem. Reducing submission frequency, batching compatible workloads, and using asynchronous polling are often the first meaningful performance wins.
This is also where cloud cost awareness matters. The orchestration layer can quietly inflate spend by creating unnecessary API calls or resource contention. That is why engineering teams should profile resource usage the same way finance teams profile recurring operational cost. For adjacent thinking on hidden spend and operational tradeoffs, see the hidden costs of AI in cloud services and marketplace vendor trends.
5. Optimization Techniques for Quantum Circuits
Reduce depth without changing the algorithmic intent
The most effective circuit optimizations preserve mathematical intent while lowering physical cost. Common tactics include gate cancellation, commutation-aware reordering, merging consecutive single-qubit rotations, and using hardware-native decompositions. If your circuit is parameterized, symbolically simplify expressions before transpilation so you do not force the compiler to handle unnecessary complexity. These changes are especially impactful for variational circuits that run many times inside an outer classical loop.
Be careful not to optimize in ways that increase noise sensitivity. For example, a smaller circuit that concentrates entangling operations into a few dense regions may be worse than a slightly longer circuit distributed more evenly across the device topology. Profiling should therefore measure both depth and fidelity, not just one metric in isolation. The best optimization techniques improve the success rate of the workload, not merely the gate count.
Use layout-aware transpilation and topology matching
Topology mismatch is one of the biggest hidden bottlenecks in quantum execution. If your logical qubit interactions do not match the device coupling map, the transpiler inserts swap networks that inflate depth and error. Choose initial layouts that minimize routing overhead, and compare multiple transpilation strategies across your benchmark suite. On some backends, a more careful initial placement produces large latency and fidelity improvements even without any algorithmic change.
When building a performance tuning workflow, it helps to treat transpilation settings as parameters that deserve A/B testing. Record which layout, optimization level, and pass manager configuration produced each result. Then compare them under identical input conditions. This is the quantum equivalent of tuning a distributed system by adjusting shard placement, cache locality, or batch sizes, as seen in telemetry-driven operations and multi-layered delivery strategy planning.
Reduce shot counts intelligently
Shot count is expensive, but reducing it blindly can undermine statistical confidence. The right approach is to choose shot counts based on the estimator you are using and the uncertainty you can tolerate. For algorithms with clear convergence behavior, adaptive shot scheduling can reduce spend by increasing shots only when the parameter search approaches a promising region. For noisy or unstable circuits, running too few shots can create misleading gradients and slow convergence more than it saves runtime.
Pro Tip: Optimize shot policy together with optimizer choice. A better optimizer with fewer shots can outperform a poor optimizer with more measurements, especially in variational workflows where each extra shot multiplies orchestration overhead.
6. Optimization Techniques for Classical Orchestration
Batch work and minimize round trips
Classical orchestration often becomes the dominant bottleneck when jobs are small, numerous, or repeatedly retried. You can usually improve performance by batching parameter sets, reducing submit/poll cycles, and caching shared preparation work. If your application runs inside a loop, check whether each iteration truly requires a new backend call or whether some results can be reused. Every unnecessary round trip adds latency, consumes API quota, and complicates observability.
In practice, a well-designed orchestration layer behaves more like a queueing system than a naive for-loop. It gathers compatible work, submits it in efficient groups, and handles completion asynchronously. This approach can cut wall-clock time even when the quantum backend runtime remains unchanged. For a broader analogy, see time-limited deal tactics and bundle optimization logic, where grouping improves outcomes.
Use async patterns and avoid blocking calls
Hybrid pipelines should rarely block synchronously while waiting for each quantum job to finish. Instead, use asynchronous submission, event-driven callbacks, or polling strategies that free the host application to continue useful work. This is especially important when the orchestration layer also performs preprocessing, result aggregation, or multi-job coordination. Blocking behavior not only increases latency but can also waste CPU time and make debugging harder.
If your runtime environment supports concurrency, separate compute-heavy preprocessing from I/O-heavy job management. That way the host can keep preparing the next circuit while the current job is in flight. The result is better hardware utilization and smoother throughput. This kind of concurrency discipline is as valuable here as in remote collaboration tools or data delivery systems.
Cache what is deterministic
Many hybrid workflows rebuild the same objects repeatedly: ansatz templates, compiled circuit fragments, feature encodings, or classical preprocessing artifacts. If something is deterministic and reusable, cache it. This can reduce CPU load, lower memory churn, and shrink end-to-end latency without changing the model or the physics. Caching is particularly valuable in POC environments where the same experiment is rerun frequently with only small parameter changes.
Be deliberate about cache invalidation, because stale compiled artifacts can quietly produce misleading results. Tie cache keys to circuit structure, backend target, optimization settings, and library version. If any of those changes, rebuild. Strong cache hygiene is part of trustworthy performance tuning, just as provenance matters in contract provenance workflows and governed product delivery.
7. A Practical Performance Tuning Workflow
Step 1: Establish a baseline
Start by measuring the current system in a controlled environment. Capture end-to-end latency, per-stage timing, job submission counts, circuit depth, shot counts, memory peaks, and fidelity metrics on both simulator and hardware. Use a fixed backend configuration and record the metadata that could influence results. Without a stable baseline, you cannot tell whether a change helps or hurts.
A good baseline also includes business context. What is the application optimizing for: fast demo turnaround, lower cloud spend, higher success probability, or better fidelity? Different goals lead to different tradeoffs, so the baseline should reflect the primary optimization objective. This is the same discipline used in market and financing analysis and enterprise AI operating models.
Step 2: Isolate bottlenecks one layer at a time
Once baseline numbers are available, isolate the bottleneck layer rather than changing everything at once. First look at classical preprocessing, then orchestration, then transpilation, then backend queueing, and finally measurement/post-processing. This ordered approach prevents false conclusions because you can see which change moved the needle. A latency gain from caching, for example, is very different from a gain caused by lower queue pressure.
In debugging sessions, use one-variable-at-a-time experiments whenever possible. If you change the optimizer, transpiler settings, and batch size simultaneously, you will not know which change produced the improvement. Teams that work this way converge faster and produce more reliable internal documentation. It is the same logic behind systematic product improvement in multi-layered strategy planning.
Step 3: Validate against the right metric
Not every performance improvement is meaningful. A faster circuit that fails more often is not an improvement. A lower-latency workflow that consumes far more shots may also be a poor tradeoff. The validation step should compare optimized and baseline runs across several metrics: time, cost, stability, and output quality. Only then can you decide whether the change belongs in production or stays as an experiment.
This is especially important in hybrid quantum classical environments where the execution surface is noisy and the classical logic can disguise regressions. If an improvement only appears on one backend or one day, treat it as a candidate rather than a conclusion. Keep your results reproducible, and annotate the conditions under which the optimization is valid.
8. Comparison Table: Profiling Methods and When to Use Them
| Method | Best For | Measures | Strength | Limitation |
|---|---|---|---|---|
| SDK-level timing hooks | Early-stage development | Circuit build, compile, submit, fetch times | Quick to implement and highly actionable | Misses lower-level backend internals |
| Structured logs + trace IDs | End-to-end debugging | Request flow across services and jobs | Excellent for correlation and root cause analysis | Requires good log hygiene and schema discipline |
| Benchmark harnesses | Regression testing and tuning | Latency, fidelity, depth, shot count, memory | Reproducible and comparable across versions | Can be time-consuming to maintain |
| Backend metadata analysis | Hardware runs | Queue time, calibration state, backend load | Exposes system conditions affecting performance | Availability varies by provider |
| Classical profiler tools | Host-side optimization | CPU, memory, I/O, thread contention | Finds hidden orchestration bottlenecks | Does not directly explain quantum fidelity issues |
| Simulator-vs-hardware comparison | Algorithm validation | Noise sensitivity and output drift | Highlights physical execution gaps | Simulator results can overestimate real-world performance |
9. Governance, Benchmarks, and Team Practices
Document every optimization decision
Performance tuning is easiest to trust when the changes are documented. Record what was changed, why it was changed, what metric improved, and under what test conditions. This helps prevent “optimization folklore,” where the team remembers that something was faster but not why. For hybrid workloads, this documentation is especially valuable because the system spans multiple layers and teams.
Strong documentation also makes it easier to onboard new developers and explain choices to stakeholders. A teammate should be able to read the benchmark log and understand why a particular transpilation strategy or batching policy was selected. That kind of clarity is in line with the governance-first approach described in product governance guidance and trust-centered scaling frameworks.
Use benchmark suites as shared language
Benchmark suites create a shared language for engineering, leadership, and procurement. When everyone agrees on the test matrix, you can compare SDKs, backends, and optimization settings without debating anecdotal impressions. Include a mix of small circuits, medium circuits, parameterized workflows, and real application traces. That way you know whether a change only helps toy cases or actually improves your production-shaped workloads.
For broader organizational alignment, benchmark design can borrow from evaluation strategies used in other technical domains, where repeatability and transparent criteria are essential. A disciplined benchmarking culture also helps with budgeting and cloud forecasting because it links technical choices to measurable resource outcomes. If you need examples of structured evaluation, consider the approach discussed in executive reporting and market analysis for vendors.
Align tooling with team maturity
Not every team needs the most advanced observability stack on day one. Early teams may get the most value from simple timing wrappers, reproducible notebooks, and a basic comparison table. More mature teams can add distributed tracing, automated regression tests, and backend-aware optimization pipelines. The right choice depends on team maturity, use-case criticality, and the cost of a bad result.
As you scale, it helps to invest in skills and process maturity together. Tooling without understanding creates false confidence, while expertise without tooling creates slow progress. If you are assessing organizational readiness, our guide on quantum talent gaps and skill-building is a strong companion piece.
10. FAQ: Profiling and Optimizing Hybrid Quantum–Classical Applications
What is the most important metric to track first?
Start with end-to-end latency and break it into stages. That gives you the fastest route to identifying whether the problem is in classical preprocessing, submission overhead, queueing, or quantum execution. Once you have stage timing, you can add resource and fidelity metrics.
Should I optimize circuit depth before orchestration overhead?
Not always. If orchestration dominates wall-clock time, reducing circuit depth may have little user-visible impact. Profile first, then optimize the layer that actually consumes the most time or cost.
How do I compare simulator and hardware results fairly?
Use the same seeds, input data, circuit version, and transpiler settings. Record backend metadata and compare multiple runs, not just one. Hardware noise and queueing can create misleading one-off results.
Can classical profiling tools help with quantum applications?
Yes. Classical profilers are essential for catching memory spikes, CPU contention, serialization overhead, and blocking I/O in the orchestration layer. Many hybrid bottlenecks live outside the quantum circuit itself.
What is the best way to reduce shot cost without hurting results?
Use adaptive shot policies, choose better optimizers, and run convergence-based experiments. Lowering shots blindly can worsen accuracy and increase the number of iterations needed to reach a good solution.
How often should benchmarks be rerun?
Rerun them whenever you change SDK versions, transpiler settings, backend targets, circuit structure, or orchestration code. You should also rerun after major backend calibration changes or significant infrastructure updates.
11. Putting It All Together: A Repeatable Performance Playbook
Adopt the “measure, isolate, optimize, validate” loop
The simplest effective hybrid performance playbook is a four-step loop: measure the baseline, isolate the bottleneck, optimize one layer, and validate against the right metrics. This process keeps engineering from guessing and makes results credible to both developers and decision-makers. It also ensures that improvements are repeatable rather than accidental. The discipline is useful whether you are tuning a small demo or preparing a more serious internal prototype.
Over time, this loop becomes part of team culture. New developers learn where to look when latency grows, how to interpret backend load, and how to distinguish a meaningful win from noise. That is the kind of practical maturity that makes hybrid quantum classical work sustainable. For adjacent thinking on reliable workflows and operational readiness, see portable tech operations and productivity-enhancing portable setup strategies.
Choose tools that match the bottleneck
If the bottleneck is visibility, choose instrumentation and tracing tools. If the bottleneck is circuit complexity, focus on transpilation and topology-aware optimizers. If the bottleneck is orchestration, invest in batching, async patterns, and caching. There is no universal tool that solves all hybrid performance problems, so the best quantum developer tools are the ones that map directly to the layer you need to fix.
That practical mindset is what separates serious prototyping from toy experimentation. Teams that understand their bottlenecks can justify investments, forecast costs, and improve the odds of getting something useful from a quantum workflow. In a field where hype is common, precise measurement is a strategic advantage.
Make optimization a reusable capability
Finally, treat profiling as a living capability, not a one-time audit. Add performance checks to your CI pipeline, keep benchmark suites under version control, and update dashboards when backend or SDK behavior changes. Over time, this creates a reusable body of knowledge that helps your team move faster with less risk. The goal is not to produce the fastest possible quantum experiment in isolation, but to build a workflow that is observably efficient, explainable, and ready for iteration.
When you do that well, performance tuning stops being a scramble and becomes a standard part of your engineering practice. That is the path from experimentation to dependable hybrid application development, and it is the difference between a flashy demo and a credible platform.
Related Reading
- Enterprise Blueprint: Scaling AI with Trust — Roles, Metrics and Repeatable Processes - A useful model for building disciplined measurement and governance into advanced technical workflows.
- The Hidden Costs of AI in Cloud Services: An Analysis - Helps you think about the operational cost side of performance tuning.
- Startup Playbook: Embed Governance into Product Roadmaps to Win Trust and Capital - Practical advice for keeping optimization work auditable and decision-friendly.
- Troubleshooting Common Disconnects in Remote Work Tools - A strong analogy for diagnosing latency, retries, and fragile integrations.
- Creating Multi-Layered Recipient Strategies with Real-World Data Insights - Useful for understanding how multi-stage workflows benefit from structured telemetry.
Related Topics
Ethan Mercer
Senior Quantum Content Strategist
Senior editor and content strategist. Writing about technology, design, and the future of digital media. Follow along for deep dives into the industry's moving parts.
Up Next
More stories handpicked for you
Design Patterns for Quantum Algorithms: Decomposition, Reuse, and Composition
Cost-Aware Quantum Experimentation: Managing Cloud Credits and Job Economics
AI and Quantum: Enhancing Data Analytics for Business Intelligence
Qubit Error Mitigation: Practical Techniques and Sample Workflows
Local Quantum Simulation at Scale: Tools and Techniques for Devs and IT Admins
From Our Network
Trending stories across our publication group