Repository navigation
Conversation
Bring paper.md in line with the code at v4.0.0: one resolver that returns each value with its source, class-first precedence, state resolution from the registered hierarchy only, resolved snapshots that keep what they were computed from, and the registered global state as the one holder of the global config. Replace code examples that used removed or misdescribed API, remove the zero-dependency claim and the feature table, and correct the repository URL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings
paper.mdin line with the code atv4.0.0(02393c4).mainis one commit ahead of the tag (e3b06bf, a coverage badge update that touches only.github/badges/coverage.svg), so the branch is based onmainand every claim was checked against the tag's source, which is identical. No library code changes. Paths below are undersrc/objectstate/unless they start withtests/,docs/or name another repository.Nothing was executed: no environment was created and neither the library nor its tests were run. Each name in the code examples was checked by reading the source for its existence, its import path and its signature (
ObjectState.__init__object_state.py:145,get_resolved_value:1187,get_provenance:1361,update_parameter:1045,dirty_fields:1984,type_for_path:537;ObjectStateRegistry.registerobject_state_registry.py:392,atomic:933,time_travel_back:2068;LazyDataclassFactory.make_lazy_simplelazy_factory.py:974,mark_global_config_type:382;set_base_config_typeconfig.py:21;set_global_configglobal_config.py:51; exports in__init__.py:55-122and:215-217). The examples were not run. Each follows a test in the repository, with the expected values taken from that test's assertions: the main example fromtests/test_resolved_values_follow_registered_ancestors.py:57-75, 137-151, 175-177, 336-348, the function example fromtests/test_callable_baseline.py:50-52, 73-77.Claim ledger
dill,pycodify,python-introspect)"__getattribute__interceptionNonefields resolve on attribute access"contextvarsfor thread-safe context management"contextvarsvariable"; the registry and the global config are per process and "the library does no locking"Lockin the packageResolvedField(value, source_scope, source_type)from the one resolverstate.get_parameter_with_provenance("sigma")returns(2.0, "step_config")state.get_provenance(path)returns(scope_id, source_type), orNonewhen the state sets the field itselfNoneget_provenanceinspectmodule"python-introspect(UnifiedParameterAnalyzer.analyze)gaussian_filter(image, sigma=None, preserve_range=None)python-introspect, not here)Nonesentinel works identically for function kwargs: unset parameters inherit from the context hierarchy"; "function parameters participate in the same dual-axis inheritance"; "A user can set a global default forsigma, override it per-pipeline, and override it again per-step"NonestaysNone. Inheritance applies to fields of lazy dataclasses"with config_context(global_cfg): with config_context(pipeline_cfg): ... state = ObjectState(step, scope_id="/step_0"), implying the entered contexts feed the stateconfig_contextis set aside. The example now registers a plate state and reads a step state below itresolve_with_provenance(StepConfig, "batch_size")givesscope="/pipeline"scope_idis reported with source scopeNone; the example no longer shows this call, the prose gives the return type"/step_0","/plate::step_0::func_0"::; a leading/is not a hierarchy. Examples use"plate","plate::step"print(step.batch_size) # 64 (restored)aftertime_travel_back()update_parameteredits the state's working copy, not the wrapped object, so the object's attribute never changed. The example readsstate.get_resolved_valueset_base_config_type, and a global configRuntimeError: Base config type not set)mobxpackage declares no dependencies). "Zero dependencies: ObjectState yes" is false (see 3)mobxjs/mobxpackages/mobx/package.json; pyproject.toml:26-30IDSIA/sacredREADME ("Config Scopes", "Config Injection", "Observers")LazyDefaultPlaceholderServiceformats the value a lazy instance resolves; provenance is not involvednum_workers=8,output_dir="/results",compression="gzip",sigma=2.0openhcs/pyqt_gui/app.py:245-249,openhcs/authoring/session/pipelines.py:76-90, 192, 375-379get_provenanceto find the source"widgets/shared/clickable_help_components.py:533widgets/time_travel.py:54-57repository-code: https://github.com/trissim/objectstatehttps://github.com/OpenHCSDev/ObjectState. The old URL is a separate repository last pushed 2026-01-12, not a redirectgh api repos/trissim/ObjectState; pyproject.toml:49-51git logtrailers onmain19 claims false, misleading, misattributed or stale (2, 3, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 24, 25, 27, 31, 34, 35, 36); 8 unverifiable and removed or narrowed (5, 12, 14, 23, 26, 29, 30, and the external cells of 24).
New statements
resolve_with_provenancereturnsResolvedField(value, source_scope, source_type); one function walks layers and classes (_resolve_in_layers); lazy attribute access takes.valueof the same result andObjectStateunpacks all three. dual_axis_resolver.py:19-32, 114-150, 153-205; lazy_factory.py:617-620, 652; object_state.py:1877, 2222.ResolutionSources; every resolved read compares them by identity and resolves again only the unset fields that can inherit a differing(config type, field), or every field when other scopes are registered. resolution_sources.py:36-83, 86-128; object_state.py:724-784, 834-855.config_context. lazy_factory.py:648-652; tests/test_resolved_values_follow_registered_ancestors.py:849-865.""whose object is of that type; otherwise the object given toset_global_config; one per config type per process. global_config.py:1-25, 51-70, 83-96; object_state_registry.py:444-457; tests/test_one_holder_of_the_global_config.py:250-281.LockorRLockanywhere insrc/objectstate; docs/state_propagation.rst "Limits".For the owner
git log mainhasCo-Authored-By: Claudetrailers on 37 commits: Claude Sonnet 4.5 (4, 2025-12-27 to 2026-01-24), Claude Opus 4.5 (1, 2026-01-24), Claude Opus 5.5 (32, 2026-10-11 to 2026-10-12), plus two "Generated with Claude Code" bodies on 2025-12-27. The 4.0.0 design this paper now describes came in through those October commits (d85e69c,b5b06ab,472f82e,9e758b4). I replaced the sentence with one that says the commits carry these trailers and that this revision was made with Claude Opus 5.5. This is your attestation, not mine: please reword it as you see fit. JOSS asks for an accurate statement.ObjectStatefield resolution; I could not find it in this repository and did not describe it.pyproject.tomlon OpenHCSorigin/mainpinsobjectstate>=3.0.4,<4, andopenhcs/pyqt_gui/app.py:240still callsensure_global_config_context, which 4.0.0 removed. The Research Application section describes usage I read in that checkout (a global state registered at"", states per plate, pipeline, step and function, undo bound to the registry,get_provenanceread by pyqt-reactive). It makes no claim that OpenHCS runs 4.0.0.test_both_orders_of_building_give_the_same_readscovers). The first paragraph of Statement of Need (kept as written, with its citations). The relevance of@Claessen2000("Typed logical variables in Haskell", noted in the bib as a discussion of lazy evaluation) to lazy dataclass fields; the citation was kept where it was.https://objectstate.readthedocs.ioanswers with a redirect; I did not check what the hosted docs show for 4.0.0.date: 13 January 2026. You may want to update the date.paper.bibis unchanged. No reference was added.@Colvin2023(already in the bib,https://github.com/pydantic/pydantic-settings, confirmed to exist withgh api) is now cited; before, pydantic-settings appeared only as an uncited table column. All nine cited keys resolve. The bib holds 24 entries; 15 are not cited (16 before this change).wc -w paper.md: 1365 before, 1510 after (10.6% more, code included). The two added Design paragraphs (state resolution, the global config holder) account for the increase.🤖 Generated with Claude Code