deployangel 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc0a725bbc0873d53b333299c0c32268c446967c0b6a96ae75ccd1f2776e212b
4
- data.tar.gz: 50b6bac465113797a4071eaae246a654e10d58e2d635cd0ad65b7c23ad1aafb3
3
+ metadata.gz: 7e0552271dfa638f21feb4c8591729a8c226df32dc75201a12a8e41843534f75
4
+ data.tar.gz: d62f917c014872a66458dab5e73de67b87b594b0e654b519388d193cd62d4965
5
5
  SHA512:
6
- metadata.gz: 9f5fa19a8047154de5c567a974c2066209c00946b9bc070a400903f33c8c69f182242bdc8f226ddcf140ab07e5a96c7a947346c65d3d2e047986225bdc3ab857
7
- data.tar.gz: 17b73eb7db55b615df009cd4632bbf2f7833f5713096896d4a15505837acd3038ede32297eb5f8da40b1a72e6f140d38850db32bdece8d9d87d94ef6aa55c679
6
+ metadata.gz: 9e116aca53991800ed66a98f288fad4706f51baf45b174678156cfcd51202bac16e7d151ef5c323ad97d14f6ca774bf2092f034ef2764fd2106d530f2a48c0ec
7
+ data.tar.gz: 2f31abc979d9de0d0fac5da35d975025240144df25bc82693c25c5ca271ecb206032437cbfbca61571a78a70559f40b5083e423d98d94f1a35290968fa5b01bd
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.34 (2026-11-01)
4
+
5
+ - `deployangel verify` prints a failed release's next steps: the last
6
+ cleared release a rollback would go to, with the migrations it would
7
+ cross, and where to look first. They come from the verdict document's new
8
+ `next_steps` field, so servers before 2026-11-01 show none. The coding
9
+ agent instructions mention them, and still say to ask before rolling back.
10
+
11
+ ## 0.1.33 (2026-10-28)
12
+
13
+ - An exception whose message has bytes that aren't valid UTF-8, as a
14
+ message can when it quotes a malformed request, is now recorded. The bad
15
+ bytes become U+FFFD. Before, the agent dropped the exception with a
16
+ warning (`Encoding::CompatibilityError`), though the request's 500 still
17
+ counted.
18
+
3
19
  ## 0.1.32 (2026-10-21)
4
20
 
5
21
  - `deployangel mcp` starts without an API token. Each tool then answers with
data/README.md CHANGED
@@ -629,7 +629,8 @@ verdict: call the `wait_for_verification` MCP tool with the commit and
629
629
  The release is NOT cleared.
630
630
  - Exit 2 / inconclusive: the release is NOT verified. Do not claim success.
631
631
  - Exit 1 / failed: read the findings and exceptions (`get_exception`),
632
- investigate the likely cause, and propose a fix. Do not roll back or change
632
+ investigate the likely cause, and propose a fix. `next_steps` names the last
633
+ cleared release a rollback would go to. Do not roll back or change
633
634
  production without explicit approval.
634
635
  - Exit 3: still verifying; run the command again.
635
636
  - Not cleared yet: call `get_exercise_plan` (or `bundle exec deployangel plan`).
@@ -110,7 +110,10 @@ module DeployAngel
110
110
  end ],
111
111
  [ "Changed but not yet exercised", changed.map { |item| item["key"] } ],
112
112
  [ "To clear sooner, exercise (deployangel plan for details)", exercisable_items(document).first(5) ],
113
- [ "Late regressions", Array(document["late_regressions"]).map { |late| late["summary"] } ]
113
+ [ "Late regressions", Array(document["late_regressions"]).map { |late| late["summary"] } ],
114
+ # A failed release's rollback target and where to look first
115
+ # (servers from 2026-11-01 send them).
116
+ [ "Next steps", Array(document["next_steps"]).map { |step| step["text"] } ]
114
117
  ].reject { |_, items| items.empty? }
115
118
  end
116
119
 
@@ -108,7 +108,8 @@ module DeployAngel
108
108
  The release is NOT cleared.
109
109
  - Exit 2 / inconclusive: the release is NOT verified. Do not claim success.
110
110
  - Exit 1 / failed: read the findings and exceptions (`get_exception`),
111
- investigate the likely cause, and propose a fix. Do not roll back or change
111
+ investigate the likely cause, and propose a fix. `next_steps` names the last
112
+ cleared release a rollback would go to. Do not roll back or change
112
113
  production without explicit approval.
113
114
  - Exit 3: still verifying; run the command again.
114
115
  - Not cleared yet: call `get_exercise_plan` (or `bundle exec deployangel plan`).
@@ -55,7 +55,7 @@ module DeployAngel
55
55
  # Only quoted values, numbers, emails, UUIDs, and long hex are replaced;
56
56
  # unquoted words, such as a name in a message the app builds, are kept.
57
57
  def normalize_message(message, redactions = [])
58
- text = message.to_s.lines.first.to_s.strip
58
+ text = utf8(message.to_s).lines.first.to_s.strip
59
59
  redactions.each do |value, placeholder|
60
60
  text = text.gsub(/(?<![[:alnum:]])#{Regexp.escape(value)}(?![[:alnum:]])/i, placeholder)
61
61
  end
@@ -63,6 +63,15 @@ module DeployAngel
63
63
  text[0, MAX_MESSAGE]
64
64
  end
65
65
 
66
+ # A message can carry bytes from a request (a header, a path, a body)
67
+ # that aren't valid UTF-8, which matching and the JSON payload both
68
+ # reject, and the exception would go unrecorded. Bad bytes become U+FFFD.
69
+ def utf8(text)
70
+ text = text.dup.force_encoding(Encoding::UTF_8) if text.encoding == Encoding::BINARY
71
+ text = text.encode(Encoding::UTF_8, invalid: :replace, undef: :replace) unless text.encoding == Encoding::UTF_8
72
+ text.scrub
73
+ end
74
+
66
75
  def app_frame?(frame)
67
76
  frame.start_with?("app/", "lib/", "config/")
68
77
  end
@@ -18,7 +18,8 @@ module DeployAngel
18
18
  DeployAngel verifies deployments in production. After deploying, call wait_for_verification
19
19
  with until "initial" (about 15 minutes) or "verdict". Verdicts: verified means cleared, so you may
20
20
  report the release as successful. inconclusive means NOT verified: never report it as success.
21
- failed means production regressed: read the findings and exceptions and investigate.
21
+ failed means production regressed: read the findings and exceptions and investigate. next_steps
22
+ names the last cleared release a rollback would go to and the migrations it would cross.
22
23
  Confidence medium clears a release just as high does (high also needs 80% coverage and a full
23
24
  baseline): never call a medium clearance weak. suspicious true means warnings DeployAngel is
24
25
  watching closely, not a failure: report them as "watching closely:" and the watching_closely items,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeployAngel
4
- VERSION = "0.1.32"
4
+ VERSION = "0.1.34"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deployangel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.32
4
+ version: 0.1.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordan Owens