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 +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +2 -1
- data/lib/deployangel/cli/formatter.rb +4 -1
- data/lib/deployangel/cli.rb +2 -1
- data/lib/deployangel/core/fingerprint.rb +10 -1
- data/lib/deployangel/mcp.rb +2 -1
- data/lib/deployangel/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7e0552271dfa638f21feb4c8591729a8c226df32dc75201a12a8e41843534f75
|
|
4
|
+
data.tar.gz: d62f917c014872a66458dab5e73de67b87b594b0e654b519388d193cd62d4965
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
|
data/lib/deployangel/cli.rb
CHANGED
|
@@ -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.
|
|
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
|
data/lib/deployangel/mcp.rb
CHANGED
|
@@ -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,
|
data/lib/deployangel/version.rb
CHANGED