@mriekki/project-forge 4.0.0 → 4.2.0
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.
- package/assets/components.json +3 -3
- package/assets/deployment/distribution.json +2 -0
- package/assets/generated/ASSEMBLY.json +25 -15
- package/assets/generated/core/core/instructions/project-forge-workflow.instructions.md +3 -1
- package/assets/generated/core/core/skills/project-forge-update/SKILL.md +3 -3
- package/assets/generated/core/core/skills/setup/SKILL.md +61 -0
- package/assets/generated/core/core/skills/upstream-fix/SKILL.md +137 -18
- package/assets/generated/deployment/docs/DEVELOPER_ENVIRONMENTS.md +52 -12
- package/assets/generated/deployment/docs/ENVIRONMENT_PROOF.md +82 -6
- package/assets/generated/deployment/src/project_forge_deployment/app_runtime_workstation.py +103 -42
- package/assets/generated/deployment/src/project_forge_deployment/environment_cli.py +41 -4
- package/assets/generated/deployment/src/project_forge_deployment/environment_probe.py +159 -79
- package/assets/generated/deployment/src/project_forge_deployment/environment_setup.py +323 -0
- package/assets/generated/deployment/src/project_forge_deployment/home_lab.py +22 -1
- package/assets/generated/deployment/src/project_forge_deployment/image_transfer.py +51 -11
- package/assets/generated/deployment/src/project_forge_deployment/proof_receipt.py +183 -0
- package/assets/generated/deployment/src/project_forge_deployment/ssh.py +277 -23
- package/package.json +1 -1
package/assets/components.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": "@mriekki/project-forge",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.2.0",
|
|
5
5
|
"defaultProfile": "greenfield-project",
|
|
6
6
|
"profiles": {
|
|
7
7
|
"greenfield-project": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"components": {
|
|
15
15
|
"core": {
|
|
16
16
|
"repository": "mriekki/project-forge-core",
|
|
17
|
-
"commit": "
|
|
17
|
+
"commit": "d84829629d151c85bbe4680bc2297abfdf3a3022",
|
|
18
18
|
"version": "4.0.0",
|
|
19
19
|
"distribution": "greenfield-workspace",
|
|
20
20
|
"descriptor": "assets/core/distribution.json",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"deployment": {
|
|
25
25
|
"repository": "mriekki/project-forge-deployment-kit",
|
|
26
|
-
"commit": "
|
|
26
|
+
"commit": "e974c227d9d0768e64605550709db89ccaf93434",
|
|
27
27
|
"distribution": "greenfield-project",
|
|
28
28
|
"descriptor": "assets/deployment/distribution.json",
|
|
29
29
|
"sourceRoot": "assets/generated/deployment",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
{"source": "src/project_forge_deployment/entrypoint.py", "destination": "tools/project-forge-deployment/project_forge_deployment/entrypoint.py"},
|
|
19
19
|
{"source": "src/project_forge_deployment/environment_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_cli.py"},
|
|
20
20
|
{"source": "src/project_forge_deployment/environment_probe.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_probe.py"},
|
|
21
|
+
{"source": "src/project_forge_deployment/environment_setup.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_setup.py"},
|
|
21
22
|
{"source": "src/project_forge_deployment/errors.py", "destination": "tools/project-forge-deployment/project_forge_deployment/errors.py"},
|
|
22
23
|
{"source": "src/project_forge_deployment/home_lab.py", "destination": "tools/project-forge-deployment/project_forge_deployment/home_lab.py"},
|
|
23
24
|
{"source": "src/project_forge_deployment/image_transfer.py", "destination": "tools/project-forge-deployment/project_forge_deployment/image_transfer.py"},
|
|
@@ -30,6 +31,7 @@
|
|
|
30
31
|
{"source": "src/project_forge_deployment/profile_migration.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_migration.py"},
|
|
31
32
|
{"source": "src/project_forge_deployment/profile_repository.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_repository.py"},
|
|
32
33
|
{"source": "src/project_forge_deployment/profiles.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profiles.py"},
|
|
34
|
+
{"source": "src/project_forge_deployment/proof_receipt.py", "destination": "tools/project-forge-deployment/project_forge_deployment/proof_receipt.py"},
|
|
33
35
|
{"source": "src/project_forge_deployment/registry_access.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_access.py"},
|
|
34
36
|
{"source": "src/project_forge_deployment/registry_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_cli.py"},
|
|
35
37
|
{"source": "src/project_forge_deployment/route_registry.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry.py"},
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": "@mriekki/project-forge",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.2.0",
|
|
5
5
|
"components": {
|
|
6
6
|
"core": {
|
|
7
7
|
"repository": "mriekki/project-forge-core",
|
|
8
|
-
"commit": "
|
|
8
|
+
"commit": "d84829629d151c85bbe4680bc2297abfdf3a3022",
|
|
9
9
|
"version": "4.0.0",
|
|
10
10
|
"distribution": "greenfield-workspace",
|
|
11
11
|
"files": [
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
{
|
|
23
23
|
"source": "core/instructions/project-forge-workflow.instructions.md",
|
|
24
24
|
"destination": ".github/instructions/project-forge-workflow.instructions.md",
|
|
25
|
-
"sha256": "
|
|
25
|
+
"sha256": "85568ba56681831e34c63aa14f91702522a451e8b2fa883da631d609440d7a7c"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"source": "core/instructions/project-forge-docs.instructions.md",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
{
|
|
53
53
|
"source": "core/skills/setup/SKILL.md",
|
|
54
54
|
"destination": ".github/skills/setup/SKILL.md",
|
|
55
|
-
"sha256": "
|
|
55
|
+
"sha256": "deb64d0e7ce3a7788e5674182c9788219f2422468ed3e0cc767d49ce569acaea"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"source": "core/skills/build/SKILL.md",
|
|
@@ -102,12 +102,12 @@
|
|
|
102
102
|
{
|
|
103
103
|
"source": "core/skills/project-forge-update/SKILL.md",
|
|
104
104
|
"destination": ".github/skills/project-forge-update/SKILL.md",
|
|
105
|
-
"sha256": "
|
|
105
|
+
"sha256": "510d60fab8d91e54abbc49dbc963a93b132ac5cdfd97ec87f64128ca138d2b1a"
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
"source": "core/skills/upstream-fix/SKILL.md",
|
|
109
109
|
"destination": ".github/skills/upstream-fix/SKILL.md",
|
|
110
|
-
"sha256": "
|
|
110
|
+
"sha256": "cec11a112840b37a5ff61e28281d26eb9490e9d7b05df99ae5fa152231316798"
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
113
|
"source": "core/skills/wait-what/SKILL.md",
|
|
@@ -328,7 +328,7 @@
|
|
|
328
328
|
},
|
|
329
329
|
"deployment": {
|
|
330
330
|
"repository": "mriekki/project-forge-deployment-kit",
|
|
331
|
-
"commit": "
|
|
331
|
+
"commit": "e974c227d9d0768e64605550709db89ccaf93434",
|
|
332
332
|
"distribution": "greenfield-project",
|
|
333
333
|
"files": [
|
|
334
334
|
{
|
|
@@ -364,7 +364,7 @@
|
|
|
364
364
|
{
|
|
365
365
|
"source": "src/project_forge_deployment/app_runtime_workstation.py",
|
|
366
366
|
"destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_workstation.py",
|
|
367
|
-
"sha256": "
|
|
367
|
+
"sha256": "17723294fffce40433343df5fd26817df037a8029d473acefa6b767a56c9f725"
|
|
368
368
|
},
|
|
369
369
|
{
|
|
370
370
|
"source": "src/project_forge_deployment/box_platform.py",
|
|
@@ -399,12 +399,17 @@
|
|
|
399
399
|
{
|
|
400
400
|
"source": "src/project_forge_deployment/environment_cli.py",
|
|
401
401
|
"destination": "tools/project-forge-deployment/project_forge_deployment/environment_cli.py",
|
|
402
|
-
"sha256": "
|
|
402
|
+
"sha256": "3c8a0c67c8b75fed7374d1b7b013f95392f84661b6ea182187d07a2b48f206ae"
|
|
403
403
|
},
|
|
404
404
|
{
|
|
405
405
|
"source": "src/project_forge_deployment/environment_probe.py",
|
|
406
406
|
"destination": "tools/project-forge-deployment/project_forge_deployment/environment_probe.py",
|
|
407
|
-
"sha256": "
|
|
407
|
+
"sha256": "4e9a49a7cf0427dcdef1e28f955297569ec8cd0ee9d071404ef876e3ce036313"
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"source": "src/project_forge_deployment/environment_setup.py",
|
|
411
|
+
"destination": "tools/project-forge-deployment/project_forge_deployment/environment_setup.py",
|
|
412
|
+
"sha256": "a79919da8655a6c42fded3224373f6381d15c8c68869b70c31d6edb7702fd348"
|
|
408
413
|
},
|
|
409
414
|
{
|
|
410
415
|
"source": "src/project_forge_deployment/errors.py",
|
|
@@ -414,12 +419,12 @@
|
|
|
414
419
|
{
|
|
415
420
|
"source": "src/project_forge_deployment/home_lab.py",
|
|
416
421
|
"destination": "tools/project-forge-deployment/project_forge_deployment/home_lab.py",
|
|
417
|
-
"sha256": "
|
|
422
|
+
"sha256": "481b22ee7983dbe39b9e727ad874356a5dc4d55a4d7380545f2577e4a9ea45e7"
|
|
418
423
|
},
|
|
419
424
|
{
|
|
420
425
|
"source": "src/project_forge_deployment/image_transfer.py",
|
|
421
426
|
"destination": "tools/project-forge-deployment/project_forge_deployment/image_transfer.py",
|
|
422
|
-
"sha256": "
|
|
427
|
+
"sha256": "dadd1fe7724372a4ca0e04ab2280769b6c2381f0f9ae75a096f6c5a5f5add755"
|
|
423
428
|
},
|
|
424
429
|
{
|
|
425
430
|
"source": "src/project_forge_deployment/keys.py",
|
|
@@ -466,6 +471,11 @@
|
|
|
466
471
|
"destination": "tools/project-forge-deployment/project_forge_deployment/profiles.py",
|
|
467
472
|
"sha256": "c8fb1c378af9d39d28f46b300064bec967e2a6f7a13e22d089fc00413c42fd9d"
|
|
468
473
|
},
|
|
474
|
+
{
|
|
475
|
+
"source": "src/project_forge_deployment/proof_receipt.py",
|
|
476
|
+
"destination": "tools/project-forge-deployment/project_forge_deployment/proof_receipt.py",
|
|
477
|
+
"sha256": "9b4bbb559747fc4ee3ba984a050fc6425e532527ae82f9897c73e04d8d0291b6"
|
|
478
|
+
},
|
|
469
479
|
{
|
|
470
480
|
"source": "src/project_forge_deployment/registry_access.py",
|
|
471
481
|
"destination": "tools/project-forge-deployment/project_forge_deployment/registry_access.py",
|
|
@@ -514,7 +524,7 @@
|
|
|
514
524
|
{
|
|
515
525
|
"source": "src/project_forge_deployment/ssh.py",
|
|
516
526
|
"destination": "tools/project-forge-deployment/project_forge_deployment/ssh.py",
|
|
517
|
-
"sha256": "
|
|
527
|
+
"sha256": "88d59b62f63dc6b7206b6074dd109af4ea7c8f022f506e67f7204f1f06240d26"
|
|
518
528
|
},
|
|
519
529
|
{
|
|
520
530
|
"source": "src/project_forge_deployment/teardown.py",
|
|
@@ -539,7 +549,7 @@
|
|
|
539
549
|
{
|
|
540
550
|
"source": "docs/DEVELOPER_ENVIRONMENTS.md",
|
|
541
551
|
"destination": "docs/project-forge/DEVELOPER_ENVIRONMENTS.md",
|
|
542
|
-
"sha256": "
|
|
552
|
+
"sha256": "cac10b7e30db24992225a88b43e16aa55404317c87a2ef136f21a2589ee4dc5f"
|
|
543
553
|
},
|
|
544
554
|
{
|
|
545
555
|
"source": "docs/WORKSPACE_INSTANCES.md",
|
|
@@ -549,7 +559,7 @@
|
|
|
549
559
|
{
|
|
550
560
|
"source": "docs/ENVIRONMENT_PROOF.md",
|
|
551
561
|
"destination": "docs/project-forge/ENVIRONMENT_PROOF.md",
|
|
552
|
-
"sha256": "
|
|
562
|
+
"sha256": "2ce7225ad6166a4ee30f51ea67ec077de0c29ce3a5c39b4ff57bf11cbe25e927"
|
|
553
563
|
},
|
|
554
564
|
{
|
|
555
565
|
"source": "docs/images/developer-environment-journey.svg",
|
|
@@ -34,7 +34,9 @@ For deployment readiness, inspect existing non-secret configuration before askin
|
|
|
34
34
|
|
|
35
35
|
Shared managed code keeps its canonical owner. When a consumer contains `CORE_BASELINE.json` or `DEPLOYMENT_BASELINE.json`, treat those baselines as ownership evidence. A temporary edit to a shared-managed consumer file may be used to diagnose or prove a reusable defect, but it is not the canonical deliverable.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
When reusable Project Forge drift is detected, distinguish unexplained drift from an explained temporary upstream proof. Unexplained managed drift remains fail-closed before delivery writes. For explained drift, route through `/upstream-fix`, preserve `.project-forge/UPSTREAM_FIX_HANDOFF.md`, and offer one explicit `Continue consumer work with acknowledged Project Forge drift` override when the current work can proceed without committing the managed workaround. That override is session/work-item continuation authority only; it does not authorize committing shared-managed paths, editing baselines, bypassing required CI/policy, or claiming that the canonical fix has been adopted.
|
|
38
|
+
|
|
39
|
+
After an accepted continuation override, do not repeatedly halt normal consumer implementation solely because the same documented managed workaround remains present. Keep the handoff and workaround unstaged. Before consumer `/deliver`, warn about the acknowledged drift, selectively stage only accepted consumer-owned changes, and disclose when local validation depended on the workaround. Required CI/policy remains authoritative. If the workaround is staged, appears in the proposed consumer commit/PR, no longer matches the handoff, or ownership becomes ambiguous, stop and re-evaluate.
|
|
38
40
|
|
|
39
41
|
Package-managed generated Projects use `/project-forge-update`. Direct `/core-sync` remains only for component-only Core consumers without `PROJECT_FORGE_BASELINE.json` and is not part of the normal greenfield Project command surface.
|
|
40
42
|
|
|
@@ -49,7 +49,7 @@ Do not synthesize or repair missing umbrella provenance by hand.
|
|
|
49
49
|
|
|
50
50
|
If `PROJECT_BOOTSTRAP.json` exists, treat it as approved generated-consumer provenance, not unrelated product data.
|
|
51
51
|
|
|
52
|
-
Before planning an update, require `generation.
|
|
52
|
+
Before planning an update, require `generation["project-forge"].package`, `generation["project-forge"].version`, and `generation["project-forge"].profile` to agree exactly with the installed `PROJECT_FORGE_BASELINE.json`. Require `generation["project-forge"].integrity` to be a non-empty exact registry integrity value for that installed package/version. Verify that integrity read-only from the registry when registry access is available.
|
|
53
53
|
|
|
54
54
|
If those values disagree before the update, report `GENERATED PROJECT FORGE METADATA DRIFT` and stop. Do not use `/project-forge-update` to silently reconcile an already-incoherent generated consumer.
|
|
55
55
|
|
|
@@ -117,7 +117,7 @@ A modified retired Core path is different: never auto-add `--accept-retired core
|
|
|
117
117
|
|
|
118
118
|
For a Bootstrap-generated consumer, also preview the companion generated-consumer changes:
|
|
119
119
|
|
|
120
|
-
- `PROJECT_BOOTSTRAP.json` keeps the same package/profile but changes `generation.
|
|
120
|
+
- `PROJECT_BOOTSTRAP.json` keeps the same package/profile but changes `generation["project-forge"].version` and `generation["project-forge"].integrity` to the exact reviewed target;
|
|
121
121
|
- generated package-verification surfaces should consume `PROJECT_BOOTSTRAP.json` dynamically when the accepted Bootstrap contract supports that form;
|
|
122
122
|
- a recognized older Bootstrap-generated verification block may be migrated only when its embedded old package/version/integrity exactly match the currently approved manifest metadata;
|
|
123
123
|
- an unrecognized or locally modified generated verification surface is a stop condition, not permission to reconstruct Bootstrap output by hand.
|
|
@@ -152,7 +152,7 @@ Choosing `Apply the exact Project Forge package update` authorizes only:
|
|
|
152
152
|
- creation/switch to one repository-appropriate short-lived update branch when needed;
|
|
153
153
|
- exact target package apply;
|
|
154
154
|
- removal of unchanged retired package-managed files that the reviewed preview classified as `REMOVE`;
|
|
155
|
-
- when `PROJECT_BOOTSTRAP.json` is present, update of its exact `generation.
|
|
155
|
+
- when `PROJECT_BOOTSTRAP.json` is present, update of its exact `generation["project-forge"].version` and `generation["project-forge"].integrity` to the reviewed target while preserving package/profile;
|
|
156
156
|
- migration of a recognized Bootstrap-generated package-verification block from duplicated current literals to the accepted manifest-driven form, only when the existing block still exactly matches the current approved metadata;
|
|
157
157
|
- package/baseline/generated-consumer verification;
|
|
158
158
|
- inspection of the resulting meaningful diff.
|
|
@@ -132,6 +132,8 @@ When application source/runtime exists, converge only the repository-owned local
|
|
|
132
132
|
|
|
133
133
|
Verify supported tools/versions using repository setup/doctor tooling when present. Run repository-defined dependency restore/setup commands when missing or stale. Preserve pinned versions and project conventions.
|
|
134
134
|
|
|
135
|
+
Treat **installation**, **version compatibility**, and **operational readiness** as separate evidence when tooling exposes those distinctions. A successful CLI/version probe does not prove that the backing service/runtime is operational. For Docker-based setup, do not call the runtime ready merely because `docker --version` succeeds; require the repository/doctor operational probe before relying on Docker Engine capability.
|
|
136
|
+
|
|
135
137
|
### B. Local persistence
|
|
136
138
|
|
|
137
139
|
For SQLite local development, resolve the project-owned database path and migration/initialization contract from repository evidence. Prefer installed Deployment Kit local SQLite ensure/status primitives when available.
|
|
@@ -244,6 +246,63 @@ For remote SSH preserve strict host identity. Unknown/changed host identity is a
|
|
|
244
246
|
|
|
245
247
|
Remote readiness does not require configuring Production when the selected environment is non-Production. Production classification remains project topology/policy, not a literal-name check.
|
|
246
248
|
|
|
249
|
+
### Guided remote failure recovery is part of `/setup`
|
|
250
|
+
|
|
251
|
+
A supported deterministic setup/readiness failure is not, by itself, the end of `/setup`. When installed Deployment Kit tooling returns structured diagnosis or a bounded next action, continue through that diagnosis automatically until one of these boundaries is reached:
|
|
252
|
+
|
|
253
|
+
- the failure is repaired through already-authorized routine setup work;
|
|
254
|
+
- a missing human fact is required;
|
|
255
|
+
- a separate write/Production/destructive authorization is required;
|
|
256
|
+
- a trusted-console or already-authorized administrative action is required;
|
|
257
|
+
- the capability is unsupported or remains blocked after bounded diagnosis.
|
|
258
|
+
|
|
259
|
+
Do **not** merely repeat an opaque subprocess exit code and tell the developer to fix access independently when deterministic diagnosis is available.
|
|
260
|
+
|
|
261
|
+
For SSH target-access failure, prefer the Deployment Kit's structured environment setup status/plan evidence. Preserve distinct categories such as:
|
|
262
|
+
|
|
263
|
+
```text
|
|
264
|
+
name resolution / address path
|
|
265
|
+
TCP reachability
|
|
266
|
+
host identity/trust
|
|
267
|
+
server-advertised authentication methods
|
|
268
|
+
configured identity fingerprint/offered key
|
|
269
|
+
local signing/passphrase/agent failure
|
|
270
|
+
remote public-key rejection
|
|
271
|
+
remote account/source-policy rejection
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Keep credentials, private keys, raw secure-prompt content, and unbounded SSH transcripts out of conversational diagnostics and journals.
|
|
275
|
+
|
|
276
|
+
If client-side evidence shows that the configured key reached the server but access is still rejected, stop reinstalling the same key. Route to a trusted target console or already-authorized administrative session to inspect effective account/source policy. Do not guess that `AllowUsers`, `AllowGroups`, PAM, or another server rule is the exact cause until server-side evidence establishes it.
|
|
277
|
+
|
|
278
|
+
### Gate password-assisted bootstrap on server capability
|
|
279
|
+
|
|
280
|
+
Before recommending a password-assisted/Home Lab bootstrap against a reachable server, use deterministic evidence of the server-advertised authentication methods when the installed Deployment Kit supports that probe.
|
|
281
|
+
|
|
282
|
+
- If password or keyboard-interactive authentication is not advertised, do not send the developer through a password bootstrap that cannot succeed.
|
|
283
|
+
- Route instead to strict key onboarding plus a trusted console/already-authorized session for any required server-side key/account-policy change.
|
|
284
|
+
- Never recommend enabling password SSH merely to make Project Forge onboarding work.
|
|
285
|
+
|
|
286
|
+
For Production-class environments, prefer the higher-assurance Strict onboarding path for new target trust/access unless the project/operator explicitly chooses a different supported security profile. Staging and other non-Production environments use the same target-access mechanics, with their own environment classification and authorization policy.
|
|
287
|
+
|
|
288
|
+
### Console-assisted recovery instructions
|
|
289
|
+
|
|
290
|
+
When a trusted-console action is required, optimize for reliable execution rather than dense shell snippets:
|
|
291
|
+
|
|
292
|
+
- one short command or one coherent semicolon-separated command per step;
|
|
293
|
+
- avoid unnecessary wildcards, escaping, and shell-specific quoting;
|
|
294
|
+
- say explicitly what the developer should run versus what output to return;
|
|
295
|
+
- state the expected evidence and the stop condition;
|
|
296
|
+
- use screenshot inspection when transcription is repeatedly failing.
|
|
297
|
+
|
|
298
|
+
Never silently edit `sshd`, widen account/source policy, disable host verification, or switch authentication policy merely to make setup pass.
|
|
299
|
+
|
|
300
|
+
### Treat target evidence and environment evidence separately
|
|
301
|
+
|
|
302
|
+
A verified workstation-to-target access relationship may be reused by multiple Projects/environments that bind to the same logical target. Environment proof remains specific to the Project + named environment + target + adapter/isolation contract.
|
|
303
|
+
|
|
304
|
+
When Staging and Production share one physical target, explicitly surface the shared failure domain and verify that their Project/environment-owned runtime identity, compose project, route/port allocation, persistence paths, and locking cannot collide. Staging evidence does not become Production evidence merely because the host is shared.
|
|
305
|
+
|
|
247
306
|
## 8. Prove supported remote mechanics with a disposable Project Forge probe
|
|
248
307
|
|
|
249
308
|
When the installed Deployment Kit exposes environment proof operations, a selected remote environment should normally be taken through an end-to-end **environment proof deployment** during setup.
|
|
@@ -276,6 +335,8 @@ For a Production-class environment, keep the proof explicitly labeled as a **PRO
|
|
|
276
335
|
|
|
277
336
|
If cleanup fails, report `PROOF PASSED — CLEANUP ACTION NEEDED`; do not claim a clean setup.
|
|
278
337
|
|
|
338
|
+
When installed Deployment Kit provides a durable local proof receipt or equivalent discoverable evidence, record/reuse it rather than relying on chat history. Reuse only while its target binding, host identity, workstation identity, adapter/provenance, logical environment, and cleanup result remain applicable. A new chat alone must not invalidate valid machine evidence.
|
|
339
|
+
|
|
279
340
|
## 9. `repair` is bounded and fail-closed
|
|
280
341
|
|
|
281
342
|
`/setup repair` may re-run safe deterministic setup/readiness operations after classifying the blocker. It may create missing local directories/caches, restore dependencies, rebuild outputs, create a new owned local database, run normal forward initialization, or recreate an owned disposable/local runtime when the repository contract permits those actions.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upstream-fix
|
|
3
|
-
description: Route reusable bugs discovered in a consumer to the canonical shared repository, allow bounded upstream implementation,
|
|
3
|
+
description: Route reusable bugs discovered in a consumer to the canonical shared repository, allow bounded upstream implementation, preserve a portable handoff, and let consumer work continue with explicitly acknowledged temporary Project Forge drift.
|
|
4
4
|
argument-hint: "[optional problem summary]"
|
|
5
5
|
user-invocable: true
|
|
6
6
|
disable-model-invocation: true
|
|
@@ -15,8 +15,10 @@ The governing rule is:
|
|
|
15
15
|
```text
|
|
16
16
|
discover in consumer
|
|
17
17
|
→ diagnose/prove in consumer
|
|
18
|
-
→
|
|
19
|
-
→
|
|
18
|
+
→ classify canonical owner
|
|
19
|
+
→ preserve a portable upstream handoff
|
|
20
|
+
→ optionally continue consumer work with acknowledged temporary drift
|
|
21
|
+
→ fix/deliver in owning canonical repository
|
|
20
22
|
→ adopt through the consumer's recorded distribution boundary
|
|
21
23
|
→ verify again in consumer
|
|
22
24
|
```
|
|
@@ -29,10 +31,11 @@ Invoking `/upstream-fix` authorizes:
|
|
|
29
31
|
|
|
30
32
|
- read-only ownership/provenance inspection in the consumer;
|
|
31
33
|
- classification to the smallest canonical owner;
|
|
34
|
+
- creation/update of the ignored local handoff artifact `.project-forge/UPSTREAM_FIX_HANDOFF.md`;
|
|
32
35
|
- inspection of already-available local canonical repository candidates;
|
|
33
36
|
- when ownership and the bounded patch are clear and a canonical checkout is safe, routine creation/use of one short-lived canonical work branch and application of only that bounded fix plus focused tests/docs.
|
|
34
37
|
|
|
35
|
-
Invocation does **not** authorize commit, push, PR creation, merge, release publication, package publication, deployment, rewriting/discarding consumer work,
|
|
38
|
+
Invocation does **not** authorize commit, push, PR creation, merge, release publication, package publication, deployment, rewriting/discarding consumer work, changing multiple canonical repositories in one bounded fix, or committing a temporary shared-managed consumer workaround.
|
|
36
39
|
|
|
37
40
|
Normal review and `/deliver` occur later while focused on the owning canonical repository.
|
|
38
41
|
|
|
@@ -99,7 +102,7 @@ Owner: package/platform repository supported by evidence
|
|
|
99
102
|
|
|
100
103
|
If the package payload is correct but generation/publication/orchestration materializes it incorrectly, classify Bootstrap/control-plane ownership from evidence rather than patching a generated consumer.
|
|
101
104
|
|
|
102
|
-
If ownership is genuinely ambiguous,
|
|
105
|
+
If ownership is genuinely ambiguous, report `UPSTREAM OWNER UNCLEAR`. Preserve the observed evidence in the handoff artifact, but do not write to multiple repositories speculatively.
|
|
103
106
|
|
|
104
107
|
## 4. Temporary consumer proof
|
|
105
108
|
|
|
@@ -111,12 +114,95 @@ Report it explicitly:
|
|
|
111
114
|
TEMPORARY SHARED-MANAGED PROOF
|
|
112
115
|
Consumer path: <path>
|
|
113
116
|
Canonical owner: <repo>
|
|
114
|
-
Do not deliver this consumer copy.
|
|
117
|
+
Do not deliver this consumer copy as product code.
|
|
115
118
|
```
|
|
116
119
|
|
|
117
120
|
Do not silently discard the proof and do not stage/commit it as ordinary consumer implementation.
|
|
118
121
|
|
|
119
|
-
## 5.
|
|
122
|
+
## 5. Preserve a portable handoff
|
|
123
|
+
|
|
124
|
+
Once a likely shared owner exists, create or refresh:
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
.project-forge/UPSTREAM_FIX_HANDOFF.md
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
This file is workstation/session evidence for transfer into ChatGPT or another canonical-owner workspace. It is not product documentation and must remain unstaged/uncommitted. Generated Project Forge projects normally ignore `.project-forge/`; if repository policy does not ignore it, keep the handoff out of the consumer delivery diff.
|
|
131
|
+
|
|
132
|
+
Include only observed/non-secret evidence:
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
# Project Forge Upstream Fix Handoff
|
|
136
|
+
|
|
137
|
+
## Consumer context
|
|
138
|
+
- Repository: <owner/repo or local identity>
|
|
139
|
+
- Branch/work item: <observed>
|
|
140
|
+
- Project Forge package/baseline: <observed version/commit/profile>
|
|
141
|
+
|
|
142
|
+
## Classification
|
|
143
|
+
- Owner: <Core | Deployment Kit | Platform | Bootstrap | Control Plane | unclear>
|
|
144
|
+
- Canonical repository: <repo when known>
|
|
145
|
+
- Managed consumer paths involved: <paths>
|
|
146
|
+
|
|
147
|
+
## Problem
|
|
148
|
+
<concise symptom and expected behavior>
|
|
149
|
+
|
|
150
|
+
## Reproduction
|
|
151
|
+
<minimal observed reproduction>
|
|
152
|
+
|
|
153
|
+
## Temporary consumer proof
|
|
154
|
+
- Status: <none | local proof present>
|
|
155
|
+
- Paths: <paths>
|
|
156
|
+
- Diff summary: <summary, not secrets>
|
|
157
|
+
- Validation: <observed checks>
|
|
158
|
+
|
|
159
|
+
## Recommended upstream scope
|
|
160
|
+
<smallest reusable change and focused regression coverage>
|
|
161
|
+
|
|
162
|
+
## Adoption boundary
|
|
163
|
+
<package release / component sync / regeneration / other evidence-backed path>
|
|
164
|
+
|
|
165
|
+
## Consumer continuation
|
|
166
|
+
- Override: <not requested | accepted>
|
|
167
|
+
- Managed workaround must remain unstaged/uncommitted: yes
|
|
168
|
+
- Known dependency of current consumer checks on workaround: <yes/no/unknown>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The handoff is useful even when a canonical checkout is unavailable or the upstream fix will be handled later.
|
|
172
|
+
|
|
173
|
+
## 6. Consumer continuation override
|
|
174
|
+
|
|
175
|
+
A reusable-platform defect is **not automatically a reason to halt the consumer work item**.
|
|
176
|
+
|
|
177
|
+
After classification/handoff, when the current consumer work can still proceed without committing the temporary shared-managed workaround, present one bounded single-select choice through the host-native question UI when available:
|
|
178
|
+
|
|
179
|
+
- `Continue consumer work with acknowledged Project Forge drift` — permits the current consumer session/work item to continue while the shared-managed workaround remains local and excluded from delivery. **RECOMMENDED** when the workaround is isolated and continuing will produce useful consumer-owned work.
|
|
180
|
+
- `Resolve the upstream fix now` — switch focus to the canonical owner and continue the upstream workflow.
|
|
181
|
+
- `Stop here` — preserve state without further writes.
|
|
182
|
+
|
|
183
|
+
Use a numbered text list only when native structured choice UI is unavailable.
|
|
184
|
+
|
|
185
|
+
Selecting the continuation option means:
|
|
186
|
+
|
|
187
|
+
```text
|
|
188
|
+
PROJECT FORGE DRIFT OVERRIDE ACCEPTED
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Record that choice in `.project-forge/UPSTREAM_FIX_HANDOFF.md` and continue normal consumer implementation. Do not repeatedly ask the same override question in the same unchanged session/work-item state.
|
|
192
|
+
|
|
193
|
+
The override authorizes **continuation only**. It does not authorize:
|
|
194
|
+
|
|
195
|
+
- staging/committing/pushing shared-managed drift;
|
|
196
|
+
- editing baselines to bless the drift;
|
|
197
|
+
- bypassing required CI, Reviewer, merge, release, or Production gates;
|
|
198
|
+
- destructive cleanup of the workaround;
|
|
199
|
+
- claiming the consumer has adopted the canonical fix.
|
|
200
|
+
|
|
201
|
+
If consumer-owned implementation genuinely cannot be separated from the modified managed file, report that dependency clearly. The human may still continue exploratory/product work under the override, but normal delivery can only stage consumer-owned paths and required CI/policy may still fail until the upstream fix is distributed.
|
|
202
|
+
|
|
203
|
+
Unexplained managed drift, suspected secrets, ambiguous ownership, or a staged/shared-managed workaround remains a stop condition until classified or removed from the proposed consumer delivery scope.
|
|
204
|
+
|
|
205
|
+
## 7. Resolve a safe canonical checkout
|
|
120
206
|
|
|
121
207
|
For the classified owner consider, in order:
|
|
122
208
|
|
|
@@ -128,7 +214,9 @@ Do not broadly scan the filesystem and do not clone automatically merely to cont
|
|
|
128
214
|
|
|
129
215
|
A candidate is safe only when it is the expected repository, has no merge/rebase/cherry-pick in progress, has no unrelated local work, and does not require stash/reset/rebase/force/discard operations.
|
|
130
216
|
|
|
131
|
-
|
|
217
|
+
If no safe canonical checkout is available, the handoff plus continuation override is a valid outcome; do not block consumer implementation solely because canonical work cannot start immediately.
|
|
218
|
+
|
|
219
|
+
## 8. Port the bounded fix upstream
|
|
132
220
|
|
|
133
221
|
When a safe canonical checkout exists and the equivalent reusable fix is clear:
|
|
134
222
|
|
|
@@ -141,9 +229,9 @@ When a safe canonical checkout exists and the equivalent reusable fix is clear:
|
|
|
141
229
|
7. run relevant local checks;
|
|
142
230
|
8. show the meaningful canonical diff and observed validation.
|
|
143
231
|
|
|
144
|
-
If the consumer proof cannot be generalized safely,
|
|
232
|
+
If the consumer proof cannot be generalized safely, reclassify and update the handoff rather than forcing it upstream.
|
|
145
233
|
|
|
146
|
-
##
|
|
234
|
+
## 9. Handoff to canonical delivery
|
|
147
235
|
|
|
148
236
|
When the upstream implementation is ready:
|
|
149
237
|
|
|
@@ -153,13 +241,16 @@ UPSTREAM FIX READY
|
|
|
153
241
|
Owner: <canonical repo>
|
|
154
242
|
Branch: <branch>
|
|
155
243
|
Consumer proof: <path/status>
|
|
244
|
+
Portable handoff: .project-forge/UPSTREAM_FIX_HANDOFF.md
|
|
156
245
|
Validation: <observed checks>
|
|
157
246
|
Next: focus the canonical repository and run /deliver
|
|
158
247
|
```
|
|
159
248
|
|
|
160
249
|
`/upstream-fix` does not commit/push/open/merge the canonical PR itself.
|
|
161
250
|
|
|
162
|
-
|
|
251
|
+
If the consumer continuation override was accepted, returning to consumer work does not wait for canonical delivery unless current work truly requires the distributed fix.
|
|
252
|
+
|
|
253
|
+
## 10. Adopt the accepted fix through the right boundary
|
|
163
254
|
|
|
164
255
|
After the canonical PR is merged and required default-branch CI is green, re-read the consumer provenance before choosing adoption.
|
|
165
256
|
|
|
@@ -182,7 +273,8 @@ Until that package exists, report:
|
|
|
182
273
|
|
|
183
274
|
```text
|
|
184
275
|
PACKAGE RELEASE REQUIRED
|
|
185
|
-
|
|
276
|
+
Canonical consumer adoption requires a Project Forge package that contains the accepted upstream commit.
|
|
277
|
+
Consumer work may continue under an accepted drift override as long as shared-managed workaround paths remain outside consumer delivery.
|
|
186
278
|
```
|
|
187
279
|
|
|
188
280
|
Do not silently patch `PROJECT_FORGE_BASELINE.json`, `CORE_BASELINE.json`, or `DEPLOYMENT_BASELINE.json` to pretend the package contains the new component.
|
|
@@ -199,15 +291,40 @@ A Deployment-owned fix may return through the canonical Deployment Kit component
|
|
|
199
291
|
|
|
200
292
|
Validate through that platform's canonical regeneration/update path, never by manually editing generated managed files.
|
|
201
293
|
|
|
202
|
-
Then rerun the original reproduction and baseline checks in the consumer.
|
|
294
|
+
Then rerun the original reproduction and baseline checks in the consumer when adoption actually occurs.
|
|
295
|
+
|
|
296
|
+
## 11. Consumer delivery guard
|
|
297
|
+
|
|
298
|
+
Before consumer `/deliver`, distinguish **unexplained managed drift** from **explained/acknowledged temporary upstream proof**.
|
|
299
|
+
|
|
300
|
+
### Unexplained managed drift
|
|
301
|
+
|
|
302
|
+
If `/deliver` finds Core-, Deployment-, or Project Forge-package-managed drift with no matching upstream classification/handoff/override, stop before staging/commit/push and route through `/upstream-fix`.
|
|
303
|
+
|
|
304
|
+
### Explained drift with accepted continuation override
|
|
203
305
|
|
|
204
|
-
|
|
306
|
+
When `.project-forge/UPSTREAM_FIX_HANDOFF.md` records the current managed paths and the human accepted continuation for the unchanged issue:
|
|
307
|
+
|
|
308
|
+
1. warn prominently that Project Forge managed drift is still present;
|
|
309
|
+
2. keep all shared-managed drift and the handoff file unstaged/uncommitted;
|
|
310
|
+
3. selectively stage only the human-accepted consumer-owned implementation;
|
|
311
|
+
4. disclose in the PR body that local validation may have used an acknowledged Project Forge workaround when that is true;
|
|
312
|
+
5. proceed with normal PR/CI mechanics rather than hard-stopping solely because the local workaround exists.
|
|
313
|
+
|
|
314
|
+
Use a compact warning such as:
|
|
315
|
+
|
|
316
|
+
```text
|
|
317
|
+
PROJECT FORGE DRIFT WARNING
|
|
318
|
+
Upstream handoff: .project-forge/UPSTREAM_FIX_HANDOFF.md
|
|
319
|
+
Managed workaround: present locally, excluded from consumer delivery
|
|
320
|
+
Consumer delivery: continuing under accepted override
|
|
321
|
+
```
|
|
205
322
|
|
|
206
|
-
|
|
323
|
+
Required CI/policy remains authoritative. Do not waive a failing required check because the failure is caused by the absent upstream fix.
|
|
207
324
|
|
|
208
|
-
|
|
325
|
+
If any shared-managed path is already staged, appears in the proposed consumer commit/PR, no longer matches the handoff, or ownership becomes ambiguous, stop and re-evaluate before writing.
|
|
209
326
|
|
|
210
|
-
##
|
|
327
|
+
## 12. Boundaries
|
|
211
328
|
|
|
212
329
|
`/upstream-fix` never:
|
|
213
330
|
|
|
@@ -218,4 +335,6 @@ Consumer-owned changes may be delivered normally when managed baselines are clea
|
|
|
218
335
|
- auto-stashes, resets, rebases, force-pushes, or discards work;
|
|
219
336
|
- requires ordinary consumer users to clone shared repositories;
|
|
220
337
|
- treats a temporary managed consumer edit as a permanent fork;
|
|
221
|
-
- bypasses `PROJECT_FORGE_BASELINE.json` with component-only sync
|
|
338
|
+
- bypasses `PROJECT_FORGE_BASELINE.json` with component-only sync;
|
|
339
|
+
- treats the continuation override as authorization to commit shared-managed drift;
|
|
340
|
+
- treats the continuation override as a waiver of required CI or merge policy.
|