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
|**3**|**Project**| A named workload like Zixia, Thoth, ReMic. In PreAngel: maps 1:1 to an Azure (subscription). In Ship.Fail: implemented as a family of Resource Groups inside a shared lab Azure (subscription). | Azure subscription (PreAngel) / Resource Group family in a shared Azure subscription (Ship.Fail) |
129
127
|**4**|**Resource Group**| A logical container for a specific Stage (`dev`/`prod`) and Component (`web`/`api`). | Resource group |
130
128
|**5**|**Resource**| The actual thing: VM, DB, storage account, function, key vault, etc. | Resource |
131
129
132
-
**The Golden Rule:** After this table, I almost never say "subscription" out loud. I speak in **Portfolios** and **Projects**, and only mention Azure terms in parentheses when I really need to.
130
+
**The Golden Rule:** After this table, I almost never say "subscription" out loud. I speak in **Umbrellas** and **Projects**, and only mention Azure terms in parentheses when I really need to.
133
131
134
132
### Stage Is Virtual (But Critical)
135
133
@@ -146,16 +144,16 @@ Here’s the twist that makes everything click:
146
144
147
145
The **Unified Tree** is always the same in my head:
148
146
149
-
> Company → Portfolio → Project → Resource Group (Stage + Component) → Resource
147
+
> Company → Umbrella → Project → Resource Group (Stage + Component) → Resource
150
148
151
-
But it is **implemented differently** for my two main portfolios:
149
+
But it is **implemented differently** for my two main umbrellas:
152
150
153
-
***PreAngel (Production Portfolio)**
151
+
***PreAngel (Production Umbrella)**
154
152
155
153
***Project = Azure (subscription).**
156
154
* Each serious product (like Zixia) gets its own Project at the subscription level.
157
155
* Inside that, I create Resource Groups for `dev` and `prod` plus components (`web`, `api`, `data`, ...).
158
-
***Ship.Fail (Experiment Portfolio)**
156
+
***Ship.Fail (Experiment Umbrella)**
159
157
160
158
* Everything is **leveled down by one notch** to keep life simple.
@@ -165,13 +163,13 @@ You can visualize it like this:
165
163
166
164
```text
167
165
Production
168
-
Company → Portfolio (PreAngel) → Project → Resource Group (w/Stage) → Resource
166
+
Company → Umbrella (PreAngel) → Project → Resource Group (w/Stage) → Resource
169
167
^
170
168
|
171
169
Azure (subscription)
172
170
173
171
Lab: Hackathon Ideas / MVPs
174
-
Company → Portfolio (ShipFail) → [Project → Resource Group (w/Stage)] → Resource
172
+
Company → Umbrella (ShipFail) → [Project → Resource Group (w/Stage)] → Resource
175
173
^
176
174
|
177
175
Azure (subscription)
@@ -190,7 +188,7 @@ When a Ship.Fail project becomes a “real” product:
190
188
* When it “graduates” to PreAngel, I **move it up one layer**:
191
189
192
190
* I create a new production Project at the subscription layer (e.g., `prj-preangel-remic` as an Azure subscription name), and
193
-
* I recreate its Resource Groups following the same pattern but under the PreAngel portfolio (e.g., `rg-preangel-remic-dev-web`, `rg-preangel-remic-prod-web`).
191
+
* I recreate its Resource Groups following the same pattern but under the PreAngel umbrella (e.g., `rg-preangel-remic-dev-web`, `rg-preangel-remic-prod-web`).
194
192
195
193
The names barely change—mostly `shipfail` → `preangel`—but the Project moves from “lab” mode to “production” mode.
196
194
@@ -349,7 +347,7 @@ Here is what my cloud looks like in the Ship.Fail lab subscription:
@@ -366,7 +364,7 @@ All of these live inside the same Ship.Fail lab Azure (subscription), reuse the
366
364
367
365
Future-me can open any of those names in the cloud console and instantly know:
368
366
369
-
1.**Portfolio:** It's a Ship.Fail experiment.
367
+
1.**Umbrella:** It's a Ship.Fail experiment.
370
368
2.**Project:** It's for ReMic.
371
369
3.**Stage:** It's `dev` (continuous deployment) or `prod` (hand-picked versions).
372
370
4.**Component:** It's the `web` or `api` layer.
@@ -377,14 +375,14 @@ Now suppose ReMic proves itself and deserves to become a serious product.
377
375
378
376
I don’t throw away the tree; I simply **move it up one level**:
379
377
380
-
* I create a new production Project under the PreAngel portfolio, implemented as its own Azure (subscription):
378
+
* I create a new production Project under the PreAngel umbrella, implemented as its own Azure (subscription):
381
379
382
380
*`prj-preangel-remic`
383
381
* Inside that subscription, I recreate the Resource Groups with the same pattern:
384
382
385
383
```text
386
384
Company: PreAngel LLC
387
-
└─ Portfolio: PreAngel
385
+
└─ Umbrella: PreAngel
388
386
└─ Project: prj-preangel-remic
389
387
├─ Resource Group: rg-preangel-remic-dev-web
390
388
├─ Resource Group: rg-preangel-remic-prod-web
@@ -401,15 +399,130 @@ The mental model is the same. The only changes are:
401
399
*`Portfolio` value: from `ShipFail` → `PreAngel`.
402
400
* Physical level where the Project lives: from Resource Group family inside a shared subscription → its own subscription.
403
401
402
+
*`Umbrella` value: from `ShipFail` → `PreAngel`.
403
+
* Physical level where the Project lives: from Resource Group family inside a shared subscription → its own subscription.
404
+
404
405
That’s how graduation works in this protocol.
405
406
407
+
---
408
+
409
+
## 4. The Naming Playbook: Rules for the Road
410
+
411
+
A naming convention is useless if you have to look it up every time. It needs to be intuitive. Here is the **Ship.Fail Protocol**.
412
+
413
+
### Rule #1: The Umbrella
414
+
415
+
I have exactly three Umbrellas (contexts). No more, no less.
416
+
417
+
*`umb-preangel` (Real products making money)
418
+
*`umb-shipfail` (Hackathons, MVPs, crazy ideas)
419
+
*`umb-tobemigrated` (The "Box of Shame" for old stuff)
420
+
421
+
### Rule #2: The Project
422
+
423
+
Projects are the atomic unit in my head. They are named explicitly:
424
+
425
+
```text
426
+
prj-<umbrella>-<project>
427
+
```
428
+
429
+
Examples:
430
+
431
+
*`prj-preangel-zixia`
432
+
*`prj-shipfail-thoth`
433
+
*`prj-shipfail-remic`
434
+
435
+
How this plays out in practice:
436
+
437
+
* In **PreAngel**, `prj-preangel-zixia` is both:
438
+
439
+
* the conceptual Project name, and
440
+
* the name I give to its dedicated Azure (subscription).
441
+
* In **Ship.Fail**, `prj-shipfail-remic` is still the conceptual Project name, but:
442
+
443
+
* all Ship.Fail Projects share a single lab Azure (subscription), and
444
+
* the Project is implemented as a **family of Resource Groups and tags** with the `shipfail-remic` pattern.
445
+
446
+
**Why this works:** When I see `prj-shipfail-thoth`, I know instantly: *This is an experiment (Ship.Fail) called Thoth.* Whether it currently lives as its own subscription (PreAngel style) or as Resource Groups inside the lab subscription (Ship.Fail style) is an implementation detail I can always look up—but the name and tags tell the story.
447
+
448
+
### Rule #3: The Resource Group (The Backbone)
449
+
450
+
This is where the magic happens. The Resource Group name encodes the entire lineage of the resource.
451
+
452
+
```text
453
+
rg-<umbrella>-<project>-<stage>-<component?>
454
+
```
455
+
456
+
Examples:
457
+
458
+
*`rg-shipfail-remic-dev-web`
459
+
*`rg-preangel-zixia-prod-data`
460
+
461
+
Under Ship.Fail, this is also how Projects show up structurally:
* All of them live inside the **same Ship.Fail lab subscription**, but their names and tags still encode Umbrella, Project, Stage, and Component.
465
+
466
+
**The "3-Second Rule":** If I can't tell you exactly what a Resource Group contains and who pays for it within 3 seconds of reading the name, **it is a bad name.**
467
+
468
+
### Rule #4: The Resource (Type-First)
469
+
470
+
I use type‑first naming. Start with the resource type abbreviation, then echo the hierarchy.
Now, when I want to know *"How much am I spending on all my `dev` stages combined?"*, it is a single filter away.
454
567
@@ -458,22 +571,22 @@ Now, when I want to know *"How much am I spending on all my `dev` stages combine
458
571
459
572
Ready to turn your graveyard into a machine? Here is the exact checklist I used. Steal it.
460
573
461
-
1.**Define Your Portfolios.**
574
+
1.**Define Your Umbrellas.**
462
575
Commit to 2–3 high-level contexts. (For me: `PreAngel`, `ShipFail`, `ToBeMigrated`.)
463
576
464
-
2.**Decide Implementation Per Portfolio.**
577
+
2.**Decide Implementation Per Umbrella.**
465
578
466
-
* For your “serious” portfolio (like PreAngel), let each Project be its own Azure (subscription).
467
-
* For your “lab” portfolio (like Ship.Fail), pick one shared lab Azure (subscription) and implement Projects as families of Resource Groups inside it.
579
+
* For your “serious” umbrella (like PreAngel), let each Project be its own Azure (subscription).
580
+
* For your “lab” umbrella (like Ship.Fail), pick one shared lab Azure (subscription) and implement Projects as families of Resource Groups inside it.
468
581
469
582
3.**Inventory Your Projects.**
470
-
List every Project you care about today and give it a clear name: `prj-<portfolio>-<project>`.
583
+
List every Project you care about today and give it a clear name: `prj-<umbrella>-<project>`.
471
584
472
585
4.**Create the Containers.**
473
586
For each Project:
474
587
475
-
* In PreAngel-style portfolios: create or rename the Azure (subscription) accordingly, then create Resource Groups using the `rg-...` pattern.
476
-
* In Ship.Fail-style portfolios: create Resource Groups directly in the lab subscription using the `rg-...` pattern.
588
+
* In PreAngel-style umbrellas: create or rename the Azure (subscription) accordingly, then create Resource Groups using the `rg-...` pattern.
589
+
* In Ship.Fail-style umbrellas: create Resource Groups directly in the lab subscription using the `rg-...` pattern.
477
590
478
591
5.**The Great Migration.**
479
592
Move resources into their new homes. If something doesn’t obviously belong to a Project and Stage, that’s a red flag.
@@ -482,7 +595,7 @@ Ready to turn your graveyard into a machine? Here is the exact checklist I used.
482
595
If you find a resource that doesn't fit into your new tree... **delete it.** If you can't name it, you don't need it.
483
596
484
597
7.**Tag Everything.**
485
-
No exceptions. Portfolio, Project, Stage, Component.
598
+
No exceptions. Umbrella, Project, Stage, Component.
486
599
487
600
If you only have 30 minutes, pick **one** Project (for me, it was ReMic), apply the naming + tags + VNet model just to that, and stop. Even that small slice of clarity feels shockingly good.
0 commit comments