You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- replace core runtime stdout output with stdlib logging under the junjo logger hierarchy
- keep library import silent by installing only a NullHandler at the package root
- log propagated execution failures once at the owning workflow/subflow boundary instead of duplicating nested stack traces
- add run-scoped correlation fields to runtime log records for workflow, node, and concurrent execution paths
- enrich exporter flush/shutdown warnings with endpoint context for operational diagnosis
- update the base example and OpenTelemetry docs to teach app-owned logging configuration
- add regression tests for NullHandler setup, no direct runtime stdout, structured log correlation, and exporter warning logs
Copy file name to clipboardExpand all lines: CHANGELOG.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -63,6 +63,9 @@ execution, state management, and lifecycle observation.
63
63
- Workflow telemetry now records `junjo.workflow.execution_graph_snapshot` to make it explicit that the graph payload is an execution-scoped compiled snapshot containing both runtime and structural identities.
64
64
- Failed workflow, subflow, node, and concurrent spans now set the standard OpenTelemetry `error.type` attribute in addition to Junjo-specific error metadata.
65
65
-`JunjoOtelExporter` now exposes `shutdown()`, and the docs/examples now teach provider shutdown as the normal OpenTelemetry lifecycle while keeping `flush()` as a targeted manual drain tool.
66
+
- Core library execution paths now use the standard Python logging system under the `junjo` logger hierarchy instead of writing directly to stdout, and the library root now installs only a `NullHandler`.
67
+
-`JunjoOtelExporter.flush()` and `shutdown()` now log warning details through `junjo.telemetry` when Junjo-owned export components fail or refuse to flush cleanly.
68
+
- Runtime log records now include run-scoped correlation fields such as `run_id`, and propagated execution failures are logged once at the owning workflow or subflow boundary instead of emitting duplicate stack traces from nested execution layers.
66
69
-`on_state_changed` hook payloads and state-change telemetry context now identify the active executable that performed the mutation, rather than mixing workflow metadata with node or subflow runtime identities.
67
70
- Hook callback failures are now recorded as `junjo.hook_error` events on the surrounding workflow, subflow, node, or concurrent span, and terminal hooks now dispatch before span close so those events stay attached to the real execution span.
68
71
- Lifecycle observation examples and docs now show hook registration as a separate concern from workflow definition.
- Hook callback failure telemetry attached to the surrounding execution span instead of standalone hook-error spans
24
27
- Public docstring, docs, and example alignment for the hardened runtime model
28
+
- Changelog and agent guidance cleanup for the current hardening work
25
29
26
30
### Partially Complete
27
31
28
32
- Regression coverage for major known runtime/store failures
29
-
- Documentation and example truthfulness
30
-
- Changelog and agent guidance cleanup
33
+
- Observability operational safety
31
34
32
35
### Still Open
33
36
34
-
- Production-safe observability controls
35
37
- Release/process discipline improvements
36
38
37
39
## Completed Work
@@ -72,17 +74,20 @@ Delivered:
72
74
- Runtime execution, internal lifecycle dispatch, public hooks, and telemetry are separated.
73
75
- Hook failures are isolated and recorded without failing workflow execution.
74
76
- State change hooks now receive detached state snapshots and JSON patch payloads.
77
+
- Hook callback failures are now recorded on the surrounding execution span instead of being modeled as standalone hook-error spans.
78
+
- Terminal hooks now dispatch before span close so hook failure telemetry stays attached to the real workflow, subflow, node, or concurrent span.
75
79
76
80
### 4. Docs And Example Truthfulness
77
81
78
-
Status: largely completed
82
+
Status: completed
79
83
80
84
Delivered:
81
85
82
86
- Public runtime docstrings were updated instead of being shortened away.
83
87
-`Workflow` and `Subflow` constructor docs remain on `__init__` for generated docs and hover help.
84
88
- Examples now separate workflow definition from hook/logging wiring.
85
89
- Hook documentation and examples now show real usage rather than placeholder configuration.
90
+
- OpenTelemetry docs now describe provider-owned shutdown and state-model-controlled telemetry serialization truthfully.
86
91
87
92
### 5. Graph Hardening
88
93
@@ -116,36 +121,43 @@ Delivered:
116
121
117
122
## Phase B - Observability Operational Safety
118
123
124
+
Status: partially complete
125
+
126
+
### Delivered so far
127
+
128
+
- Failed workflow, subflow, node, and concurrent spans now set standard OpenTelemetry `error.type`.
129
+
-`JunjoOtelExporter` now exposes `shutdown()`, and docs/examples now teach provider shutdown as the normal lifecycle instead of exporter-local flush on exit.
130
+
- Hook callback failures now stay attached to the surrounding execution span rather than creating standalone hook-error spans.
131
+
- State telemetry docs now explain the current control point clearly:
132
+
state snapshots and JSON patches follow the state model's Pydantic serialization.
133
+
- Core runtime execution paths now emit through package logging instead of direct `print()`.
134
+
- Junjo now uses the standard Python `logging` package under the `junjo` logger hierarchy and installs only a `NullHandler` at the library root.
135
+
- Exporter-local `flush()` and `shutdown()` failures now log through `junjo.telemetry` instead of failing silently.
136
+
- Runtime log records now carry run-scoped correlation fields, and propagated failures now log once at the owning workflow or subflow boundary instead of duplicating nested stack traces.
137
+
119
138
### Why this is still open
120
139
121
-
Telemetry correctness improved, but operational controls are still missing.
122
-
Core runtime paths still use `print()` and there is no real telemetry
123
-
configuration model for redaction, payload size, or capture profiles.
140
+
Telemetry correctness improved, but the library still has no explicit
141
+
library-level telemetry capture policy for redaction, payload size ceilings, or
142
+
different observability profiles.
124
143
125
144
### Remaining changes
126
145
127
-
- Replace direct runtime `print()` calls with package logging.
128
-
- Remove stdout emission from shipped library execution paths, currently including:
-Decide later whether point-in-time lifecycle telemetry should stay span/event-first or move toward correlated logs; current instrumentation remains span/event-first intentionally.
155
+
- Consider versioning Junjo-specific telemetry schema fields once the capture model stabilizes.
143
156
144
157
### Exit criteria
145
158
146
-
- Core runtime emits through logging instead of `print()`.
147
-
- Telemetry payload controls are configurable and documented.
148
-
- Exporter lifecycle and failure behavior are explicit.
159
+
- The repo has a clear documented stance on telemetry payload controls, whether that remains state-model serialization only or expands into explicit capture configuration.
160
+
- Exporter lifecycle and failure behavior remain explicit and accurate in docs/examples.
149
161
150
162
## Phase C - Quality Gates And Release Discipline
151
163
@@ -195,4 +207,5 @@ The highest-risk runtime correctness work is already done. The remaining work is
195
207
primarily about:
196
208
197
209
- making observability production-safe
210
+
- deciding how much explicit telemetry capture policy Junjo should own as a library
198
211
- making release quality enforceable by process instead of memory
0 commit comments