@mriekki/project-forge 1.0.0 → 2.1.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.
@@ -1,54 +1,54 @@
1
- {
2
- "name": "greenfield-project",
3
- "schemaVersion": 1,
4
- "description": "Reusable deployment tooling for generated Project Forge projects.",
5
- "mappings": [
6
- {"source": "distribution/project-forge-deploy.py", "destination": "tools/project-forge-deployment/project-forge-deploy.py"},
7
- {"source": "src/project_forge_deployment/__init__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__init__.py"},
8
- {"source": "src/project_forge_deployment/__main__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__main__.py"},
9
- {"source": "src/project_forge_deployment/app_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_cli.py"},
10
- {"source": "src/project_forge_deployment/app_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime.py"},
11
- {"source": "src/project_forge_deployment/app_runtime_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_remote.py"},
12
- {"source": "src/project_forge_deployment/app_runtime_workstation.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_workstation.py"},
13
- {"source": "src/project_forge_deployment/box_platform.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform.py"},
14
- {"source": "src/project_forge_deployment/box_platform_assets.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_assets.py"},
15
- {"source": "src/project_forge_deployment/box_platform_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_remote.py"},
16
- {"source": "src/project_forge_deployment/cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/cli.py"},
17
- {"source": "src/project_forge_deployment/doctor.py", "destination": "tools/project-forge-deployment/project_forge_deployment/doctor.py"},
18
- {"source": "src/project_forge_deployment/entrypoint.py", "destination": "tools/project-forge-deployment/project_forge_deployment/entrypoint.py"},
19
- {"source": "src/project_forge_deployment/environment_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_cli.py"},
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/errors.py", "destination": "tools/project-forge-deployment/project_forge_deployment/errors.py"},
22
- {"source": "src/project_forge_deployment/home_lab.py", "destination": "tools/project-forge-deployment/project_forge_deployment/home_lab.py"},
23
- {"source": "src/project_forge_deployment/image_transfer.py", "destination": "tools/project-forge-deployment/project_forge_deployment/image_transfer.py"},
24
- {"source": "src/project_forge_deployment/keys.py", "destination": "tools/project-forge-deployment/project_forge_deployment/keys.py"},
25
- {"source": "src/project_forge_deployment/local_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_cli.py"},
26
- {"source": "src/project_forge_deployment/local_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_runtime.py"},
27
- {"source": "src/project_forge_deployment/local_spec.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_spec.py"},
28
- {"source": "src/project_forge_deployment/local_sqlite.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_sqlite.py"},
29
- {"source": "src/project_forge_deployment/portable_profile.py", "destination": "tools/project-forge-deployment/project_forge_deployment/portable_profile.py"},
30
- {"source": "src/project_forge_deployment/profile_migration.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_migration.py"},
31
- {"source": "src/project_forge_deployment/profile_repository.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_repository.py"},
32
- {"source": "src/project_forge_deployment/profiles.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profiles.py"},
33
- {"source": "src/project_forge_deployment/registry_access.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_access.py"},
34
- {"source": "src/project_forge_deployment/registry_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_cli.py"},
35
- {"source": "src/project_forge_deployment/route_registry.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry.py"},
36
- {"source": "src/project_forge_deployment/route_registry_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry_remote.py"},
37
- {"source": "src/project_forge_deployment/security.py", "destination": "tools/project-forge-deployment/project_forge_deployment/security.py"},
38
- {"source": "src/project_forge_deployment/sqlite_adapter.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter.py"},
39
- {"source": "src/project_forge_deployment/sqlite_adapter_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter_remote.py"},
40
- {"source": "src/project_forge_deployment/sqlite_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_cli.py"},
41
- {"source": "src/project_forge_deployment/sqlite_import_recovery.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_import_recovery.py"},
42
- {"source": "src/project_forge_deployment/ssh.py", "destination": "tools/project-forge-deployment/project_forge_deployment/ssh.py"},
43
- {"source": "src/project_forge_deployment/teardown.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown.py"},
44
- {"source": "src/project_forge_deployment/teardown_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_cli.py"},
45
- {"source": "src/project_forge_deployment/teardown_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_remote.py"},
46
- {"source": "src/project_forge_deployment/trust.py", "destination": "tools/project-forge-deployment/project_forge_deployment/trust.py"},
47
- {"source": "docs/DEVELOPER_ENVIRONMENTS.md", "destination": "docs/project-forge/DEVELOPER_ENVIRONMENTS.md"},
48
- {"source": "docs/WORKSPACE_INSTANCES.md", "destination": "docs/project-forge/WORKSPACE_INSTANCES.md"},
49
- {"source": "docs/ENVIRONMENT_PROOF.md", "destination": "docs/project-forge/ENVIRONMENT_PROOF.md"},
50
- {"source": "docs/images/developer-environment-journey.svg", "destination": "docs/project-forge/images/developer-environment-journey.svg"},
51
- {"source": "docs/images/personal-environment-architecture.svg", "destination": "docs/project-forge/images/personal-environment-architecture.svg"},
52
- {"source": "docs/images/poc-environment-model.svg", "destination": "docs/project-forge/images/poc-environment-model.svg"}
53
- ]
54
- }
1
+ {
2
+ "name": "greenfield-project",
3
+ "schemaVersion": 1,
4
+ "description": "Reusable deployment tooling for generated Project Forge projects.",
5
+ "mappings": [
6
+ {"source": "distribution/project-forge-deploy.py", "destination": "tools/project-forge-deployment/project-forge-deploy.py"},
7
+ {"source": "src/project_forge_deployment/__init__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__init__.py"},
8
+ {"source": "src/project_forge_deployment/__main__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__main__.py"},
9
+ {"source": "src/project_forge_deployment/app_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_cli.py"},
10
+ {"source": "src/project_forge_deployment/app_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime.py"},
11
+ {"source": "src/project_forge_deployment/app_runtime_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_remote.py"},
12
+ {"source": "src/project_forge_deployment/app_runtime_workstation.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_workstation.py"},
13
+ {"source": "src/project_forge_deployment/box_platform.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform.py"},
14
+ {"source": "src/project_forge_deployment/box_platform_assets.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_assets.py"},
15
+ {"source": "src/project_forge_deployment/box_platform_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_remote.py"},
16
+ {"source": "src/project_forge_deployment/cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/cli.py"},
17
+ {"source": "src/project_forge_deployment/doctor.py", "destination": "tools/project-forge-deployment/project_forge_deployment/doctor.py"},
18
+ {"source": "src/project_forge_deployment/entrypoint.py", "destination": "tools/project-forge-deployment/project_forge_deployment/entrypoint.py"},
19
+ {"source": "src/project_forge_deployment/environment_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_cli.py"},
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/errors.py", "destination": "tools/project-forge-deployment/project_forge_deployment/errors.py"},
22
+ {"source": "src/project_forge_deployment/home_lab.py", "destination": "tools/project-forge-deployment/project_forge_deployment/home_lab.py"},
23
+ {"source": "src/project_forge_deployment/image_transfer.py", "destination": "tools/project-forge-deployment/project_forge_deployment/image_transfer.py"},
24
+ {"source": "src/project_forge_deployment/keys.py", "destination": "tools/project-forge-deployment/project_forge_deployment/keys.py"},
25
+ {"source": "src/project_forge_deployment/local_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_cli.py"},
26
+ {"source": "src/project_forge_deployment/local_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_runtime.py"},
27
+ {"source": "src/project_forge_deployment/local_spec.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_spec.py"},
28
+ {"source": "src/project_forge_deployment/local_sqlite.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_sqlite.py"},
29
+ {"source": "src/project_forge_deployment/portable_profile.py", "destination": "tools/project-forge-deployment/project_forge_deployment/portable_profile.py"},
30
+ {"source": "src/project_forge_deployment/profile_migration.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_migration.py"},
31
+ {"source": "src/project_forge_deployment/profile_repository.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_repository.py"},
32
+ {"source": "src/project_forge_deployment/profiles.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profiles.py"},
33
+ {"source": "src/project_forge_deployment/registry_access.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_access.py"},
34
+ {"source": "src/project_forge_deployment/registry_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_cli.py"},
35
+ {"source": "src/project_forge_deployment/route_registry.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry.py"},
36
+ {"source": "src/project_forge_deployment/route_registry_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry_remote.py"},
37
+ {"source": "src/project_forge_deployment/security.py", "destination": "tools/project-forge-deployment/project_forge_deployment/security.py"},
38
+ {"source": "src/project_forge_deployment/sqlite_adapter.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter.py"},
39
+ {"source": "src/project_forge_deployment/sqlite_adapter_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter_remote.py"},
40
+ {"source": "src/project_forge_deployment/sqlite_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_cli.py"},
41
+ {"source": "src/project_forge_deployment/sqlite_import_recovery.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_import_recovery.py"},
42
+ {"source": "src/project_forge_deployment/ssh.py", "destination": "tools/project-forge-deployment/project_forge_deployment/ssh.py"},
43
+ {"source": "src/project_forge_deployment/teardown.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown.py"},
44
+ {"source": "src/project_forge_deployment/teardown_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_cli.py"},
45
+ {"source": "src/project_forge_deployment/teardown_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_remote.py"},
46
+ {"source": "src/project_forge_deployment/trust.py", "destination": "tools/project-forge-deployment/project_forge_deployment/trust.py"},
47
+ {"source": "docs/DEVELOPER_ENVIRONMENTS.md", "destination": "docs/project-forge/DEVELOPER_ENVIRONMENTS.md"},
48
+ {"source": "docs/WORKSPACE_INSTANCES.md", "destination": "docs/project-forge/WORKSPACE_INSTANCES.md"},
49
+ {"source": "docs/ENVIRONMENT_PROOF.md", "destination": "docs/project-forge/ENVIRONMENT_PROOF.md"},
50
+ {"source": "docs/images/developer-environment-journey.svg", "destination": "docs/project-forge/images/developer-environment-journey.svg"},
51
+ {"source": "docs/images/personal-environment-architecture.svg", "destination": "docs/project-forge/images/personal-environment-architecture.svg"},
52
+ {"source": "docs/images/poc-environment-model.svg", "destination": "docs/project-forge/images/poc-environment-model.svg"}
53
+ ]
54
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@mriekki/project-forge",
4
- "version": "1.0.0",
4
+ "version": "2.1.0",
5
5
  "components": {
6
6
  "core": {
7
7
  "repository": "mriekki/project-forge-core",
8
- "commit": "78065f0ab59506e8cc703f6bf7dfd31fc71f313f",
9
- "version": "2.0.0",
8
+ "commit": "fd071b9516cb40093f30be41ab695139eb16bb4c",
9
+ "version": "3.3.0",
10
10
  "distribution": "greenfield-workspace",
11
11
  "files": [
12
12
  {
@@ -62,12 +62,32 @@
62
62
  {
63
63
  "source": "core/skills/setup/SKILL.md",
64
64
  "destination": ".github/skills/setup/SKILL.md",
65
- "sha256": "a3f3fae1962cdc3ed844a14fe5578d8e9769c850d6c34ba0948efb33b0eb643c"
65
+ "sha256": "e700e914afc291ffb1153bb796a8ef150c624c5b54032e29d3abda221260285f"
66
+ },
67
+ {
68
+ "source": "core/skills/build/SKILL.md",
69
+ "destination": ".github/skills/build/SKILL.md",
70
+ "sha256": "0659ad88cac5ca652eedba648d10a39ca1d51d65db638ce41b392067a3fd6128"
71
+ },
72
+ {
73
+ "source": "core/skills/run/SKILL.md",
74
+ "destination": ".github/skills/run/SKILL.md",
75
+ "sha256": "6bdf23f46609d1b85147347d313d7c4bf13bd8bfc91d4b782fc7a311189ffbe3"
76
+ },
77
+ {
78
+ "source": "core/skills/export-requirements/SKILL.md",
79
+ "destination": ".github/skills/export-requirements/SKILL.md",
80
+ "sha256": "6ef2675eafdbcc809f6fb9533ab41ff032a1f3ff4789b1d5825d27cf696d0715"
81
+ },
82
+ {
83
+ "source": "core/skills/replatform/SKILL.md",
84
+ "destination": ".github/skills/replatform/SKILL.md",
85
+ "sha256": "86e17bf376f395e5f5f018d8def7f5d99b9f4baef30c0b1d20f5caaac5c993c8"
66
86
  },
67
87
  {
68
88
  "source": "core/skills/progress/SKILL.md",
69
89
  "destination": ".github/skills/progress/SKILL.md",
70
- "sha256": "c06a899fb3729534203eee49f61e38f599d96eb10d711d95c47e94dd4fdf1fef"
90
+ "sha256": "7c9524859f4683feee2e8fac33ef3aa24f2b7b38099a37c3b65eb746aaba7391"
71
91
  },
72
92
  {
73
93
  "source": "core/skills/next-step/SKILL.md",
@@ -92,7 +112,7 @@
92
112
  {
93
113
  "source": "core/skills/project-forge-update/SKILL.md",
94
114
  "destination": ".github/skills/project-forge-update/SKILL.md",
95
- "sha256": "47a939f56370b946d186288a8556e0bb630b555e9a63c7db6166924fdffe046b"
115
+ "sha256": "70170e57a77f143c719a8c349161c580e339397e782d28133d9f3734f6625847"
96
116
  },
97
117
  {
98
118
  "source": "core/skills/core-sync/SKILL.md",
@@ -112,22 +132,22 @@
112
132
  {
113
133
  "source": "core/skills/developer-env-mode/SKILL.md",
114
134
  "destination": ".github/skills/developer-env-mode/SKILL.md",
115
- "sha256": "74ba23df627300131ce9d6162fc67e922841ef5f98182bca1a1cc8b0190982dd"
135
+ "sha256": "2e45e00e30f17edda5b259bd24852233d2bcace46f7e095d3b28faf9ce35cedb"
116
136
  },
117
137
  {
118
138
  "source": "core/skills/deployment-readiness/SKILL.md",
119
139
  "destination": ".github/skills/deployment-readiness/SKILL.md",
120
- "sha256": "dfde7006be24ed1bcbff13dc70e9b6b7d9b3b907bbae7aa26530393c6c9573f6"
140
+ "sha256": "846ddacc3f9acaecfce3ba62a6c1eb01149f1afd1013e307a81dc65e1351cbc4"
121
141
  },
122
142
  {
123
143
  "source": "core/skills/deploy/SKILL.md",
124
144
  "destination": ".github/skills/deploy/SKILL.md",
125
- "sha256": "cddf03ae08045d5d42701d4095752d55316d2532e8a3c804c6c769dedf31eb60"
145
+ "sha256": "7bacd366014bf8c890328ec2b78412a39a0abff2f6b44dd53ca129102a7a30c8"
126
146
  },
127
147
  {
128
148
  "source": "core/skills/tear-down/SKILL.md",
129
149
  "destination": ".github/skills/tear-down/SKILL.md",
130
- "sha256": "36d5e0ef56173d85dc326a4afc12ddd26b65e70d419dceef728cccaa837df058"
150
+ "sha256": "5fcda93f4a0d1eca76a8a753f340fcb1799bddfe515324493e7d910f1c2253a3"
131
151
  },
132
152
  {
133
153
  "source": "core/skills/coach/SKILL.md",
@@ -212,13 +232,28 @@
212
232
  {
213
233
  "source": "core/process/PROJECT_FORGE_ENGINEERING_GUIDE.md",
214
234
  "destination": "docs/project-forge/PROJECT_FORGE_ENGINEERING_GUIDE.md",
215
- "sha256": "4db0d0f7ba21e8d8a36ada3fbe392fc2f7e38af377bbbe023996f40d827af97e"
235
+ "sha256": "431eb3af7593f5f79f74ffdd306f56b5249a632c480fd6c3e5f0223161d376d9"
216
236
  },
217
237
  {
218
238
  "source": "core/process/SETUP_ACCEPTANCE_CHECKLIST.md",
219
239
  "destination": "docs/process/SETUP_ACCEPTANCE_CHECKLIST.md",
220
240
  "sha256": "b5f8b39de15b464a1c80b26a6c150c6d2a363751abc05d33df4cebcad6b49d9b"
221
241
  },
242
+ {
243
+ "source": "core/process/OPERATION_JOURNAL.md",
244
+ "destination": "docs/process/OPERATION_JOURNAL.md",
245
+ "sha256": "16e2d502d7b0f923b4ea2e34bdcaaed73cdc0933fd6ef54a1278dd25f25b5140"
246
+ },
247
+ {
248
+ "source": "core/process/PROJECT_REQUIREMENTS_EXPORT.md",
249
+ "destination": "docs/process/PROJECT_REQUIREMENTS_EXPORT.md",
250
+ "sha256": "6ef9ecf1bb7c86b5f445554f5e630db36beee34bead2db8ff2597c148fba9c30"
251
+ },
252
+ {
253
+ "source": "core/process/APPLICATION_VERSIONING.md",
254
+ "destination": "docs/process/APPLICATION_VERSIONING.md",
255
+ "sha256": "846abd1085501bebf3ffd8025f875dcf2bfb3f57e67110e684c605ae11c3246b"
256
+ },
222
257
  {
223
258
  "source": "core/templates/PULL_REQUEST_TEMPLATE.md",
224
259
  "destination": ".github/PULL_REQUEST_TEMPLATE.md",
@@ -0,0 +1,137 @@
1
+ # Project Forge Application Versioning
2
+
3
+ Every Project Forge application must implement a real runtime version identity. A static label that never changes across builds is not sufficient.
4
+
5
+ ## Contract
6
+
7
+ Application versioning has two layers:
8
+
9
+ 1. **release version** — a deliberate Semantic Version such as `0.1.0` or `1.0.0`;
10
+ 2. **build identity** — automatically derived evidence that identifies the exact built artifact.
11
+
12
+ The normal human-readable form is intentionally simple:
13
+
14
+ ```text
15
+ v1.0.0 (build 142)
16
+ ```
17
+
18
+ The machine/informational form may carry richer provenance:
19
+
20
+ ```text
21
+ 1.0.0+build.142.sha.a1b2c3d
22
+ ```
23
+
24
+ A build record should expose equivalent fields when available:
25
+
26
+ ```text
27
+ releaseVersion: 1.0.0
28
+ buildNumber: 142
29
+ commit: a1b2c3d
30
+ builtAtUtc: 2026-10-21T20:15:00Z
31
+ informationalVersion: 1.0.0+build.142.sha.a1b2c3d
32
+ displayVersion: v1.0.0 (build 142)
33
+ ```
34
+
35
+ ## Release version
36
+
37
+ Use Semantic Versioning (`MAJOR.MINOR.PATCH`) for the application release version.
38
+
39
+ Recommended default for a new project under active development:
40
+
41
+ ```text
42
+ 0.1.0
43
+ ```
44
+
45
+ Promote deliberately. The first accepted V1 release may become `1.0.0`; later major/minor/patch changes follow the project's release policy.
46
+
47
+ The release version is expected to remain stable across multiple development builds. It must not be bumped merely to create a unique build identity.
48
+
49
+ Use one stack-native authoritative source for the release version. Do not maintain unrelated duplicated constants or decorative `VERSION.md` values that can drift from the built application.
50
+
51
+ ## Build identity
52
+
53
+ A releasable CI-built artifact must receive an automatically derived build identity.
54
+
55
+ Preferred evidence:
56
+
57
+ - monotonically increasing CI/build sequence number;
58
+ - exact source commit, with a short commit acceptable for display and the full commit retained in machine evidence when practical;
59
+ - UTC build timestamp as supplemental evidence.
60
+
61
+ The canonical informational form is conceptually:
62
+
63
+ ```text
64
+ <releaseVersion>+build.<buildNumber>.sha.<shortCommit>
65
+ ```
66
+
67
+ A timestamp may be appended as metadata, but a date alone should not replace a sequencing value when the build system can provide a monotonic run/build number.
68
+
69
+ For local developer builds where no CI build number exists, use an explicitly non-release identity such as:
70
+
71
+ ```text
72
+ 0.1.0+local.20261021T201500Z.sha.a1b2c3d
73
+ ```
74
+
75
+ Do not invent a CI/release build number for a local build.
76
+
77
+ ## Runtime exposure
78
+
79
+ The running application must make its effective version identity observable.
80
+
81
+ For applications with a user interface, expose a concise human-readable value in an appropriate low-noise surface such as About, Settings, diagnostics, or a footer:
82
+
83
+ ```text
84
+ v1.0.0 (build 142)
85
+ ```
86
+
87
+ Also provide machine-readable or diagnostic evidence when the stack/application shape supports it, for example:
88
+
89
+ - a version/info endpoint;
90
+ - CLI `--version` output;
91
+ - startup diagnostic metadata;
92
+ - an application metadata object consumed by the UI.
93
+
94
+ The display must be derived from the same build identity as the machine evidence rather than maintained as a separate hard-coded string.
95
+
96
+ ## Stack-specific implementation
97
+
98
+ The contract is stack-independent; the implementation is not.
99
+
100
+ Examples of appropriate stack-native sources include:
101
+
102
+ - .NET/Blazor/ASP.NET: project/package version plus assembly/informational version metadata;
103
+ - Node/React/Angular: package/project version plus build-time injected CI/commit metadata;
104
+ - Java/Spring: Maven/Gradle project version plus generated build metadata/resources.
105
+
106
+ These examples are implementation guidance, not a fixed technology requirement. Prefer the repository's native build/package mechanism.
107
+
108
+ ## Build and run helpers
109
+
110
+ `/build` should report the effective release/build identity when the selected build produces or exposes it.
111
+
112
+ `/run` should report the effective runtime version when the started application exposes it.
113
+
114
+ Neither helper should invent version information or mutate release version state merely to make version evidence appear.
115
+
116
+ ## Delivery and deployment
117
+
118
+ A deployable artifact should be traceable to one version identity and one source commit. Deployment evidence may record the version/build identity, but deployment must not silently rewrite it.
119
+
120
+ A release tag, GitHub release, package version, container tag, or deployment label does not substitute for runtime application version evidence unless the built application actually consumes that same authoritative version metadata.
121
+
122
+ ## Replatforming
123
+
124
+ Application versioning is a reusable engineering requirement, not a portable product requirement.
125
+
126
+ `PROJECT_REQUIREMENTS.json` therefore does not need to encode stack-specific version mechanics. A replatformed project must receive the current Project Forge application-versioning contract and implement it using the target stack's native facilities.
127
+
128
+ ## Acceptance
129
+
130
+ Application foundation is not complete until:
131
+
132
+ - one authoritative release version source exists;
133
+ - a build can derive a unique build identity without manually editing display text;
134
+ - the source commit is traceable from build evidence;
135
+ - a running application exposes the effective version in an appropriate human-readable form;
136
+ - release/CI builds use a real sequencing value when the CI system provides one;
137
+ - local builds are clearly distinguishable from release/CI builds.
@@ -0,0 +1,140 @@
1
+ # Project Forge Operation Journal
2
+
3
+ Project Forge uses local operation journals to preserve durable, workstation-local evidence for consequential deterministic operations without turning normal read-only guidance into noisy state.
4
+
5
+ ## Purpose
6
+
7
+ An operation journal answers:
8
+
9
+ - what deterministic operation ran;
10
+ - when it started and finished;
11
+ - which workspace/platform/provenance it used;
12
+ - which bounded steps ran and their outcomes;
13
+ - where a failure occurred;
14
+ - what final status was reached.
15
+
16
+ The journal is diagnostic evidence. It is not a second workflow database and it does not replace Git, GitHub, CI, deployment state, or human acceptance.
17
+
18
+ ## Location
19
+
20
+ Store local journals under the ignored Project Forge cache:
21
+
22
+ ```text
23
+ .project-forge/
24
+ logs/
25
+ <operation>/
26
+ <timestamp>-<run-id>.log
27
+ latest.log
28
+ ```
29
+
30
+ Examples:
31
+
32
+ ```text
33
+ .project-forge/logs/setup/2026-10-20T190523-0700-18432.log
34
+ .project-forge/logs/build/...
35
+ .project-forge/logs/run/...
36
+ .project-forge/logs/project-forge-update/...
37
+ .project-forge/logs/deployment-readiness/...
38
+ .project-forge/logs/deploy/...
39
+ .project-forge/logs/tear-down/...
40
+ ```
41
+
42
+ `latest.log` may be a copied summary/current run for convenience. Implementations must not depend on symlink support.
43
+
44
+ Operation journals are workstation-local and must remain ignored by Git. They are never part of `CORE_BASELINE.json`, `PROJECT_FORGE_BASELINE.json`, or application provenance.
45
+
46
+ ## Operations that should journal
47
+
48
+ Journal deterministic operations when durable local diagnostics materially help:
49
+
50
+ - `/setup` and repository-local setup/doctor execution;
51
+ - `/build` when build diagnostics/artifact evidence are useful;
52
+ - `/run` as a concise startup/health receipt when useful, not as an unbounded application log sink;
53
+ - `/project-forge-update` apply/verification work;
54
+ - `/developer-env-mode` when it mutates or converges local runtime state;
55
+ - `/deployment-readiness` when it performs preparation or repair;
56
+ - environment proof operations;
57
+ - `/deploy` and `/tear-down`;
58
+ - other bounded deterministic operations that mutate workstation or remote environment state.
59
+
60
+ `/deliver` may write a concise local receipt, but Git commits, PRs, CI, and merge history remain its authoritative durable evidence.
61
+
62
+ Read-only orientation normally does **not** create a journal:
63
+
64
+ - `/progress`;
65
+ - `/next-step`;
66
+ - `/wait-what`;
67
+ - read-only documentation/learning navigation;
68
+ - read-only status checks unless a caller explicitly requests troubleshooting evidence.
69
+
70
+ Remote GitHub Actions already retain their own workflow logs. Do not duplicate complete remote logs locally; record only the local request/provenance/result receipt when useful.
71
+
72
+ ## Minimum record
73
+
74
+ A journal should capture, when available:
75
+
76
+ ```text
77
+ operation
78
+ run identifier
79
+ started/finished timestamps
80
+ workspace root or project identity
81
+ platform/architecture
82
+ relevant Project Forge/Core/Bootstrap/Deployment provenance
83
+ step name
84
+ step status
85
+ resolved tool/version evidence
86
+ sanitized command identity
87
+ exit code
88
+ sanitized failure summary
89
+ final status
90
+ ```
91
+
92
+ For `/build`, include the requested target and explicit artifact/output paths when the repository build contract establishes them.
93
+
94
+ For `/run`, record only bounded startup evidence such as target, command identity, process/startup result, established local endpoint/health result, and stop guidance. Do not continuously tee long-running application output into the Project Forge journal.
95
+
96
+ Prefer stable event names and compact machine-readable fields inside a human-readable `.log`. JSON Lines is acceptable when the implementation already uses structured events.
97
+
98
+ At completion, report the journal path to the developer when the operation was consequential or when diagnostics were produced.
99
+
100
+ ## Security and privacy boundary
101
+
102
+ Operation journals are diagnostic artifacts, not raw transcripts.
103
+
104
+ Never log:
105
+
106
+ - passwords, PATs, API keys, access tokens, private SSH keys, or secret values;
107
+ - credential-manager contents;
108
+ - full process environment dumps;
109
+ - request/response bodies that may contain credentials;
110
+ - arbitrary stdin or secure-prompt contents;
111
+ - known-host private material or mutable application data merely for convenience.
112
+
113
+ Prefer allowlisted structured fields over blind stdout/stderr capture.
114
+
115
+ When command arguments or error text may contain secrets, redact before writing. Implementations should log a command identity such as executable + safe arguments, step name, return code, and a bounded sanitized failure summary rather than blindly teeing every subprocess byte.
116
+
117
+ A local journal must not weaken an existing secure prompt, credential boundary, or Human-in-the-Loop gate.
118
+
119
+ ## Lifecycle
120
+
121
+ For a mutating deterministic operation:
122
+
123
+ 1. create the journal before the first material mutation;
124
+ 2. record operation/provenance preflight;
125
+ 3. append bounded step outcomes as work proceeds;
126
+ 4. flush useful failure evidence before returning/raising;
127
+ 5. record one final state such as `READY`, `SUCCESS`, `DEFERRED`, `BLOCKED`, `FAILED`, or a domain-specific equivalent;
128
+ 6. refresh `latest.log` only after the run has a coherent record.
129
+
130
+ A failed operation keeps its timestamped journal. Do not erase failure evidence merely because a later retry succeeds.
131
+
132
+ ## Retention
133
+
134
+ Journals are disposable local diagnostics. Project Forge may prune old logs using a conservative size/count policy, but must preserve the current run while it is active and should retain enough recent history to diagnose repeated failures.
135
+
136
+ Do not silently upload operation journals to GitHub, ChatGPT, telemetry, or another machine. A developer may explicitly choose to share a relevant sanitized excerpt when troubleshooting.
137
+
138
+ ## Relationship to human acceptance
139
+
140
+ A successful journal entry is machine evidence only. It never marks editor/workspace acceptance, meaningful-diff acceptance, merge authorization, release publication, or production deployment approval on the human's behalf.
@@ -74,7 +74,7 @@ flowchart TB
74
74
 
75
75
  | Layer | Responsibility |
76
76
  | --- | --- |
77
- | POC Bootstrap | Discovery protocol, catalog/support states, approved `POC_BOOTSTRAP.json`, deployment topology intent, deterministic generation, setup/readiness helpers, work-item materialization. |
77
+ | POC Bootstrap | Discovery protocol, catalog/support states, approved `PROJECT_BOOTSTRAP.json`, deployment topology intent, deterministic generation, setup/readiness helpers, work-item materialization. |
78
78
  | Agentic Core | Reusable workflow behavior, agents/skills, Human-in-the-Loop gates, review/delivery semantics, learning flows, topology-aware deployment orchestration. |
79
79
  | Project Forge Platform | Consumer-facing `@mriekki/project-forge` package that assembles exact accepted reusable components and records provenance. |
80
80
  | Control Plane | GitHub App orchestration for target validation, short-lived scoped credentials, deterministic generation, and safe publication. |
@@ -130,7 +130,7 @@ flowchart LR
130
130
  DELIVER --> MERGE[Merge gate]
131
131
  ```
132
132
 
133
- 1. Human approves schema-v2 `POC_BOOTSTRAP.json` with initial work items and an exact `@mriekki/project-forge` package version/profile/integrity.
133
+ 1. Human approves schema-v2 `PROJECT_BOOTSTRAP.json` with initial work items and an exact `@mriekki/project-forge` package version/profile/integrity.
134
134
  2. The private target repository is seeded with only the approved manifest; a public Control Plane request identifies only the repository.
135
135
  3. The Control Plane validates the private seed, uses short-lived scoped credentials, obtains the exact package artifact, and verifies integrity before reusable target mutation.
136
136
  4. Bootstrap materializes project-owned content; the exact Project Forge package applies its reusable profile only after drift/collision preflight.
@@ -155,7 +155,7 @@ A project can be generated, set up, and accepted as an engineering workspace eve
155
155
  | Project definition | Materialized product scope, roadmap, approved work items, architecture/design context, deployment topology, and implementation/learning guidance. |
156
156
  | Setup + doctor | Workstation setup and readiness checks stay distinct from human editor/workspace acceptance. A deferred deployment target is not a failed development workspace. |
157
157
  | CI baseline | CI exists before substantive implementation and becomes reusable evidence throughout delivery. |
158
- | Provenance | `POC_BOOTSTRAP.json`, `PROJECT_FORGE_BASELINE.json`, component baselines, `DEV_ENVIRONMENT.json`, and `SCAFFOLD_PLAN.json` make generated state inspectable. |
158
+ | Provenance | `PROJECT_BOOTSTRAP.json`, `PROJECT_FORGE_BASELINE.json`, component baselines, `DEV_ENVIRONMENT.json`, and `SCAFFOLD_PLAN.json` make generated state inspectable. |
159
159
 
160
160
  **Important distinction:** machine success is evidence, not human acceptance. Setup and doctor checks can prove tools are ready; the human still decides whether the checkout is actually usable.
161
161